天天看點

blas、lapack和atlas、openblas的差別聯系

1、Fortran語言

Fortran語言是為了滿足數值計算的需求而發展出來的一種程式設計語言。

Fortran語言的最大特性是接近數學公式的自然描述,在計算機裡具有很高的執行效率。它可以直接對矩陣和複數進行運算,自誕生以來廣泛地應用于數值計算領域,積累了大量高效而可靠的源程式。

許多科學計算庫的底層實作都是采用的Fortran語言,下面介紹的BLAS和LAPACK也不例外。

2、BLAS和LAPACK

BLAS的全稱是Basic Linear Algebra Subprograms,中文可以叫做基礎線性代數子程式。它定義了一組應用程式接口(API)标準,是一系列初級操作的規範,如向量之間的乘法、矩陣之間的乘法等。許多數值計算軟體庫都實作了這一核心。

BLAS是一組向量和矩陣運作的接口規範,也可以稱為API規範。Netlib用fortran實作了BLAS的這些API接口,得到的庫也叫做BLAS。Netlib隻是一般性地實作了基本功能,并沒有對運算做過多的優化。

LAPACK (linear algebra package),是著名的線性代數庫,也是Netlib用fortran語言編寫的。其底層是BLAS,在此基礎上定義了很多矩陣和向量進階運算的函數,如矩陣分解、求逆和求奇異值等。該庫的運作效率比BLAS庫高。

從某個角度講,LAPACK也可以稱作是一組科學計算(矩陣運算)的接口規範。Netlib實作了這一組規範的功能,得到的這個庫叫做LAPACK庫。

前面BLAS和LAPACK的實作均是用的Fortran語言。為了友善c程式的調用,Netlib開發了CBLAS和CLAPACK。其本質是在BLAS和LAPACK的基礎上,增加了c的調用方式。

3、第三方實作

上面提高,可以将BLAS和LAPACK看做是接口規範,那麼其他的組織、個人和公司,就可以根據此規範,實作自己的科學計算庫。

開源社群實作的科學計算(矩陣計算)庫中,比較著名的兩個就是atlas和openblas。它們都實作了BLAS的全部功能,以及LAPACK的部分功能,并且他們都對計算過程進行了優化。

Atlas (Automatically Tuned Linear Algebra Software)能根據硬體,在運作時,自動調整運作參數。Openblas在編譯時根據目标硬體進行優化,生成運作效率很高的程式或者庫。Openblas的優化是在編譯時進行的,是以其運作效率一般比atlas要高。但這也決定了openblas對硬體依賴性高,換了機器,可能就要重新編譯了。(例如A和B兩台機器cpu架構、指令集不一樣,作業系統一樣,在A下編譯的openblas庫,在B下無法運作,會出現“非法指令”這樣的錯誤)

商業公司對BLAS和LAPACK的實作,有Intel的MKL和AMD的ACML。他們對自己的cpu架構,進行了相關計算過程的優化,實作算法效率也很高。

NVIDIA針對其GPU,也推出了cuBLAS,用以在GPU上做矩陣運作。

blas、lapack和atlas、openblas的差別聯系

一些BLAS、LAPACK相關關系參考連結:

https://stackoverflow.com/questions/17858104/what-is-the-relation-between-blas-lapack-and-atlas

https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms

https://li7hui.wordpress.com/2012/02/19/blas-lapack-and-other-numerical-computation-libs/

CBLAS的安裝與使用

http://blog.csdn.net/cleverysm/article/details/1925549

kaldi中對所支援矩陣庫的說明

http://kaldi-asr.org/doc/matrixwrap.html

繼續閱讀