當前位置:首頁 » 編程軟體 » lapack編譯

lapack編譯

發布時間: 2024-06-09 04:39:46

㈠ 怎麼源碼編譯依賴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並設置動態庫查找路徑:
[plain] view plain
在CODE上查看代碼片派生到我的代碼片
$ 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命令以配置編譯參數
[plain] view plain
在CODE上查看代碼片派生到我的代碼片
$ ../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目錄
[plain] view plain
在CODE上查看代碼片派生到我的代碼片
[atlas]
atlas_libs = lapack,f77blas,cblas,atlas
library_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib
include_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包的配置情況:
[python] view plain
在CODE上查看代碼片派生到我的代碼片

>>>importnumpyasnp
>>>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:
NOTAVAILABLE
openblas_lapack_info:
NOTAVAILABLE
atlas_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:
NOTAVAILABLE
blas_mkl_info:
NOTAVAILABLE
mkl_info:
NOTAVAILABLE
也可以用具體的例子來驗證其功能是否正常:
[python]viewplain
在CODE上查看代碼片派生到我的代碼片
>>>importnumpyasnp
>>>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)
>>>a
array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14]])
>>>type(a)
<type'numpy.ndarray'>
>>>
>>>
>>>fromnumpy.linalgimport*
>>>b=np.array([[1.0,2.0],[3.0,4.0]])
>>>b
array([[1.,2.],
[3.,4.]])
>>>b.transpose()
array([[1.,3.],
[2.,4.]])
>>>inv(b)
array([[-2.,1.],
[1.5,-0.5]])
>>>
熱點內容
android仿網易 發布:2024-11-08 03:21:39 瀏覽:954
編譯需要指令集嗎 發布:2024-11-08 03:15:14 瀏覽:230
藍鷗php培訓 發布:2024-11-08 02:56:29 瀏覽:653
電腦配置xp是什麼意思 發布:2024-11-08 02:56:27 瀏覽:339
軟體自帶伺服器地址怎麼辦 發布:2024-11-08 02:55:45 瀏覽:577
幸福密碼電視劇講述了什麼 發布:2024-11-08 02:55:40 瀏覽:425
win7文件夾看不到文件 發布:2024-11-08 02:55:37 瀏覽:666
蘋果安卓戰力哪個高 發布:2024-11-08 02:45:04 瀏覽:532
安卓備份哪個系統好 發布:2024-11-08 02:35:50 瀏覽:736
unlinklinux 發布:2024-11-08 02:31:30 瀏覽:663