數值線性代數

BLAS 與 LAPACK

BLAS 和 LAPACK 是數值線性代數的基石庫——幾乎每一個科學計算工具,從 NumPy、MATLAB 到深度學習框架,底層都調用的那些高度優化的代碼。BLAS 提供底層構件(向量與矩陣運算);LAPACK 在其上構建高層求解器(線性系統、最小二乘、特徵值、SVD)。兩者合在一起,正是快速、正確的線性代數成為一次庫調用而非一個研究課題的原因。

BLAS 按算術與資料搬運的關係分為三級。第一級是向量-向量(如點積和 saxpy),對 O(n) 資料做 O(n) 工作。第二級是矩陣-向量,對 O(n^2) 資料做 O(n^2) 工作。第三級是矩陣-矩陣,對僅 O(n^2) 的資料做 O(n^3) 算術——而這個不平衡正是秘訣。第三級把每個載入的資料元素多次重用,故能接近機器的峰值速度執行;其餘兩級則被記憶體頻寬餓著。

這正是現代演算法分塊的原因:它們被改寫為盡可能多地耗在第三級矩陣-矩陣核上,把矩陣劃分為能放進快取的瓦片並逐瓦片運算。LAPACK 的分解全都分塊,正是為了讓其 O(n^3) flop 的大頭落在調校良好的第三級 BLAS 裡,達到峰值性能的一大部分,而不被記憶體流量扼住。

實用的智慧很直白:別自己寫。廠商調校的 BLAS 實現(OpenBLAS、Intel MKL、Apple Accelerate)和 LAPACK 裡的演算法,凝結了數十年在數值穩定性、快取分塊和並行性上的工作,是一個手寫的三重循環無法企及的——速度上往往差一到兩個數量級,且準確性保證好得多。去用庫吧。

Level 1: O(n) flops / O(n) data; Level 2: O(n^2)/O(n^2); Level 3: O(n^3)/O(n^2)

第三級 BLAS 對二次的資料做三次的算術,故大量重用快取資料並接近峰值速度執行——這是分塊演算法的基礎。

BLAS 是一套介面(一份規範),而非單個程式。許多實現都遵循它——參考 BLAS、OpenBLAS、MKL、BLIS——它們在計算相同結果的同時,速度可相差幾個數量級,這正是你連結哪個 BLAS 可能影響巨大的原因。

又稱
Basic Linear Algebra SubprogramsLinear Algebra PACKage