Ubuntu 22.04 下安裝 intel 編譯器 + vasp 6.4

一、 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 相當重要,不設的話要么程序并行時卡死钓简,要么直接出錯退出乌妒!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市外邓,隨后出現(xiàn)的幾起案子掸鹅,更是在濱河造成了極大的恐慌,老刑警劉巖深啤,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篡诽,死亡現(xiàn)場離奇詭異,居然都是意外死亡席镀,警方通過查閱死者的電腦和手機匹中,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豪诲,“玉大人顶捷,你說我怎么就攤上這事∈豪椋” “怎么了服赎?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長交播。 經(jīng)常有香客問我重虑,道長,這世上最難降的妖魔是什么秦士? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任缺厉,我火速辦了婚禮,結果婚禮上隧土,老公的妹妹穿的比我還像新娘提针。我一直安慰自己,他們只是感情好曹傀,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布辐脖。 她就那樣靜靜地躺著,像睡著了一般皆愉。 火紅的嫁衣襯著肌膚如雪嗜价。 梳的紋絲不亂的頭發(fā)上艇抠,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音炭剪,去河邊找鬼练链。 笑死,一個胖子當著我的面吹牛奴拦,可吹牛的內(nèi)容都是我干的媒鼓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼错妖,長吁一口氣:“原來是場噩夢啊……” “哼绿鸣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暂氯,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤潮模,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痴施,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擎厢,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年辣吃,在試婚紗的時候發(fā)現(xiàn)自己被綠了动遭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡神得,死狀恐怖厘惦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哩簿,我是刑警寧澤宵蕉,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站节榜,受9級特大地震影響羡玛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜全跨,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一缝左、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浓若,春花似錦、人聲如沸蛇数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耳舅。三九已至碌上,卻和暖如春倚评,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馏予。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工天梧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霞丧。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓呢岗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛹尝。 傳聞我的和親對象是個殘疾皇子后豫,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容