附錄 A 常用計算數學函式庫結構對照#
計算數學的實務發展與「程式庫」密不可分。1970 年代之前,數值方法多半以論文附錄或卡片堆的形式流通;ACM 自 1960 年起設立 Algorithms 版(後演變為 Collected Algorithms),並自 1973 年創刊 ACM Transactions on Mathematical Software(TOMS),凡是刊登的演算法都附有經認證、可執行的程式碼,這是「軟體也可如同論文被審查」的制度化起點。同一年代,IMSL(International Mathematical and Statistical Libraries,1970 年由美國 Houston 的 Visual Numerics 前身推出)與英國 NAG(Numerical Algorithms Group,1970 年由牛津、劍橋等大學組成的聯盟成立,最初是各大學中心共享的 ICL 1906/1907 機器軟體計畫,後來發展為跨平台商業庫)確立了商業數值庫的兩大傳統。另一方面,1979 年問世的 LINPACK、其後繼 LAPACK(1992)、以及底層的 BLAS 規範(1979 年由 Lawson 等人發表,1988/1990 年擴充為 Level 2、Level 3),則成為所有現代線性代數軟體的事實標準。以下表格彙整常用函式庫的功能、語言、授權與代表函式。
A.1 綜合對照表#
| 函式庫 | 誕生年份 | 主要功能 | 主要語言 | 授權 | 代表函式 / 模組 |
|---|---|---|---|---|---|
| BLAS | 1979(Level 1),1988/1990(Level 2/3) | 基礎向量、矩陣—向量、矩陣—矩陣運算規範 | Fortran | 公有領域規範(各廠商實作) | ddot、dgemv、dgemm |
| LAPACK | 1992 | 稠密線性代數:求解、特徵值、SVD | Fortran | 修正 BSD | dgesv(LU)、dsyevd、dgesdd(SVD) |
| FFTW | 1997(Frigo & Johnson) | 快速傅立葉轉換(任意維度、自適應計畫) | C | GPL / 商業雙授權 | fftw_plan_dft_1d、fftw_execute |
| SuiteSparse | 1990s 起(Davis 等人) | 稀疏直接法:Cholesky、LU、QR | C/C++ | LGPL / 修正 BSD 視模組 | CHOLMOD、UMFPACK、SPQR |
| PETSc | 1991(Argonne 國家實驗室) | 稀疏線性系統、非線性求解、Krylov 子空間法、區域分解 | C(附 Python/Fortran 介面) | BSD-2 | KSPCG、KSPGMRES、SNES、PC(預條件) |
| Trilinos | 1999–2003(Sandia 國家實驗室) | 組件化的大規模科學計算:線性代數、線代求解器、離散化 | C++ | BSD-3 | Epetra/Tpetra、AztecOO、Ifpack2、Kokkos |
| NumPy | 2006(繼承 1995 年 Numeric) | N 維陣列與向量化計算 | Python/C | BSD-3 | numpy.linalg.solve、numpy.fft |
| SciPy | 2001 | 科學計算生態:最佳化、積分、稀疏、特殊函數 | Python/C/Fortran | BSD-3 | scipy.sparse.linalg.cg、scipy.optimize、scipy.linalg.svd |
| DifferentialEquations.jl | 2017(Rackauckas & Nie) | 常微分、隨機微分、微分代數、延遲微分方程求解 | Julia | MIT | solve(prob, Tsit5())、Rodas5、CVODE_BDF |
| NAG Library | 1970 | 全面的數值與統計演算法商業庫 | Fortran/C 起家,多語言介面 | 商業授權 | f07aef(LU)、e04 系列(最佳化) |
| IMSL | 1970 | 數值與統計演算法商業庫 | Fortran(後有 C 版) | 商業授權 | LSARG(線性系統)、DLINP |
| Eigen | 2008 | 標頭檔式稠密線性代數模板庫 | C++ | MPL2 | MatrixXd::lu()、SelfAdjointEigenSolver |
| Armadillo | 2010 | MATLAB 風格語法的 C++ 線性代數庫(後端 LAPACK/BLAS) | C++ | Apache 2.0 | arma::solve(A, b)、arma::svd |
| cuBLAS | 2007(隨 CUDA 發布) | GPU 上的 BLAS 實作 | CUDA C | NVIDIA 專有(免費散布) | cublasSgemm、cublasDgemm |
| cuDNN | 2014 | GPU 深度學習原語:卷積、池化、RNN、注意力 | CUDA C | NVIDIA 專有(免費散布) | cudnnConvolutionForward、cudnnBatchNormalizationForwardTraining |
A.2 依功能分層的典型呼叫鏈#
實務上這些庫常以「分層」方式協作,一個典型的科學計算軟體堆疊如下:
- 應用層:DifferentialEquations.jl、SciPy、Trilinos 應用程式
- 演算法層:LAPACK、PETSc/KSP、SuiteSparse、SciPy
optimize - 核心層:BLAS(OpenBLAS、Intel MKL、Apple Accelerate、cuBLAS 等實作)
- 硬體層:CPU SIMD 指令、GPU 核心與 Tensor Core
以求解稠密線性系統 \(Ax=b\) 為例:
- NumPy/SciPy 呼叫 LAPACK 的
dgesv; dgesv內部反覆呼叫 BLAS Level 3 的dgemm(分塊 LU);- BLAS 實作(如 OpenBLAS 或 MKL)再將
dgemm映射到 CPU 向量指令;若在 GPU 上,則由 cuBLAS 接手。
A.3 選庫建議#
- 稠密、規模不大:LAPACK(透過 NumPy/Eigen/Armadillo 呼叫)幾乎永遠是答案。
- 大規模稀疏:先試直接法 SuiteSparse(三維小問題、矩陣不太大時),否則 PETSc/Trilinos 的 Krylov 迭代法搭配預條件。
- 需要極致效能且可接受商業授權:NAG/IMSL 提供經過長期驗證的完整演算法族。
- 深度學習工作負載:cuDNN 處理卷積與注意力,cuBLAS 處理一般矩陣乘法。
- 學術發表需求:優先選擇有 TOMS 認證或長期維護紀錄的實作,並在論文中註明函式庫版本與 BLAS 後端,以利重現。