1. 程式人生 > >在兩路cpu伺服器進行HPCG(高度共軛梯度基準測試)測試與優化

在兩路cpu伺服器進行HPCG(高度共軛梯度基準測試)測試與優化

一、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測試,效果會好很多。