一、 intel 2016
為了在 AMD cpu 上使用 MKL_DEBUG_CPU_TYPE=5
環(huán)境變量從而提高計算速度仪际,只能選擇 2020 之前版本的 intel 編譯器围小。以前一直用的是 intel parallel studiox XE 2016 update 3,于是拿來嘗試弟头。安裝過程中提示不支持的 OS(畢竟這個版本比較老了吩抓,當時顯然還沒有22.04)涉茧,不過不用管它直接安裝即可赴恨。裝完后編譯 fftw3xf 也沒出現(xiàn)問題。于是安裝 vasp6.4伴栓,結果一開始就遇到了如下問題:
make libdmy.a
make[1]: 進入目錄“/home/XXXX/ProgramFiles/vasp/vasp6.4.0-i16/build/std/lib”
icc -march=core-avx2 -O -c -o derrf_.o derrf_.c
In file included from derrf_.c(5):
/opt/intel2016u3/include/math.h(1214): error: identifier "_LIB_VERSION_TYPE" is undefined
_LIBIMF_EXT _LIB_VERSIONIMF_TYPE _LIBIMF_PUBVAR _LIB_VERSIONIMF;
^
compilation aborted for derrf_.c (code 2)
make[1]: *** [makefile:31:derrf_.o] 錯誤 2
make[1]: 離開目錄“/home/XXXX/ProgramFiles/vasp/vasp6.4.0-i16/build/std/lib”
make: *** [makefile:18:all] 錯誤 2
試了下用系統(tǒng)自帶的 gcc 11.3 可以編譯過去伦连,于是就把 c/c++ 編譯器改成了 gcc/g++,這樣倒是編譯了過去钳垮』蟠荆可是,運行的時候卻出現(xiàn)了問題饺窿,串行運行時正常歧焦,然而 mpi 并行時會卡在自洽循環(huán)之前,一直不開始自洽肚医。我以為是 intel + gcc 混合編譯的原因绢馍,于是想會不會是因為系統(tǒng)里的 gcc 版本太高了,畢竟 intel 編譯器也要依賴系統(tǒng)的 libc 以及 libstdc++ 庫肠套。想到 CentOS7 上的 gcc 4.8.5 與 intel 2016 配合的挺好舰涌,于是想到安裝一個低版本的 gcc4 試試,于是裝了一個 gcc 4.9.4你稚。然后再重新編譯 vasp瓷耙,c/c++ 編譯器改回 icc/icpc,結果同樣遇到了上面的錯誤刁赖,網(wǎng)上說可以給 icc 加上選項 -D__PURE_INTEL_C99_HEADERS__
解決搁痛,試了下果然編譯過去了。于是嘗試新編譯的 vasp宇弛,結果問題依舊鸡典,仍是串行能算但并行卡住。從 CentOS7 上拷來的編譯好的 vasp 也是一樣癥狀涯肩。心想既然上面的 -D... 選項能解決之前的錯誤轿钠,要不再試試就在系統(tǒng)的 gcc 環(huán)境下但仍是使用 icc/icpc 編譯巢钓,結果上面的錯誤倒是沒有了,但是后面卻又出現(xiàn)了一大堆的編譯錯誤疗垛,和系統(tǒng)里的 c++ 頭文件比如 /usr/include/c++/11/bits/stl_uninitialized.h 有關症汹,不知如何解決〈螅看來 intel 2016 相對于 ubuntu 22.04 是太老了背镇,問題一堆。
不過泽裳,如果用 2016 的 mpirun 運行一個很久以前編譯的 vasp53(應該是 intel 2013 編譯的)程序倒是能夠正常并行瞒斩,并不卡住。
【卡住問題解決】后來把解決 intel 2018 并行問題的環(huán)境變量 I_MPI_SHM_LMT=shm
用到 intel 2016 上涮总,結果發(fā)現(xiàn)并行卡住的問題竟然解決了胸囱!看來只是參數(shù)設置問題,只不過 2018 有提示而且直接出錯瀑梗,表現(xiàn)不是卡着氡省;而 2016 卻表現(xiàn)為卡住而且沒有任何提示抛丽,很是坑人谤职!而且,最初混合 intel 2016 和 gcc/g++ 11.3 進行編譯得到的程序也能正常運行了亿鲜,其卡住的原因一樣允蜈,并不是編譯問題,而且最終效率和 gcc4 環(huán)境下編譯出的基本一樣蒿柳。
二饶套、intel 2019
于是嘗試換個較新的版本,但還得是 2020之前的其馏,于是就又裝了 2019u5凤跑。結果,2019 又有新問題叛复,在編譯 fftw3xf 時竟然不通過仔引, 出現(xiàn)了如下錯誤
icc -Wall -Werror -I/opt/intel2019/compilers_and_libraries_2019.5.281/linux/mkl/include -I/opt/intel2019/compilers_and_libraries_2019.5.281/linux/mkl/include/fftw -c /opt/intel2019/compilers_and_libraries_2019.5.281/linux/mkl/interfaces/fftw3xf/wrappers/fftw_alignment_of.c -o obj_intel/fftw_alignment_of.o
In file included from /usr/include/x86_64-linux-gnu/bits/floatn.h(119),
from /usr/include/stdlib.h(56),
from /opt/intel2019/compilers_and_libraries_2019.5.281/linux/mkl/include/fftw/fftw3_mkl.h(25),
from /opt/intel2019/compilers_and_libraries_2019.5.281/linux/mkl/interfaces/fftw3xf/wrappers/fftw_alignment_of.c(22):
/usr/include/x86_64-linux-gnu/bits/floatn-common.h(214): error: invalid combination of type specifiers
typedef float _Float32;
^
......
這個問題搜了一下也沒能解決,于是干脆直接用 2016 版里的 libfftw3xf_intel.a褐奥,最后倒是編譯出來了咖耘。然而,運行的時候又出了問題撬码!一開始是由于我直接修改的 2016 版的 module file儿倒,導致少寫了如下環(huán)境變量 prepend-path FI_PROVIDER_PATH ${I_MPI_ROOT}/libfabric/lib/prov
,于是 mpirun 運行時出錯,最后是直接使用 intel 自帶的環(huán)境設置后比較差異發(fā)現(xiàn)的問題夫否。這回雖然是能運行了彻犁,但是運行時也出現(xiàn)了問題,不論并行串行凰慈,運行時一直出現(xiàn)如下警告
WARNING: Sub-Space-Matrix is not hermitian in DAV 16
2.612206137452897E-002
WARNING: Sub-Space-Matrix is not hermitian in DAV 17
3.153763890465701E-002
WARNING: Sub-Space-Matrix is not hermitian in DAV 18
1.912157485711074E-002
WARNING: Sub-Space-Matrix is not hermitian in DAV 19
1.548749765306514E-002
最后雖然運行完畢汞幢,但是結果明顯有問題,根本不收斂微谓。而如果用 2019 的 mpirun 運行之前編譯的那個 vasp53 則直接出錯森篷,如果并行而是在 2019 的環(huán)境下串行運行 vasp53 雖然不出錯,但是卻會出現(xiàn)和上面一樣的警告豺型!
三仲智、intel 2017, 2018
網(wǎng)上有人說 2019, 2020 版編譯器編出的 vasp 可能會有問題姻氨,至少 2019 確實是有問題钓辆,于是想要不再降低下版本,試下 2017 和 2018哼绑。結果岩馍,誰知道這兩個版本都無法在 ubuntu 22.04 上安裝碉咆,安裝過程中都會出現(xiàn)如下錯誤而自動退出抖韩,估計是認為系統(tǒng)不支持吧
./install.sh: 第 644 行: 417382 段錯誤 (核心已轉(zhuǎn)儲) "$pset_engine_cli_binary" --tmp_dir "$user_tmp" --TEMP_FOLDER "$temp_folder" --download_dir "$download_tmp" $params
唉,裝不上就算了疫铜。后來又在 CentOS7 + AMD cpu 上試了一下茂浮,發(fā)現(xiàn)同樣問題,也裝不上壳咕,難道是 CPU 的問題席揽?于是又在 CentOS7 + intel cpu 上試了一下,竟然也同樣問題裝不上谓厘!看來是下載的安裝文件有問題幌羞?
估計是安裝文件有問題,我下的是 2018u4竟稳。我從王老師那里要來了 2018u0 版本属桦,就能順利的安裝,編譯 fftw3xf 也很正常他爸。只是在編譯 vasp 時出現(xiàn)了類似 2016 的問題聂宾,那就是在編譯 build/std/parser 目錄下的 sites.cpp 時
$ icpc -march=core-avx2 -D YY_parse_DEBUG=1 -c sites.cpp -o sites.o
出現(xiàn)了如下一系列錯誤
In file included from /usr/include/c++/11/bits/stl_algobase.h(59),
from /usr/include/c++/11/vector(60),
from sites.hpp(4),
from sites.cpp(1):
/usr/include/x86_64-linux-gnu/c++/11/bits/c++config.h(491): error: function call is not allowed in a constant expression
#if __has_builtin(__builtin_is_constant_evaluated)
^
應該是和系統(tǒng)的 c++ 頭文件版本過高有關。無奈诊笤,將 gcc 環(huán)境設為 4.9.4 后這些問題就沒有了系谐,順利編譯成功。而且我還發(fā)現(xiàn)讨跟,雖然編譯時的環(huán)境是 gcc 4.9.4纪他,但是運行時就用 intel 2018 + 默認的 gcc11.3 也能運行鄙煤,結果一切正常,而且似乎還快了那么一點點茶袒。看來只有在編譯的時候有必要用 gcc4 的環(huán)境馆类。 不過,串行沒問題弹谁,mpi 并行時還是遇到一點問題乾巧,一開始直接提示如下錯誤
Fatal error in PMPI_Alltoallv: Other MPI error, error stack:
PMPI_Alltoallv(665).............: MPI_Alltoallv(sbuf=0xce86100, scnts=0xc9fb1c0, sdispls=0xc070d40, MPI_DOUBLE_COMPLEX, rbuf=0xce44f40, rcnts=0xc070cc0, rdispls=0xc070bc0, MPI_DOUBLE_COMPLEX, comm=0xc4000002) failed
MPIR_Alltoallv_impl(416)........: fail failed
MPIR_Alltoallv(373).............: fail failed
MPIR_Alltoallv_intra(226).......: fail failed
MPIR_Waitall_impl(221)..........: fail failed
PMPIDI_CH3I_Progress(623).......: fail failed
pkt_RTS_handler(317)............: fail failed
do_cts(662).....................: fail failed
MPID_nem_lmt_dcp_start_recv(302): fail failed
dcp_recv(165)...................: Internal MPI error! Cannot read from remote process
Two workarounds have been identified for this issue:
1) Enable ptrace for non-root users with:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
2) Or, use:
I_MPI_SHM_LMT=shm
不過好在里面已經(jīng)提示了解決辦法,那就是設置環(huán)境變量 I_MPI_SHM_LMT=shm
预愤,設完了就能正常并行了沟于,虛驚一場,以為 2018 也有問題呢植康。參考 http://cali2.unilim.fr/intel-mpi/doc/Reference_Manual/Shared_Memory_Control.htm旷太。該環(huán)境變量好像是用于控制大消息傳輸?shù)姆绞剑嚵艘幌略O成 0 也能運行且效率差不多销睁,但設成 direct 則不行供璧。
四、intel oneAPI 2023
既然老版本的編譯器有各種各樣的問題冻记,最后我也不執(zhí)著于是否能用 MKL_DEBUG_CPU_TYPE=5
了睡毒,于是干脆裝最新的 intel 編譯器。近幾年來冗栗,intel parallel studio 系列已經(jīng)不出了演顾,升級成了 intel oneAPI,而且是免費的隅居。需要注意的是得安裝兩個钠至,一個是 oneAPI Base Toolkit 另一個是 oneAPI HPC Toolkit,因為 MKL 庫在 Base 里而 MPI 及 Fortran 在 HPC 里胎源。我一開始只安裝了 HPC 的發(fā)現(xiàn)里面沒有 MKL棉钧,于是又裝的 Base。附:
Base下載地址:https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html
HPC下載地址:https://www.intel.com/content/www/us/en/developer/tools/oneapi/hpc-toolkit-download.html
另外參考如下兩篇內(nèi)容:
https://zhuanlan.zhihu.com/p/427743966
https://blog.qiql.net/archives/intelgcc
需要注意的是安裝時不必裝它的 python 環(huán)境涕蚤,也不必裝 eclipse宪卿。裝完后在安裝目錄下直接就有一個 setvars.sh 腳本,source 它就直接設置了環(huán)境變量赞季。雖然它也提供了
modulefiles-setup.sh 腳本愧捕,但是卻是針對每個組件單獨生成一個文件,導致又一大堆文件生成申钩,使用起來并不方便次绘。而手動寫 module file 也是很麻煩的事,因為環(huán)境變量太多了。不過可以借助于 env2 工具邮偎,它可以自動生成 module file管跺。在一個沒有運行 setvars.sh 的 shell 下運行
env2 -from bash -to modulecmd /path/to/setvars.sh
就會生成一個 env2.modulecmd 文件,它就是自動生成的 module file禾进,放到合適地方并重命名即可豁跑。注意 env2 是根據(jù)比較運行了 setvars.sh 前后的環(huán)境變量的變化而工作的,所以如果運行前后環(huán)境變量不變則生成結果為空泻云。
用裝好的 2023 版編譯器進行編譯艇拍,首先 fftw3xf 編譯正常,然后編譯 vasp宠纯。注意兩點卸夕,一是 -mkl
改為 -qmkl
,而是去掉 -xHOST
婆瓜,然后就順利編譯通過了快集。最后運行 vasp 無論串行并行都正常,結果也正常廉白「龀酰看來還是最新的編譯器與新系統(tǒng)兼容。
試了下在 2023 的環(huán)境下運行那個以前編譯的 vasp53猴蹂,串行時提示如下錯誤
vasp53: symbol lookup error: /usr/local/opt/intel2023/mkl/2023.1.0/lib/intel64/libmkl_blacs_intelmpi_lp64.so: undefined symbol: MPI_Comm_get_attr
而并行則直接出錯退出院溺。
總結
性能上還是 2016 版的最快(MKL_DEBUG_CPU_TYPE=5 對 16、18有效晕讲,對23無效)覆获,簡單測試結果如下:
2016: 串行 355.6s,四核并行 124.6s
2018: 串行 411.0s瓢省,四核并行 141.6s
2023: 串行 455.0s,四核并行 216.9s(這個系統(tǒng)耗時長達78s痊班,上面兩個則可忽略)gcc 較新的系統(tǒng)(我這里11.3)下裝較老版本的 intel 編譯器勤婚,編譯 vasp 時會出現(xiàn)編譯錯誤,因為有部分 c++ 文件用 icpc 編譯時要用到系統(tǒng)的頭文件涤伐,而較新的頭文件中會使用較新標準的語法導致 icpc 不支持從而編譯失敗馒胆。解決辦法就是裝較老版本的 gcc,比如 4.x凝果,然后在較低版本 gcc 環(huán)境下再用 icpc 去編譯就正常了祝迂。
上面說到的 icpc 編譯失敗的那些程序,其實可以混合編譯器净,即 fortran 部分使用 mpiifort 編譯型雳,而 c/c++ 部分則用系統(tǒng)的 gcc/g++ 編譯,這樣就沒有上述編譯問題了。
運行環(huán)境比編譯環(huán)境重要纠俭,比如 2016 編出的 vasp 在 2018 環(huán)境下運行其速度和 2018 的一樣沿量;反之,2018 編譯出的 vasp 在 2016 環(huán)境下運行其速度和 2016 的一樣冤荆。
對 2016 和 2018 版的編譯器朴则,環(huán)境變量
I_MPI_SHM_LMT=shm
相當重要,不設的話要么程序并行時卡死钓简,要么直接出錯退出乌妒!