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
}

results matching ""

    No results matching ""