numpy使用MKL庫提公升計算效能

2021-08-04 22:14:35 字數 2151 閱讀 3956

系統: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: numpy

首先在根目錄中加入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的自帶測試並沒有全部通過。這並不影響基本使用,因此我還未**原因何在。

玩轉Numpy計算庫

numpy是python語言的乙個擴充套件程式庫。支援多維陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。numpy是人工智慧 資料分析從業者必備的知識和技能,也是學習後續python擴充套件庫 matplotlib,scipy,pandas,seaborn,scikit image等 的基...

Numpy計算庫(3)陣列的計算

1.一元計算 arr np.arange 24 reshape 2,3,4 生成2個3 4的矩陣 print arr 1.1計算平均值 arr.mean 計算平均值 系統自帶 a arr.mean print a 計算所有數字的數字的平均值 np.mean arr 模組numpy計算 計算速度快 c...

科學計算庫Numpy 陣列(ndarray)

學過其他強型別語言的朋友都知道陣列是一種資料型別,它裡面的元素必須是同一種型別,類似python的列表,但是這種列表只能是同種元素。用法numpy.array list tuple import numpy as np 重新命名numpy為np arr np.array 1,2,3,4,5,6 建立...