一、hpcg介绍
TOP500每年评比两次,近年来以中国的太湖之光,天河二号为代表的超级计算机在TOP500评比上独领风骚。TOP500排名基于HPL(High Performance Linpack )的基准测试程序,已经被大家所熟知。相比于HPL,HPCG能从计算、节约能源等性能上说明超算的性能,能更好的评估超算。相比于HPL测试成绩,HPCG的测试成绩一般都是很低的。笔者的测试和优化成绩只有HPL测试成绩的3%。而太湖之光的效率只有0.3%,天河二号只有1.1%。
二、hpcg配置
hpcg-3.0的代码可以在github下载。3.0版本有个bug,有位网友提出了一个issue,就是运行时间不能通过在hpcg.dat文件里面设置执行时间来确定。
$git clone https://github.com/hpcg-benchmark/hpcg.git
$cd hpcg
在hpcg主目录下面的setup文件夹中创建一个Make.<arch>文件(arch表示的是后缀文件)。或者直接复制setup文件夹中间的Make.<arch>文件。默认的文件如下图所示:
后缀的意思GCC表示使用GCC编译器,ICPC则表示的是intel的编译器,OMP表示的是openmpi,请大家根据自己的情况合理选择。笔者使用的是intel的编译器,所以选择使用Make.MPI_ICPC
$cp Make.MPI_ICPC Make.Linux
下面是配置Make.Linux文件。
hpcg相关配置:
TOPdir是hpcg主目录路径。
MPI库相关配置:
笔者使用的是intel 的mpi库,大家使用openmpi和mpich等等都是一样的道理。MPlib引入的是libmpi.so动态库,或者是libmpi.a静态库。
编译器相关配置:
要保证编译器在.bashrc或者profile文件有PATH环境变量。
$which mpiicc可以返回mpiicc的路径。
然后进行configure 生成makefile,再make一下就好了。
$mkdir build
$cd build
$/home/hl/hpcg/configure Linux
$make
如果make出错,下次make的时候最好make clean一下。
这个时候在build的下面会生成bin文件夹,里面有配置文件hpcg.dat和执行文件xhpcg,默认输入值如下:
第三行就是执行的问题的规模,第四行是执行的时间,经过笔者的测试,运行时间对hpcg的性能的影响很小。但是hpcg官方规定,hpcg运行时间必须要1800s才能得到一个正式的结果。
接下来测试不同的N的值对hpcg成绩的影响。
$mpirun -np 2 ./xhpcg
这里选择了两个进程进行并行测试。最后会在bin文件夹中得到一个HPCG-Benchmark-<identifier>.yamlfile.文件,这个文件详细记录了运行结果,运行的问题规模占用内存的量,以及各个主要的函数所占运行时间。
其中最主要的两个函数MG和SpMV占用时间较多,在上面图中,可以看出MG占时比例较高,测试结果较好。
三、HPCG代码优化
主要涉及优化内存碎片和源码循环优化,尽可能减少短循环。在修改源码过程中,请大家好好利用grep工具,查找对应的代码在哪个文件中。
优化内存碎片:
优化前:
for(local_int_ti=0; i< localNumberOfRows; ++i)
{
mtxIndL[i]= new local_int_t [numberOfNonzerosPerRow];
matrixValues[i]= new double [numberOfNonzerosPerRow];
mtxIndG[i]= new global_int_t[numberOfNonzerosPerRow];
}
优化后:
inttotal_size;
local_int_t*templ = new local_int_t [total_size];
double*tempd = new double [total_size];
global_int_t*tempg = new global_int_t[total_size];
intofset = 0;
for(local_int_t i=0; i<localNumberOfRows; ++i){
mtxIndL[i]= tmpl + offset;
matrixValues[i]= tmpd + offset;
mtxIndG[i]= tmpg + offset;
ofset+= max_nnz;
}
优化多重循环:
保持多重循环i,j向一个方向增加或者减少。
优化前:
优化后:
另外,要避免小循环过多。
另外,对于intel的cpu,可以选择使用intel自带的mpi库,自带的hpcg测试,效果会好很多。