之前給女朋友寫了一個 HPL&HPCC 軟件快速安裝腳本,然後發到了網上給大家用==> 鏈接在這裏
在這裏記錄一下編寫的過程,以及一些收穫。
1. HPCC or HPL 是啥?
這兩個東西本質上就是 benchmark(跑分工具),用來測試計算機的性能的。只不過這兩個東西和“娛樂大師”的區別在於,這兩個東西主要衡量高性能計算機的並行計算能力。
這兩者也是聯繫很密切的,我理解HPCC
爲HPL
的拓展包,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
),以及一些基礎工具如gcc
、gcc-gfortran
等。
所需環境
對於編譯環境,常見的組合有
- HPL + Intel® Parallel Studio XE(intel 編譯器 + intel mkl + intel-mpi)
intel 套件包含了數學庫(mkl)、各種編譯器(如 icc、gcc)和 intel mpi。
此外,安裝 Intel 套件後,在其安裝目錄下的mkl/benchmarks/linpack
及mkl/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
文件,查看這三個文件可知,他們將基礎運行庫、MPI
、MKL
分別寫入了環境變量。
這意味着什麼呢我的好兄弟?
這意味着我們就不用了去網上下載亂七八糟搞不懂的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
獲取,最後把中間下載的源碼壓縮包刪除,使得結果乾淨。總體感覺還不錯,寫作業去了。
最後說一句,這個東西剛開始確實是爲了幫女朋友裝才搞的。