BLAS與LAPACK函式庫
BLAS(Basic Linear Algebra Subprograms)是一個應用程式介面(API)標準,用以規範發布基礎線性代數操作的數值庫(如向量或矩陣乘法)。該程式集最初發布於1979年,並用於建立更大的數值程式包(如LAPACK)。在高效能計算領域,BLAS被廣泛使用。
LAPACK,其名為Linear Algebra Package的縮寫,是用於數值計算的函式庫。 LAPACK提供了豐富的工具函式,可用於諸如解多元線性方程式、線性系統方程組的最小平方解、計算特徵向量、用於計算矩陣QR分解的Householder轉換、以及奇異值分解等問題。
由於Intel MKL學術使用免費,因此許多學術論文使用MKL。
- 近來也有許多論文使用Armadillo,此函式庫可將執行時的run-time library換成相容BLAS的函式庫如MKL。
BLAS按照功能被分為三個級別:
- Level1: 向量-向量計算
- Level2: 矩陣-向量計算
- Level3: 矩陣-矩陣計算
BLAS與LAPACK的來源可以分為下載source code自行compile後使用,與安裝library直接使用兩個主要的方式:
- source code: BLAS, LAPACK, ATLAS.
- library: Intel MKL, ACML, Elemental, etc.
在開始使用BLAS與LAPACK之前,需要特別注意使用者所使用的程式語言與BLAS/LAPACK實作程式語言特性的差別。BLAS/LAPACK是基於Fortran攥寫而成,因此對於C/C++使用者而言,必須特別注意幾點:
- Fortran起始index是1;而C/C++起始index是0
- Fortran多維array的記憶體排序是column-based;而C/C++是row-based
- Fortran interface for C
舉個簡單的例子,如果要進行的運算為求得array 1與array 2內積(dot product)的結果,可以從BLAS函式表中找到xDOT, xDOTU, xDOTC三個比較相似的結果:考量這三個function的適用範圍,其中xDOT的prefix是'S, D',xDOTU與xDOTC的prefix是'C, Z',從函式表第二頁左上角的Meaning of prefixes可以知道SDCZ的意思分別為
- S: single precision float point number, 如float, real(4)
- D: double precision float point number, 如double, real(8)
- C: single precision complex number, 如complex
, complex(8) - Z: double precision complex number, 如complex
, complex(16) - 假如array 1與array 2都是double型態,因此可以選用的就僅剩下xDOT,接著將prefix 'x'換為'D',DDOT就是需要使用的BLAS function。
#include "cblas.h"
int main() {
// do some other things
const int dim = 10;
int inc = 1;
double x[dim] = {};
double y[dim] = {};
double x_dot_y = cblas_ddot(&dim, x, &inc, y, &inc); //blas DDOT interface for c
// do some other things
}