必威电竞|足球世界杯竞猜平台

blas
來源:互聯網

BLAS(基礎線性代數子程序庫)是一個應用程序接口(API)標準,用于規范發布基礎線性代數操作的數值庫,如矢量或矩陣乘法。該程序集最初發布于1979年,并用于建立更大的數值程序包(如lapack)。在高性能計算領域,BLAS被廣泛使用。例如,linpack的運算成績很大程度上取決于BLAS中子程序DGEMM的表現。為提高性能,各軟硬件廠商針對其產品對BLAS接口實現進行高度最佳化。BLAS的實現通常會利用特殊的浮點硬件,如向量寄存器或SIMD指令。BLAS的最新報告可以在網絡庫網站上找到。此外,大多數數值軟件應用程序都使用BLAS兼容的庫來進行線性代數計算,包括LAPACK、LINPACK、Armadillo、GNU Octave、Mathematica、MATLAB、NumPy、R和Julia。

背景

隨著數值編程的出現,復雜的子例程庫變得有用。這些庫將包含常見高級數學運算的子例程,例如求根、矩陣求逆和求解方程組。選擇的語言是Fortran。最著名的數值編程庫是IBM的Scientific Subroutine Package (SSP)。這些子例程庫使程序員能夠專注于他們的具體問題并避免重新實現眾所周知的算法。庫例程也將比一般實現更好;例如,矩陣算法可能會使用完全旋轉來獲得更好的數值精度。庫例程還將具有更高效的例程。例如,庫可能包括求解上三角矩陣的程序。這些庫將包括某些算法的單精度和雙精度版本。

最初,這些子例程使用硬編碼循環進行低級操作。例如,如果一個子程序需要執行矩陣乘法,則該子程序將具有三個嵌套循環。線性代數程序有許多常見的低級運算(所謂的“內核”運算,與操作系統無關)。1973 年至 1977 年間,確定了其中一些內核操作。這些內核操作成為數學庫可以調用的已定義子例程。內核調用比硬編碼循環具有優勢:庫例程更具可讀性,出現錯誤的機會更少,并且可以優化內核實現的速度。這些使用標量向量的內核運算的規范,即 1 級基本線性代數子例程 (BLAS),于 1979 年發布。BLAS 用于實現線性代數子例程庫LINPACK。

BLAS 抽象允許定制以獲得高性能。例如,linpack 是一個通用庫,無需修改即可在許多不同的機器上使用。LINPACK 可以使用 BLAS 的通用版本。為了獲得性能,不同的機器可能會使用定制版本的 BLAS。隨著計算機體系結構變得更加復雜,向量機出現了。向量機的 BLAS 可以使用機器的快速向量運算。(雖然矢量處理器最終失寵,但現代 CPU 中的矢量指令對于 BLAS 例程的最佳性能至關重要。)

其他機器功能也變得可用并且也可以被利用。因此,從 1984 年到 1986 年,BLAS 通過涉及向量矩陣運算的 2 級內核運算得到了增強。內存層次結構也被認為是可以利用的東西。許多計算機都有比主存快得多的高速緩存;保持矩陣操作本地化可以更好地利用緩存。1987 年和 1988 年,3 級 BLAS 被確定用于執行矩陣矩陣運算。3 級 BLAS 鼓勵塊分區算法。lapack庫使用 3 級 BLAS。

最初的 BLAS 僅涉及密集存儲的向量和矩陣。BLAS 的進一步擴展(例如稀疏矩陣)已經得到解決。

更新內容

BLAS的接口由BLAS技術(BLAST)論壇標準化,提供了C(“CBLAS接口”)和Fortran(“BLAS接口”)的綁定,確保了其廣泛的適用性和易用性。BLAS的參考實現屬于公共領域,雖然它并沒有針對速度進行優化,但它為其他優化實現提供了基準。針對不同硬件平臺的優化實現,如cuBLAS(英偉達 GPU)、rocBLAS(AMD GPU)和OpenBLAS,使得BLAS能夠在異構計算架構中實現高效的線性代數運算。此外,BLIS(類似BLAS的庫實例化軟件)、Arm性能庫、asp.net ajax英特爾數學核心庫(iMKL)等基于CPU的BLAS庫分支也為性能提升做出了貢獻。AMD針對其平臺優化了BLIS分支,而ATLAS是一個可以自動優化以適應任意架構的便攜式庫。iMKL是專門針對x86和x86-64架構優化的庫,而OpenBLAS是一個開源庫,為多種流行架構提供了手動優化。linpack基準測試,一個重要的性能測量工具,嚴重依賴于BLAS例程gemm。這些優化實現的存在,使得BLAS不僅在功能上兼容,而且在性能上也能滿足不同計算需求。

參考資料 >

生活家百科家居網