高性能Numpy/Scipy:使用Intel MKL和Intel Compilers

1.獲取Intel Parallel Studio XE

Intel免費軟件工具提供免費的軟件包,其中包括完整的Intel編譯器和計算庫及其激活碼,軟件和激活碼一一對應。注意需要使用教育郵箱註冊,否則不予通過。

2. 安裝過程

解壓後在終端進入./install_GUI.sh,按照提示進行就好,其中激活的步驟需要聯網,且最多隻能激活5次。最後整個庫會安裝在\opt\intel路徑下,重要的是配置環境變量。

  1. 首先加入Intel編譯器icc的路徑
export INTELCOMP=/opt/intel/bin
export PATH=$INTELCOMP:$PATH
  1. 接着加入共享庫的路徑,其中庫的名稱一定要有對應的版本號,這裏是.1.132
export MKLHOME=/opt/intel/mkl/lib/intel64
export LIB1=/opt/intel/compilers_and_libraries_2017.1.132/linux/mkl/lib/intel64_lin
export LIB2=/opt/intel/compilers_and_libraries_2017.1.132/linux/compiler/lib/intel64_lin
export LD_LIBRARY_PATH=$MKLHOME:$LIB1:$LIB2:$LD_LIBRARY_PATH

注意:如果使用中還有一些.so庫找不到,則可以定位這些庫然後加入到LD_LIBRARY_PATH中。如果需要有全局的作用,則可以編輯/etc/ld.so.conf文件,增加這些路徑,並用ldconfig刷新。

3. 構建numpy和scipy

主要依據Numpy/Scipy with Intel® MKL and Intel® Compilers官網提示。總結起來就是在numpy的安裝路徑下增加site.cfg文件,內容如下:

[mkl]
library_dirs = /opt/intel/compilers_and_libraries_2017.1.132/linux/mkl/lib/intel64
include_dirs = /opt/intel/compilers_and_libraries_2017.1.132/linux/mkl/include
mkl_libs = mkl_rt
lapack_libs =

接着更改numpy/distutils/intelccompiler.py文件中的self.cc_exe語句,如果是64位,則在IntelEM64TCCompiler類中將之改爲self.cc_exe = 'icc -O3 -g -fPIC -fp-model strict -fomit-frame-pointer -openmp -xhost'。然後就可以編譯安裝numpy了

$ python setup.py config --compiler=intelem build_clib --compiler=intelem build_ext --compiler=intelem install

構建安裝scipy可以直接進行

$ python setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install

4. 關於一些錯誤

  • 構建中編譯器和共享庫路徑找不到

c編譯器一定需要icc,所以一定要將icc定位後加入到系統變量PATH中 ,共享庫路徑可以加入LD_LIBRARY_PATH或者編輯/etc/ld.so.conf文件。同時,還需要fortran編譯器,而它集成在gcc中,因此在編譯之前一定要確保已經安裝了gcc。
還有錯誤就是找不到系統的編譯器,例如ld: cannot find -lstdc++的錯誤,這是說系統找不到libstdc++.so文件,但是在/usr/lib64中會有libstdc++.so.6文件,因此要創建軟鏈接才能正常編譯

$ ln -s /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so
  • 使用numpy/scipy時找不到共享庫

共享庫路徑同樣要加入LD_LIBRARY_PATH或者編輯/etc/ld.so.conf文件

  • 安裝其他基於numpy的庫時,出現未定義的符號undefined symbols的錯誤

在當前環境中缺少共享庫路徑,可以暫時添加錯誤中缺少的路徑到LD_LIBRARY_PATH中,即

export LD_LIBRARY_PATH=[the needed path]:$LD_LIBRARY_PATH

這樣重新安裝就可以了。

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