LAPACK
如果矩陣的規模較小,直接按照公式展開計算倒是看不出性能上有什麼大問題,比如兩個二維方陣相乘,計算公式如下
但是,隨着矩陣規模的增大,這種計算方式的性能瓶頸就比較突出了,根本無法滿足正常的業務需要。
下面介紹基於 BLAS (Basic Linear Algebra Subprograms) 算法庫的線性代數庫 LAPACK (Linear Algebra PACKage),該庫是用 Fortran 編寫的算法庫,是爲了解決通用的線性代數問題的。不少計算機廠商都提供了針對不同處理器進行了優化的 BLAS/LAPACK 算法包,例如 Intel 的 MKL (Math Kernel Library,商業版),AMD 的 ACML 等。在 Matlab 的 bin 目錄裏可以發現 MKL、blas、lapack 的蹤影,所以由此推斷,Matlab 底層應該也是使用了 BLAS/LAPACK 庫的。
CLAPACK
CLAPACK 是使用 f2c 工具將 LAPACK 的 Fortran 代碼轉換成 C 語言代碼的 C 語法算法包,其主頁是 http://www.netlib.org/clapack,下面介紹如何在 windows 系統中編譯生成 CLAPACK 庫。
環境準備
- Windows 10
- Visual Studio 2019(受支持的其它版本亦可)
- 下載 cmake,並安裝到系統上
- 在 CLAPACK 的主頁 http://www.netlib.org/clapack 下載源碼包
clapack-3.2.1-CMAKE.tgz
,並解壓
編譯 CLAPACK 源碼
首先,打開 CMake(cmake-gui)應用程序,如下圖所示
第一步,輸入 clapack 源碼目錄;第二步,指定一個新目錄,用於存放要生成的解決方案 (CLAPACK.sln);第三步,設置要生成的解決方案的參數,如下圖所示
選擇使用 Visual Studio 16 2019
生成工程,並指定 x64
平臺(後面可以按照同樣的步驟生成 win32
或其它平臺下的工程),點擊 Finish 按鈕,就會開始生成解決方案了。如果生成後有紅色的錯誤提示信息,如下圖所示,點擊按鈕 Generate 重新生成即可,可能需要執行兩次,錯誤提示信息纔會消失。
之後就可以到生成的解決方案目錄下,打開解決方案 CLAPACK.sln
,並分別編譯 Debug 和 Release 版本。然後,就可以分別到對應的工程目錄下找到編譯好的庫文件,有以下三個:
blas.lib
libf2c.lib
lapack.lib
而引用上述靜態庫所需要包含的頭文件,則可以在 CLAPACK 源碼目錄下的 INCLUDE 目錄下找到,有以下三個文件:
blaswrap.h
clapack.h
f2c.h
將編譯好的靜態庫文件和需引用的頭文件收集到一起,就可以提供給其它動態庫或應用程序引用。