from:http://unifius.wordpress.com.cn/archives/5
系統:Gentoo Linux (64bit, Kernel 3.7.1)
配置:Intel(R) Core(TM) i7-2670QM
在Gentoo中安裝Numpy/Scipy非常簡單,直接emerge就可以解決。但是默認鏈接的blas/lapack庫性能非常差,在矩陣計算方面比MATLAB慢了不少。原因在於MATLAB使用的是高度優化的數值計算庫Intel math kernel library (MKL)。最新的MKL庫在science overlay中有,安裝后通過eselect blas/lapack set可以將系統默認鏈接的庫設定為MKL(如mkl64-int64-dynamic-openmp)。設定之后再emerge numpy就可使用鏈接MKL庫的numpy,而且可以發現svd等常用矩陣計算函數的速度大大提升。可問題是scipy無法emerge通過,查看log發現scipy無法檢測到-lblas,即它根本沒有識別系統默認鏈接庫的設置。science overlay中blas/lapack庫及其相關包的安裝向來十分糾結,因為這里面似乎還沒有完善的鏈接管理。這些問題持續了至少一年,近來才發現(部分)解決途徑。
我們改換策略,手工安裝numpy。首先獲取最新的numpy包:git clone git://github.com/numpy/numpy.git numpy
然后進入到根目錄。我們需要進行一些配置才能使numpy用上安裝好的MKL庫。這部分可以參考Intel官網的一個教程:
http://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl
首先在根目錄中加入site.cfg文件:
[mkl]
library_dirs = /opt/intel/mkl/composer_xe_2013/lib/intel64
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =
這里library_dirs與include_dirs是MKL的相關路徑,注意各Linux發行版有細微區別。接下來修改numpy/distutils/intelccompiler.py中的cc_exe:
self.cc_exe = 'icc -O3 -g -fPIC -fp-model strict -fomit-frame-pointer -openmp -xhost'
以及numpy/distutil/fcompiler/intel.py中ifort的參數(最新版numpy里已經設置好了)。最后回到根目錄進行編譯:
sudo python2.7 setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install
因為使用的是64位系統,所以是intelem。由於用到了Intel的c與fortran編譯器(這二者也能帶來性能的提升),編譯前需要預先安裝icc以及ifc(直接emerge即可安裝)。注意,上述命令只編譯了python2.7版本的,而之后系統編譯scipy還需要py3k版本,所以還需要用python3.2再編譯一次,這樣兩種版本的numpy就都安裝在了系統中。至此我們已經從源碼安裝了numpy,且讓其鏈接上了最新的MKL庫。
現在產生了一個新的問題:使用emerge安裝scipy等其他依賴numpy的包時系統會自動安裝numpy,覆蓋掉我們手工安裝的numpy,這樣就又回到了之前的老路子。這時Gentoo靈活的配置性就體現出來了,通過echo "dev-python/numpy-1.7.0" >> /etc/portage/profile/package.provided
我們可以告訴系統numpy的1.7.0版本已經手動安裝好了,這樣系統之后安裝其他依賴包時就不會再動numpy了。當然,隔一段時間后numpy可能會發布新版本,這時更新系統會把已安裝的numpy覆蓋掉,所以要定期手動升級numpy。
上面這種方法的好處是最大程度保留了系統功能,讓系統去自動處理盡量多的任務,留給我們的任務僅僅是每隔一段時間更新Numpy。使用python做普通科學計算,其性能主要由numpy決定,因此保證numpy的最優就足夠。當然也可以手動編譯所有python數值計算庫,只是會在更新時多費些時間和精力。
實際測試中,這種方法安裝的numpy的速度稍快於MATLAB,不過numpy與scipy的自帶測試並沒有全部通過。這並不影響基本使用,因此我還未探究原因何在。