原理解釋——山威高性能計算課程HPL & HPCC軟件快速安裝腳本的實現

之前給女朋友寫了一個 HPL&HPCC 軟件快速安裝腳本,然後發到了網上給大家用==> 鏈接在這裏
在這裏記錄一下編寫的過程,以及一些收穫。

1. HPCC or HPL 是啥?

這兩個東西本質上就是 benchmark(跑分工具),用來測試計算機的性能的。只不過這兩個東西和“娛樂大師”的區別在於,這兩個東西主要衡量高性能計算機的並行計算能力。
這兩者也是聯繫很密切的,我理解HPCCHPL的拓展包,HPCC在庫上就直接使用了HPL,最新的HPCC-1.5.0使用的是HPL-2.0(2016 年推出,之後HPCC沒有繼續更新,猜測是出現了更好的 benchmark 軟件。

HPL:High Performance Linpack

其中表示意義的一詞 LINPACK(Linear system package),線性系統軟件包,是通過讓計算機使用高斯消元法求解 N 元一次稠密線性方程組來評估計算機的浮點運算性能。

HPCC: HPC Challenge

顧名思義,是一個打包好的,集成了一些其他評估方式在內的 benchmark 工具

2. 怎麼安裝?

我們可以在互聯網上獲取兩者的源代碼,之後需要對代碼自行編譯,才能得到可執行文件。這時候就產生了一個問題——

爲什麼不直接打包好,像我們平常使用的軟件那樣,直接發行可執行文件?

這是因爲這兩者都是爲了評估計算機的運算性能的軟件,專用性很強,必須和計算機的環境緊密結合,才能發揮最好的效果。其實,HPL解壓後,我們可以發現在根目錄下存在一個configure文件,這個文件可以自動檢測環境並完成編譯。但是有個條件,即所處的操作系統必須配置好了HPL所需要的所有環境變量。

在我們的機羣上運行該文件時,它會檢測到機羣 CPU 爲Intel Xeon E5-2620,從而使用 Make.Linux_Intel64 模板嘗試進行編譯,但它沒有找到需要的MKL庫,編譯失敗。實際上並不是我們的環境變量中沒有MKL,而是因爲版本不同,導致以版本號作爲目錄的情況下無法識別到。舉個例子來說,就是模板中認爲應該去找SOFTWARE,而我們機羣中目錄爲SOFTWARE-2.0

我們都知道,HPL軟件包要想編譯成功,需要系統擁有MPI環境,且底層有線性代數子程序包 BLAS 的支持(或者向量信號圖像處理庫 VSIPL),以及一些基礎工具如gccgcc-gfortran等。

所需環境

對於編譯環境,常見的組合有

  • HPL + Intel® Parallel Studio XE(intel 編譯器 + intel mkl + intel-mpi)
    intel 套件包含了數學庫(mkl)、各種編譯器(如 icc、gcc)和 intel mpi。
    此外,安裝 Intel 套件後,在其安裝目錄下的 mkl/benchmarks/linpackmkl/benchmarks/mp_linpack 文件夾下有編譯好的 linpack 及測試腳本,可直接使用;
  • HPL + ACML + GNU 編譯器 + openmpi
    ACML 由 AMD 推出,用於 AMD 的 cpu。
  • HPL + GNU 編譯器+ blas 或 lapack 等數學庫 + openmpi
    數學庫:blas/lapack 等
    上述中的 openmpi 也可用 mpich

由於我們機羣是Intel Xeon E5-2620的 CPU,因此採用Intel的解決方案最合適。
我們所在的目錄是/home/train/stuxx,在/train目錄下,可以發現存在一個bashrc文件

# .bashrc
# source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# User specific aliases and functions

source /opt/intel/composer_xe_2015.1.133/bin/compilervars.sh intel64
source /opt/intel/impi/5.0.2.044/bin64/mpivars.sh
source /opt/intel/mkl/bin/intel64/mklvars_intel64.sh

查看文件內容可知,該文件在我們啓動終端的時候,執行了三個.sh文件,查看這三個文件可知,他們將基礎運行庫、MPIMKL分別寫入了環境變量。
這意味着什麼呢我的好兄弟?
這意味着我們就不用了去網上下載亂七八糟搞不懂的BLAS,CBLAS,這個 mpi 那個 mpi 了,我們只要使用機羣現有的就可以了。

插入一條信息,我早期嘗試使用 Intel 官方的MKL-2020,結果2020版竟然不能在RHEL 6(我們機羣的操作系統)上運行,只能在紅帽 7 以後的版本運行。2019可以,但是既然機器上有了,也就沒必要下載了。

編譯文件修改

既然知道了這些,只要根據setup/目錄下的模板Make.Linux_Intel64,稍微修改路徑所在位置,就可以編譯了(前面說過了,因爲我們是E5-2620(差不多是那個時候的服務器專用 U 了),所以選擇Intel64
這一部分網絡上教程很多,講得也都很細緻,這裏在隨便說一點,只列出修改的部分:

ARCH         = sduwhhpl     #改成你想取的名字,隨便什麼都行
TOPdir       = $(HPL_HOME)  #HPL的目錄,這個HPL_HOME變量是我定義的,下面有詳細講解
MPdir        = $(I_MPI_ROOT)#MPI的目錄
LAdir        = $(MKLROOT)   #MKL的目錄,其實這個不用改,本來就是這個,我只是放在這說明比較重要

真的就改這幾個,所以不要看着網上的教程就跟着手把手做,建議弄懂每一步是爲什麼,然後結合自己機器的環境去做。因爲我們的環境很多都配置好了,照着網上修改反而弄錯(發現有一些賬號操作導致環境變量變化,因此在腳本第二版本中加入了環境變量重導入語句)

這裏面比較有意思的就是這個TOPdir,這個目錄是HPL的目錄,下面的很多操作都會調用這個目錄。我們知道他的運行目錄是在../stuxx/201800xxxxxx/下,可是每個人的學號不一樣,我又不想讓大家每次用的時候都輸入一個學號作爲參數傳進來。後來想了想,就增加了一個臨時環境變量HPL_HOME,如下:

HPL_HOME=$(pwd)     #以當前所在目錄作爲值,其實就是你學號的目錄
export HPL_HOME
source /etc/profile

unset HPL_HOME      #銷燬變量

HPCC 的小坑

HPCC的編譯過程其實就是編譯一個HPL-2.0的過程,只需要注意幾個點:

TOPdir       = ../../..     # HPL的目錄不要改動,就用這個(因爲本身是集成了HPL,它自己知道在哪

# 下面這兩個需要注意,後面加上-std=c99,見下方解釋
CCFLAGS  = $(HPL_DEFS) -O3 -w -ansi-alias -i-static -z noexecstack -z relro -z now -nocompchk -Wall -std=c99
LINKFLAGS    = $(CCFLAGS) $(OMP_DEFS) -mt_mpi -std=c99

第一次編譯錯誤,提示STREAM/stream.c(178): error: expected a ";",這是哪門子的錯誤嘛?總不能是程序寫錯了?還是這種缺一個;的錯誤?
後來查資料發現,HPCC-1.5.0對流進行了修改,對其中的數組加入了關鍵字限制,要想編譯stream,必須使用c99,因此加上-std=c99

3. 一些其他

總體來說,折騰的過程還是挺爽的。文件使用了FTP協議傳輸,在腳本中用wget獲取,最後把中間下載的源碼壓縮包刪除,使得結果乾淨。總體感覺還不錯,寫作業去了。

最後說一句,這個東西剛開始確實是爲了幫女朋友裝才搞的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章