欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linpack实验:MPI性能参数调优

程序员文章站 2022-07-13 10:55:30
...

本次教程写的匆忙,也许会有很多勘误欢迎指正

性能优化部分

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

会报如下错误:

linpack实验:MPI性能参数调优

根据查阅各种资料,应该是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

经过三个实验,可以初步粗略得到如何调参可以使性能最优

关于代码优化,作者仍在学习,后续也许会有更新