linpack实验:MPI性能参数调优
本次教程写的匆忙,也许会有很多勘误欢迎指正
性能优化部分
HPL.dat字段说明
在本实验中,为了不让生成的测试报告太复杂,让N=1,只测试一个矩阵
HPLinpack benchmark input file //说明性语句
Innovative Computing Laboratory, University of Tennessee //说明性语句
HPL.out output file name (if any) //输出文件名
6 device out (6=stdout,7=stderr,file) //选择输出方式
1 # of problems sizes (N) //要测试的矩阵个数
41448 Ns //不小于上一行的大小,Ns^2*64=节点内存*节点数*8,Ns=0.8~0.9D
//每节点有2G内存,4节点,Ns的算法为Ns^2*64=1024*1024*1024*2*4*8,-〉N=32000~33000,再*0.8~0.9即可
6 # of NBs //分块方法的种数
32 64 96 126 192 256 NBs //分块的大小用196,232,256效果比较好
0 PMAP process mapping (0=Row-,1=Column-major) //处理器阵列 按列排列 or 按行排列
3 # of process grids (P x Q) //二维处理器网格(P×Q)P×Q=系统CPU数=进程数
2 1 4 Ps //P≤Q,这是一个测试经验值,一般来说,P的值尽量取得小一点
2 4 1 Qs
16.0 threshold //阈值
3 # of panel fact //LU分解相关
0 1 2 PFACTs (0=left, 1=Crout, 2=Right)
2 # of recursive stopping criterium
2 4 NBMINs (>= 1)
1 # of panels in recursion
2 NDIVs
3 # of recursive panel fact.
0 1 2 RFACTs (0=left, 1=Crout, 2=Right)
1 # of broadcast
0 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1 # of lookahead depth
0 DEPTHs (>=0)
2 SWAP (0=bin-exch,1=long,2=mix)
64 swapping threshold
0 L1 in (0=transposed,1=no-transposed) form
0 U in (0=transposed,1=no-transposed) form
1 Equilibration (0=no,1=yes)
8 memory alignment in double (> 0)
保持其他参数不变,只修改P×Q,Ps,Qs三个参数,P×Q是电脑的cpu数目,可以通过如下命令查询:
sudo cat /proc/cpuinfo|grep cores
查看电脑的cpu进程数
sudo cat /proc/cpuinfo | grep processor
作者我的电脑cpu拥有4个cpu核心,共8线程,也就是所谓的“4核心双线程”电脑,即cpu里封装了四个计算核心,每个核心支持同时运行2个进程,所以我的电脑P×Q的最大值就是8,但是我在运行如下指令:
mpirun -np 8 ./xhpl > info.txt
会报如下错误:
根据查阅各种资料,应该是openMpi对电脑性能的错估造成的,可通过如下命令解决:
mpirun -oversubscribe -np 8 ./xhpl > info.txt
实践证明当加入了-oversubscribe字段后,线程数可以写的很大,但我不建议这么做,因为进程数如果大于cpu支持的最大进程数,那么会触发操作系统的进程调度,会大幅度降低性能,所以我们一般不要超过最大进程数。
我们要通过调参来找出性能最佳的参数,在HPL.dat中,我们可以去修改的,有矩阵阶数Ns,块大小NB,以及进程数P×Q,我们可以分为下面三组实验进行:
(1)改变测试线程数
分别在进程数为1,2,4,8四种情况下执行,注意要同步修改HPL.dat下的P×Q,Ps,Qs,画出相应的表格和曲线,根据控制变量法,在一组实验中要保持Ns和NB不变,可以在不同组实验中改变Ns和NB,为了减少实验数量,我们不改变Ns和NB,固定他们不变,测定进程数目的改变对性能的影响
在Ns=19200(可变,多测几组效果更佳)的情况下,填写下面的表格:
进程数 | P | Q | 峰值性能 |
---|---|---|---|
1 | 1 | 1 | |
2 | 1 | 2 | |
2 | 2 | 1 | |
4 | 1 | 4 | |
4 | 2 | 2 | |
4 | 4 | 1 | |
8 | 1 | 8 | |
8 | 2 | 4 | |
8 | 4 | 2 | |
8 | 8 | 1 | |
16 | 1 | 16 | |
16 | 2 | 8 | |
16 | 4 | 4 | |
16 | 8 | 2 | |
16 | 16 | 1 |
得出在不同线程数下最佳的P,Q值:
线程数 | 最佳P | 最佳Q |
---|---|---|
1 | ||
2 | ||
4 | ||
8 | ||
16 |
记录其中峰值性能最高的一组P,Q
(2)分块优化性能
在HPL.dat文件中,NB表示分块大小,先要修改NB种数,再根据种数写分块大小:
4 # of NBs //分块方法的种数
1 2 3 4 NBs //分块的大小用196,232,256效果比较好
HPL默认值是有四种分块,可以分为1x1,2x2,3x3,4x4四种,这些分块可能太小了,根据资料中的经验值,分块采用192,232,256效果比较好,我们不妨采用等步长的方式,来确定最佳的分块大小。
①保持进程数目不变,测定不同Ns值下块大小对性能的影响
在上面得到的峰值性能最高的一组P,Q,完成表格:
Gflops | NB=32 | NB=64 | NB=96 | NB=128 | NB=160 | NB=192 | NB=224 | NB=256 |
---|---|---|---|---|---|---|---|---|
Ns=1920 | ||||||||
Ns=3840 | ||||||||
Ns=5760 | ||||||||
Ns=7680 |
绘制曲线
②保持Ns不变,测定不同进程数(P,Q取最佳)下块大小对性能的影响
Gflops | NB=32 | NB=64 | NB=96 | NB=128 | NB=160 | NB=192 | NB=224 | NB=256 |
---|---|---|---|---|---|---|---|---|
1线程 | ||||||||
2线程 | ||||||||
4线程 | ||||||||
8线程 | ||||||||
16线程 |
绘制曲线
(3)改变Ns
选取P,Q(峰值性能最高的一组P,Q)
Gflops | Ns=4000 | Ns=7000 | Ns=10000 | Ns=13000 | Ns=16000 | Ns=19000 | Ns=41448(这是我电脑的最佳理论值) |
---|---|---|---|---|---|---|---|
NB=32 | |||||||
NB=64 | |||||||
NB=96 | |||||||
NB=128 | |||||||
NB=160 | |||||||
NB=192 | |||||||
NB=224 | |||||||
NB=256 |
经过三个实验,可以初步粗略得到如何调参可以使性能最优
关于代码优化,作者仍在学习,后续也许会有更新
上一篇: dubbo学习总结
下一篇: 苹果iOS应用审核时间延长,最长达三周