clBLAS的主要目標是讓開發人員更容易地利用異構計算的固有性能和功耗優勢。clBLAS接口不隱藏也不包裝OpenCL接口,而是將OpenCL狀態管理留給用戶控制,以實現最大的性能和靈活性。
clBLAS庫生成並排隊優化的OpenCL內核,將用戶從自己編寫、優化和維護內核代碼的任務中解放出來。
Basic Linear Algebra Subprograms
基本線性代數子程序(BLAS)是一種規范,它規定了一組低級例程,用於執行常見的線性代數操作,如向量加法、標量乘法、點積、線性組合和矩陣乘法。
它們實際上是線性代數庫的標准低級例程;這些例程有C(“CBLAS接口”)和Fortran(“BLAS接口”)的綁定。盡管BLAS規范是通用的,但BLAS實現通常針對特定機器上的速度進行了優化,因此使用它們可以帶來實質性的性能優勢。BLAS實現將利用特殊的浮點硬件,如向量寄存器或SIMD指令。
它起源於1979年的Fortran庫[1],其接口由BLAS技術(BLAST)論壇標准化,其最新的BLAS報告可以在netlib網站上找到。[2]這個Fortran庫被稱為參考實現(有時被混淆地稱為BLAS庫),它沒有為速度進行優化,但處於公共領域
大多數提供線性代數例程的庫都遵循BLAS接口,允許庫用戶開發與所使用的BLAS庫無關的程序。BLAS庫的例子包括:OpenBLAS, BLIS(類BLAS庫實例化軟件),Arm性能庫、[5]ATLAS和Intel數學內核庫(MKL)。
AMD維護一個為AMD平台優化的BLIS分支ATLAS是一個可移植的庫,可以針對任意架構自動優化自身。MKL是一個免費軟件[7]和專有的[8]供應商庫,針對x86和x86-64進行了優化,並強調Intel處理器的性能OpenBLAS是一個為許多流行架構手工優化的開源庫。LINPACK基准測試很大程度上依賴BLAS常規gem進行性能度量。許多數值軟件應用程序使用blas兼容的庫來進行線性代數計算,包括LAPACK, LINPACK, Armadillo, GNU Octave, Mathematica,[10] MATLAB,[11] NumPy,[12] R, and Julia.
Background
隨着數值編程的出現,復雜的子程序庫變得很有用。這些庫將包含用於常見的高級數學運算的子程序,如求根、矩陣反演和求解方程組。選擇的語言是FORTRAN。最著名的數字編程庫是IBM的科學子程序包(SSP)。這些子程序庫允許程序員專注於他們的特定問題,避免重新實現眾所周知的算法。庫例程也會比一般的實現更好;例如,矩陣算法可能使用全旋轉來獲得更好的數值精度。庫例程也會有更高效的例程。例如,一個庫可以包含一個程序來求解上三角形矩陣。這些庫包括一些算法的單精度和雙精度版本。
最初,這些子程序對其低級操作使用硬編碼循環。例如,如果一個子例程需要執行一個矩陣乘法,那么該子例程將有三個嵌套循環。線性代數程序有許多常見的低級操作(所謂的“內核”操作,與操作系統無關)在1973年和1977年之間,確定了幾個這樣的內核操作這些內核操作成為數學庫可以調用的定義好的子例程。內核調用比硬編碼循環更有優勢:庫例程可讀性更強,出現bug的機會更少,內核實現可以優化速度。1979年出版的第1級基本線性代數子程序(BLAS)規范了這些使用標量和向量的核操作利用BLAS實現線性代數子程序庫LINPACK。
BLAS抽象允許對高性能進行定制。例如,LINPACK是一個通用庫,可以在許多不同的機器上使用,無需修改。LINPACK可以使用BLAS的通用版本。為了獲得性能,不同的機器可能使用定制的BLAS版本。隨着計算機結構變得越來越復雜,向量機出現了。BLAS的向量機可以使用機器的快速向量運算。(雖然向量處理器最終不再受歡迎,但現代cpu中的向量指令對於BLAS例程中的最佳性能至關重要。)
機器的其他特性變得可用,也可以被利用。因此,BLAS從1984年到1986年增加了與向量矩陣運算有關的第2級核運算。內存層次結構也被認為是可以利用的東西。許多計算機都有比主存快得多的高速緩存;將矩陣操作本地化可以更好地使用緩存。在1987年和1988年,3級BLAS被確定做矩陣矩陣操作。3級BLAS鼓勵塊分割算法。LAPACK庫使用3級BLAS
Functionality
BLAS的功能被分為三組稱為“級別”的例程,它們對應於定義和發布的時間順序,以及算法復雜性的多項式程度;1級BLAS操作通常需要線性時間,O(n), 2級操作需要二次時間,3級操作需要三次時間現代BLAS實現通常提供所有這三個級別。
Level 1
這個層次包括BLAS(1979)的原始表述中描述的所有例程,[1]只定義了跨步數組上的向量操作:點積、向量規范、形式的廣義向量加法
(稱為“axpy”,“ax + y”)和其他一些操作。
Level 2
這一層包含矩陣-向量運算,其中包括廣義矩陣-向量乘法(gemv):
以及線性方程中x的解算器
T是三角形的。2級BLAS的設計始於1984年,結果於1988年公布第2級子例程的目的是提高在向量處理器上使用BLAS的程序的性能,而第1級BLAS是次優的,“因為它們對編譯器隱藏了操作的矩陣-向量性質。
Level 3
這一層,正式出版於1990年,[19]包含矩陣-矩陣運算,包括“一般矩陣乘法”(gemm)的形式
其中A和B可以選擇轉置或隱士共軛在例程內,所有三個矩陣可以跨行。普通的矩陣乘法A B可以通過設置α為1和C為一個大小適當的全零矩陣來實現。
級別3中還包括用於計算的例程
其中T是一個三角矩陣,在其他函數中。
由於矩陣乘法在許多科學應用中無處不在,包括為實現其余的三級BLAS,[21]和因為更快的算法存在超越明顯的矩陣向量乘法的重復,gemm是優化BLAS實施人員的首要目標。例如,通過將A, B中的一個或兩個分解成塊矩陣,gemm可以遞歸實現。這是包含β參數的動機之一,[可疑的討論]以便可以累積以前區塊的結果。請注意,這種分解需要特殊情況β = 1,許多實現都對這種情況進行了優化,因此消除了每個c值的一次乘法。這種分解允許在產品中使用的數據的空間和時間上更好地本地化引用。反過來,這又利用了系統上的緩存對於具有多個緩存級別的系統,可以按照塊在計算中使用的順序第二次應用阻塞。這兩種級別的優化都在諸如ATLAS之類的實現中使用。最近,Kazushige Goto的實現表明,僅對L2緩存進行阻塞,結合對相鄰內存進行仔細的攤銷,以減少TLB的丟失,這比ATLAS.[23]要好GotoBLAS、OpenBLAS和BLIS是基於這些想法的高度優化的實現。
gemm3m gemm的常見變異,計算復雜產品使用“三個真正的矩陣乘法和五個矩陣添加,而不是傳統的四個真正的矩陣乘法和兩個矩陣添加”,一個算法類似於Strassen算法首先描述由彼得·安格[24]。
Implementations