一、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>文件。默认的文件如下图所示:

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

后缀的意思GCC表示使用GCC编译器,ICPC则表示的是intel的编译器,OMP表示的是openmpi,请大家根据自己的情况合理选择。笔者使用的是intel的编译器,所以选择使用Make.MPI_ICPC

$cp Make.MPI_ICPC Make.Linux

下面是配置Make.Linux文件。

hpcg相关配置:

TOPdir是hpcg主目录路径。

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

MPI库相关配置:

笔者使用的是intel 的mpi库,大家使用openmpi和mpich等等都是一样的道理。MPlib引入的是libmpi.so动态库,或者是libmpi.a静态库。

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

编译器相关配置:

要保证编译器在.bashrc或者profile文件有PATH环境变量。

$which mpiicc可以返回mpiicc的路径。

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

然后进行configure 生成makefile,再make一下就好了。

$mkdir build

$cd build

$/home/hl/hpcg/configure Linux 

$make

如果make出错,下次make的时候最好make clean一下。

这个时候在build的下面会生成bin文件夹,里面有配置文件hpcg.dat和执行文件xhpcg,默认输入值如下:

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

第三行就是执行的问题的规模,第四行是执行的时间,经过笔者的测试,运行时间对hpcg的性能的影响很小。但是hpcg官方规定,hpcg运行时间必须要1800s才能得到一个正式的结果。

接下来测试不同的N的值对hpcg成绩的影响。

$mpirun -np 2 ./xhpcg

这里选择了两个进程进行并行测试。最后会在bin文件夹中得到一个HPCG-Benchmark-<identifier>.yamlfile.文件,这个文件详细记录了运行结果,运行的问题规模占用内存的量,以及各个主要的函数所占运行时间。

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

其中最主要的两个函数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向一个方向增加或者减少。

优化前:

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

优化后:

在两路cpu服务器进行HPCG(高度共轭梯度基准测试)测试与优化

另外,要避免小循环过多。

另外,对于intel的cpu,可以选择使用intel自带的mpi库,自带的hpcg测试,效果会好很多。


相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-17
  • 2022-12-23
  • 2022-01-01
  • 2021-12-25
  • 2021-04-30
猜你喜欢
  • 2021-12-25
  • 2021-08-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案