【Python筆記】如何源碼編譯依賴LAPACK和ATLAS庫的NumPy包

來源:互聯網
上載者:User

標籤:python   lapack   altas   numpy   install   

上篇筆記介紹了不依賴lapack和atlas庫的NumPy包源碼編譯/安裝方法,但“純淨版”的NumPy會損失效能,故本篇筆記說明如何源碼編譯安裝依賴lapack和atlas庫的NumPy包。

1. GCC版本要求 
使用較新版本的GCC工具集(盡量不低於v4.7)且整合有gfortran編譯器。
備忘1:這裡大寫的"GCC"是指GNU Compiler Collection,它除包含C語言編譯器gcc外,還包含很多其它語言的編譯器(如g++/gfortran等)
備忘2:3.x版的的C語言編譯器gcc會由於某些標頭檔缺失導致編譯atlas庫報錯
備忘3:若GCC工具集中沒有gfortran編譯器,則編譯lapack庫時會遇到一些莫名其妙的錯誤(因為lapack是用fortran編寫的),好在GCC4.7及以上版本中已經整合了gfortran編譯器
在GCC版本符合要求的前提下,臨時將其加入環境變數PATH並設定動態庫尋找路徑:

$ export PATH=/home/slvher/tools/gcc48/bin/:$PATH$ export LD_LIBRARY_PATH=/home/slvher/tools/gcc48/lib64:/home/slvher/tools/gcc48/lib
備忘4:在當前shell會話中臨時設定LD_LIBRARY_PATH可以保證編譯過程中正確搜尋到GCC庫,但最好不要設定到.bash_profile中,因為那樣會影響其它程式的尋找路徑,可能會踩到坑。
備忘5:這裡提到的GCC的版本要求及環境變數設定如果沒有出差錯,那麼下面的編譯會比較順利,否則會遇到各種編譯/連結問題,後續我會用一篇筆記來記錄這些踩坑的過程及遇到這些詭異問題時的分析思路,這裡不贅述。

2. 編譯LAPACK和ATLAS庫
lapack是用fortran開發的經過特別最佳化的線性代數計算庫;atlas也是一個最佳化過的線性代數計算庫,它提供了BLAS庫的全部API(包括C介面和Fortran介面),還實現了lapack庫中的部分函數,atlas在編譯過程中會根據機器的配置參數來調整科學計算函數的參數,以便在該機器上達到更好的計算效能。
初看起來,需要分別編譯lapack和atlas兩個庫,所幸的是,atlas庫支援編譯時間自動編譯lapack庫,因此,只需正確完成atlas庫的編譯配置,編譯atlas庫就可以了。
下面是編譯atlas/lapack庫的主要步驟。
1)
分別從官網下載lapack源碼包和atlas源碼包,我下載的是目前的最新版lapack-3.5.0.tgz及atlas3.10.2.tar.bz2
2) 解壓atlas源碼壓縮包:tar -jxvf atlas3.10.2.tar.bz2
3) cd ATLAS && mkdir BLDdir && cd BLDdir
4) 執行configure命令以配置編譯參數
$ ../configure --shared -b 64 --prefix=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs --with-netlib-lapack-tarfile=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/lapack-3.5.0.tgz 
其中,--shared表明要編譯atlas共用庫(configure會自動在編譯命令中插入"-fPIC"參數,無需在這裡顯式指定);--prefix指定編譯結果的安裝路徑;--with-netlib-lapack-tarfile表明編譯atlas庫時會用相同的編譯器及編譯/連結參數自動編譯lapack庫,這裡指定lapack源碼包的路徑後,configure運行後會自動解壓lapack源碼並將其拷貝至BLDdir/src/lapack/reference/這個目錄下。
5) configure運行完後,BLDdir目錄下產生了Make.inc檔案,該檔案中設定了眾多編譯參數(如尋找路徑、編譯產出路徑、編譯器、傳給編譯器的參數,等等),BLDdir子目錄下很多模組的Makefile都會include這個Make.inc,包括源碼獨立的lapack包,可見,這個Make.inc檔案可以達到統一編譯環境的目的。
6) make build
7) make check
8) make ptcheck
9) make install
如果上述一系列命令均執行成功,那麼編譯完成的*.a和*.so庫會安裝到--prefix參數指定的路徑下,這些庫的標頭檔也會被拷貝到安裝路徑下的include目錄。
至此,ATLAS和LAPACK庫均完成編譯,其中LAPACK庫是.a靜態庫,ATLAS庫是.so動態庫。事實上,ATLAS的動態庫中已經包含了LAPACK靜態庫的所有符號和代碼。
下面可以開始編譯依賴LAPACK和ATLAS庫的NumPy包了。

