跳轉到

附錄 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\) 為例:

  1. NumPy/SciPy 呼叫 LAPACK 的 dgesv;
  2. dgesv 內部反覆呼叫 BLAS Level 3 的 dgemm(分塊 LU);
  3. BLAS 實作(如 OpenBLAS 或 MKL)再將 dgemm 映射到 CPU 向量指令;若在 GPU 上,則由 cuBLAS 接手。

A.3 選庫建議#

  • 稠密、規模不大:LAPACK(透過 NumPy/Eigen/Armadillo 呼叫)幾乎永遠是答案。
  • 大規模稀疏:先試直接法 SuiteSparse(三維小問題、矩陣不太大時),否則 PETSc/Trilinos 的 Krylov 迭代法搭配預條件。
  • 需要極致效能且可接受商業授權:NAG/IMSL 提供經過長期驗證的完整演算法族。
  • 深度學習工作負載:cuDNN 處理卷積與注意力,cuBLAS 處理一般矩陣乘法。
  • 學術發表需求:優先選擇有 TOMS 認證或長期維護紀錄的實作,並在論文中註明函式庫版本與 BLAS 後端,以利重現。