CSDN上的安装测试有很多,但在实际安装过程中经常碰到博客的教程缺了中间的某个指令,或者漏了某个配置(写的不完全)导致报错的情况,一波三折下来直接心态搞崩,不过好在最后终于是成功了。
特此我详细记录下本次HPL安装和测试的过程,给自己一个参考,也给其他人一个参考。(本过程仅在我的centos7.6虚拟机上安装成功,若有其他报错问题可以评论区告诉我)
软件环境:
Linux(CentOS 7.6)
GCC和GFortran(编译器)
BLAS-3.8.0(用来做矩阵计算或者向量计算的库)
CBLAS(是BLAS的C语言接口)
MPICH-3.2.1(用于并行运算的工具)
HPL-2.3。
接下来的安装顺序也是按照BLAS-3.8.0->CBLAS->MPICH-3.2.1->HPL-2.3来进行。
检查环境:
gfortran -v
gcc -v
安装GCC和Fortran
sudo yum install gcc
sudo yum install gcc-gfortran
接下来的所有安装过程均在用户权限下完成,不要使用su进入root权限进行安装,否则会出现一些奇怪的错误(比如权限问题)
wget http://www.netlib.org/blas/blas-3.8.0.tgz
tar -xzf blas-3.8.0.tgz
解压完成后如下图所示会出现两个文件,左边一个是下载的压缩包,右边那个是解压完成后的文件夹
cd BLAS-3.8.0
make
ar rv libblas.a *.o
BLAS-3.8.0文件夹下应该能够找到libblas.a文件
sudo cp blas_LINUX.a /usr/local/lib
至此BLAS-3.8.0安装完成
wget http://www.netlib.org/blas/blast-forum/cblas.tgz
tar -xzf cblas.tgz
解压完成后主目录出现如下图所示左边一个是下载的压缩包,右边那个是解压完成后的文件夹。
cd CBLAS
cp /home/ldw(你的用户名称这里我是ldw)/BLAS-3.8.0/blas_LINUX.a ./
首先将上一步编译成功的 libblas.a 复制到 CBLAS目录下的testing子目录
make命令编译所有的目录
这两句会在CBLAS安装目录下的lib目录中产生一个静态链接库文件 cblas_LINUX.a文件,后需要用到
cp /home/ldw(你的用户名称这里我是ldw)/BLAS-3.8.0/libblas.a testing
make
vim Makefile.in
BLLIB = /home/ldw(你的用户名称这里我是ldw)/BLAS-3.8.0/blas_LINUX.a
修改完成后按ESC,然后输入“:wq”,最后按下回车键进行保存。
sudo cp lib/cblas_LINUX.a /usr/local/lib
/usr/local/lib目录下的文件,(后面两个文件没有也不要紧,如果后面发生了报错,可以从bblas和cblas文件夹下找到,然后复制进去)
后续hpl若配置成功,会在cblas/testing文件夹下出现一些可执行文件,用来测试最终是否成功,hpl配置完成后可以回到此处进行二次检查(有的博客不需要hpl配置完成也会有,我不知道为什么,但是我配置时,安装完成cblas后并没有出现,只有当安装完成hpl才出现,大家根据情况自行测试)。
挑一个进行测试运行
./testing/xzcblat1
wget http://www.mpich.org/static/downloads/3.2.1/mpich-3.2.1.tar.gz
tar xzf mpich-3.2.1.tar.gz
解压完成后在主目录下会出现该文件夹
这里的安装路径就是最终真正的安装路径,也是后面环境变量配置的位置。若想安装于其他位置只需要修改prefix=后面的即可,但环境变量也需要同步修改。(已修改,感谢同学指出问题)
cd mpich-3.2.1/
./configure --disable-cxx --prefix=/home/mpich-install 2>&1 | tee c.txt
make 2>&1 | tee m.txt
sudo make install 2>&1 | tee mi.txt
重要:上面的步骤完成后,我们可以在/home文件夹下看到mpich-install文件夹,这个才是我们mpich真正安装的位置!后续hpl安装配置环境的时候用到的都是/home/mpich-install文件夹作为mpi安装的路径,而不是主目录下的!这一点坑了我好久
用vim配置环境同时用source命令重新加载配置
vim ~/.bashrc
export PATH=/home/mpich-install/bin:$PATH
source ~/.bashrc
若出现mpicc未找到,则可能是上一步配置的环境出现了错误,不要配成/home/ldw(你的用户名称,这里我是ldw)/mpich-3.2.1,这个路径是错误的,不是mpi真正安装的地方,要与安装路径一致,可返回查看4.2
which mpicc && which mpiexec
mkdir machinefile
mpiexec -f machinefile -n 3 hostname && mpiexec -n 5 -f machinefile ./examples/cpi
最后一条指令会出现如下的运行结果
/usr/local/lib目录下的文件,(后面两个文件没有也不要紧,如果后面发生了报错,可以从bblas和cblas文件夹下找到,然后复制进去)
wget http://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz
tar -xzf hpl-2.3.tar.gz
cd hpl-2.3/
cp setup/Make.Linux_PII_CBLAS ./
vim Make.Linux_PII_CBLAS
配置完成后按ESC,然后输入“:wq”,最后按下回车键进行保存。
make arch=Linux_PII_CBLAS
编译完成后在bin文件夹下会生成一个xhpl文件。
遇到libmpich.a文件缺少就是因为配置环境时mpich路径输入错误,不是主目录那个,而是/home/mpich-install那个
cd bin/Linux_PII_CBLAS
mpirun -np 4 ./xhpl > HPL-Benchmark.txt
测试结果文件长这样:
cat /proc/cpuinfo
本虚拟机的逻辑cpu共有4个编号为0、1、2、3,分别属于4个物理cpu,编号分别为1、2、4、6,cpu主频为2894.565mhz(2.894565GHZ),每个cpu有一个核心,AMD的浮点运算单元数=8。
因此,本机器的分值计算速度=2.9GHz * 4 * 8=92.8Gflops
实验书上的描述:
1 修改HPL.dat设置运行参数
在HPL测试中,使用的参数选择与测试的结果有很大的关系。HPL中参数的设定是通过从一个配置文件HPL.dat中读取的,所以在测试前要改写HPL.dat文件,设置需要使用的各种参数,然后再开始运行测试程序。配置文件内容的结构如下:
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) //输出方式选择(stdout,stderr或文件)
2 # of problems sizes (N) //指出要计算的矩阵规格有几种
1960 2048 Ns //每种规格分别的数值
2 # of NBs //指出使用几种不同的分块大小
60 80 NBs //分别指出每种大小的具体值
2 # of process grids (P x Q-l //指出用几种进程组合方式
2 4 Ps //每对PQ具体的值
2 1 Qs
16.0 threshold //余数的阈值
1 # of panel fact //用几种分解方法
1 PFACTs (0=left, 1=Crout, 2=Right) //具体用哪种,0 left,1 crout,2 right
1 # of recursive stopping criterium //几种停止递归的判断标准
4 NBMINs (>= 1) //具体的标准数值(须不小于1)
1 # of panels in recursion //递归中用几种分割法
2 NDIVs //这里用一种NDIV值为2,即每次递归分成两块
1 # of recursive panel fact. //用几种递归分解方法
2 RFACTs (0=left, 1=Crout, 2=Right) //这里每种都用到(左,右,crout分解)
1 # of broadcast //用几种广播方法
3 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM) //指定具体哪种(有1-ring,1-ring Modified,2-ring,2ring Modified,Long以及long-Modified)
1 # of lookahead depth //用几种向前看的步数
1 DEPTHs (>=0) //具体步数值(须大于等于0)
2 SWAP (0=bin-exch,1=long,2=mix) //哪种交换算法(bin-exchange,long或者二者混合)
64 swapping threshold //采用混合的交换算法时使用的阈值
0 L1 in (0=transposed,1=no-transposed) form //L1是否用转置形式
0 U in (0=transposed,1=no-transposed) form //U是否用转置形式表示
1 Equilibration (0=no,1=yes) //是否采用平衡状态
8 memory alignment in double (> 0) //指出程序运行时内存分配中的采用的对齐方式
要得到调试出高的性能,必须考虑内存大小,网络类型以及拓扑结构,调试上面的参数,直到得出最高性能。
本次实验需要对以下三组参数进行设置:
2 # of problems sizes (N) //指出要计算的矩阵规格有几种
1960 2048 Ns //每种规格分别的数值指出要计算的矩阵规格有2种,规格是1960,2048
2 # of NBs //指出使用几种不同的分块大小
60 80 NBs //分别指出每种大小的具体值指出使用2种不同的分块大小,大小为60,80
2 # of process grids (P x Q-l //指出用几种进程组合方式
2 4 Ps //每对PQ具体的值
2 1 Qs
指出用2种进程组合方式,分别为(p=2,q=2) 和(p=4,q=1)
注:p=2,q=2时需要的进程数是p×q=2×2=4,运行时mpirun命令行中指定的进程数必须大于等于4
以上3组每组有两种情况,组合后一共有8种情况,将得到8个性能测试值,经过不断的调试将会得出一个最大的性能值,这就是得到的最高性能值。
以下是其中一个性能测试值,规格为2048,分块是60,p=2,q=2时,运行时间为:56.14,运算速度为0.8165 Gflops。PASSED代表结果符合要求。
============================================================================
T/V N NB P Q Time Gflops
\----------------------------------------------------------------------------
W13R2C4 2048 60 2 2 56.14 8.165e-01
\----------------------------------------------------------------------------
||Ax-b||_oo / ( eps * ||A||_1 * N ) = 0.0175089 ...... PASSED
||Ax-b||_oo / ( eps * ||A||_1 * ||x||_1 ) = 0.0035454 ...... PASSED
||Ax-b||_oo / ( eps * ||A||_oo * ||x||_oo ) = 0.0007503 ...... PASSED
============================================================================
实际运行结果:
以下是其中一个性能测试值,规格为2048,分块是60,p=2,q=2时,运行时间为:0.30,运算速度为19.137 Gflops。PASSED代表结果符合要求。
峰值速度随进程个数变化
其他配置不变,改变p、q的数量完成下列测试数据。
p*q=进程数=cpu个数
矩阵规模=1960,分块数量=60的情况下的一组测试,选择所有测试中峰值速度最大的一组填入表格
CPU个数 | N | NB | P | Q | Time | Gflops | 参与运算主机名 |
---|---|---|---|---|---|---|---|
1 | 1960 | 60 | 1 | 1 | 0.66 | 7.6447 | Ldw@master |
2 | 1960 | 60 | 1 | 2 | 0.34 | 14.800 | Ldw@master |
3 | 1960 | 60 | 1 | 3 | 0.25 | 20.259 | Ldw@master |
4 | 1960 | 60 | 2 | 2 | 0.2 | 24.91 | Ldw@master |
后续还有1960 80、2048 60、2048 80的测试,省略,留给大家自行测试了。。。
可以看到,当矩阵规模和分块数一定的情况下,CPU个数和计算峰值速度成正比,CPU个数对计算峰值速度有着巨大的影响,CPU个数越多,计算速度越快。
经过多次测试,分块大小对性能有很大的影响,NB的选择和软硬件许多因素密切相关。当矩阵规模一定的情况下,分块数量的提升不一定能够提升计算速度,在本机上,当矩阵规模N=2048,CPU数量=1时,NB分块数量大约在64左右计算峰值能够取到最大值(7.6797)。分块数量需要通过在小规模数据上不断调试而得出。
经过测试,p,q的选择对于计算峰值也有较大的影响,从上面的测试数据中可以看到,所有的最佳结果都是在p 因此在测试的时候可以让P=1,Q=n,这样可以在小规模数据时达到最快速度,便于调试出最优的分块大小NB,同时也能够获得高性能的测试值。
参考博客:
https://blog.csdn.net/no1xiaoqianqian/article/details/129223686?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-129223686-blog-51442603.235%5Ev32%5Epc_relevant_increate_t0_download_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-129223686-blog-51442603.235%5Ev32%5Epc_relevant_increate_t0_download_v2&utm_relevant_index=2
https://blog.csdn.net/sishuiliunian0710/article/details/20493101?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168377439916800215023273%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168377439916800215023273&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-20493101-null-null.142^v86^control,239^v2^insert_chatgpt&utm_term=%E5%AE%89%E8%A3%85hpl&spm=1018.2226.3001.4187
https://blog.csdn.net/kingdomkitty/article/details/80258364?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168379618616800192282030%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168379618616800192282030&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-80258364-null-null.142^v87^control,239^v2^insert_chatgpt&utm_term=%E5%AE%89%E8%A3%85mpich&spm=1018.2226.3001.4187