3. 編譯最佳化版NumPy包
前提:官網下載NumPy源碼包並解壓,這裡以目前最新版numpy-1.9.2.tar.gz為例進行說明。
1) cd至解壓目錄numpy-1.9.2
2) cp site.cfg.example site.cfg
3) 在site.cfg中配置atlas項,其中include_dirs和library_dirs是atlas庫安裝路徑下的include和lib目錄

[atlas]atlas_libs   = lapack,f77blas,cblas,atlaslibrary_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/libinclude_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include
4) python setup.py config
5) python setup.py build --fcompiler=gnu95 ## 指定Fortran編譯器為GCC4.8工具集中的gfortran 
6) python setup.py install
正常情況下,build成功後,install會把編譯產出拷貝到當前python解譯器安裝路徑下的lib/python2.7/site-packages目錄中。
此時,可以通過下面的例子來查看NumPy包的配置情況:
>>> import numpy as np>>> np.__config__.show()atlas_3_10_blas_threads_info:    libraries = ['lapack', 'f77blas', 'cblas', 'atlas']    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']    define_macros = [('HAVE_CBLAS', None), ('ATLAS_INFO', '"\\"3.10.2\\""')]    language = c    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']lapack_opt_info:    libraries = ['tatlas', 'lapack', 'f77blas', 'cblas', 'atlas']    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']    define_macros = [('ATLAS_INFO', '"\\"3.10.2\\""')]    language = f77    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']blas_opt_info:    libraries = ['lapack', 'f77blas', 'cblas', 'atlas']    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']    define_macros = [('HAVE_CBLAS', None), ('ATLAS_INFO', '"\\"3.10.2\\""')]    language = c    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']openblas_info:  NOT AVAILABLEopenblas_lapack_info:  NOT AVAILABLEatlas_3_10_threads_info:    libraries = ['tatlas', 'lapack', 'f77blas', 'cblas', 'atlas']    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']    define_macros = [('ATLAS_INFO', '"\\"3.10.2\\""')]    language = f77    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']lapack_mkl_info:  NOT AVAILABLEblas_mkl_info:  NOT AVAILABLEmkl_info:  NOT AVAILABLE
也可以用具體的例子來驗證其功能是否正常:
>>> import numpy as np>>> np.arange(15).reshape(3, 5)array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])>>> >>> a = np.arange(15).reshape(3, 5)>>> aarray([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])>>> type(a)<type 'numpy.ndarray'>>>>>>>>>> from numpy.linalg import *>>> b = np.array([[1.0, 2.0], [3.0, 4.0]])>>> barray([[ 1.,  2.],       [ 3.,  4.]])>>> b.transpose()array([[ 1.,  3.],       [ 2.,  4.]])>>> inv(b)array([[-2. ,  1. ],       [ 1.5, -0.5]])>>>

【參考資料】
1. Example: Installing ATLAS with full LAPACK on Linux/AMD64  
2. SciPy.org - Building everything from source with gfortran on Ubuntu 
3. SciPy.org - Building and installing NumPy  

======================= EOF ======================


【Python筆記】如何源碼編譯依賴LAPACK和ATLAS庫的NumPy包

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.