C 線性運算庫梳理及Win Linux下編譯小記

2021-08-11 00:15:28 字數 2965 閱讀 7704

由於筆者在學習工作中需要大量用到c++線性運算庫進行科學計算,在配置環境的摸索過程中趟了不少坑,所以寫下常用工具以及配置心得,以備日後查閱,也方便新來者快速上手。

稀疏矩陣求解庫

blas lapack 的含義與關係

openblas 在 visual studio 中的使用

suitesparse 在 visual studio 下的編譯

c++中可用的線性運算庫有很多種,筆者也見過很多做計算機的同仁不滿意現有的庫,自己實現線性運算庫。然而筆者並不打算自己重新造輪子,畢竟計算機領域的一大優勢就在於我們能通過開源的優秀**,站在別人的肩膀上更進一步。在做過一些調查以後,筆者主要介紹兩個c++線性運算庫,其中 eigen 是筆者工作生產中常用的庫。

eigen 是一款十分著名的線性運算模板庫, eigen 支援稠密矩陣(dense matrix)和稀疏矩陣(sparse matrix)運算,並內建實現了對兩種矩陣的求解器(solver)。使用 eigen 十分簡單,因為是模板庫,所以只需要將標頭檔案拷入 include 目錄即可,缺點是編譯時比較費時。eigen 的稠密矩陣運算在某些平台上的效能甚至接近 intel

® mkl [1]。雖然 eigen 的求解器從效率來講並不算最好,但將其作為矩陣容器是乙個很好的選擇,在求解大型問題時再通過連向諸如 suitesparse 等頂級求解器即可。tensorflow 即使用了eigen。在 3.3 之後,eigen 引入了對其他 blas 的介面,支援了包括 mkl,openblas 等高效能庫,使得其效能還可能更進一步提高。

eigen 與 armadillo 提供了較好的矩陣容器以及 c++ 呼叫介面,也實現了稠密矩陣和稀疏矩陣的簡單求解,但是對於一些特定問題的求解並不是最優,比如高效能計算界研究了很多年的稀疏矩陣求解(sparse matrix solver)。對於標準的 lu/qr/cholesky 分解,高效能計算界已經有成熟高效的計算庫如 suitesparse。所以在追求計算速度的科研領域,還是需要掌握這些更複雜的求解庫的使用。

suitesparse 是現在科學界和工業界最強大的基於 blas/lapack 的多種稀疏矩陣求解演算法合集,其中包括了lu分解演算法(umfpack), cholesky分解(cholmod), qr分解演算法(spqr)等演算法的實現。matlab 的矩陣求解就是使用的 suitesparse 的實現,可以說是相當的強大。筆者工作中就極度依賴 suitesparse 提供的加速,比如使用 eigen 的自帶稀疏矩陣求解器就要比使用 suitesparse 慢一兩個數量級。

superlu 針對lu分解所寫的庫,和 umfpack 具有相同的使用範圍,在各測試集上表現也各有優劣,筆者較為推薦 umfpack,因為可以在 suitesparse 中一併安裝。

在涉及線性運算的領域,幾個術語blas, lapack是繞不過的,筆者最開始時是各種懵逼,在安裝線性運算庫時各種踩坑,之後在實踐中才慢慢摸索清楚它們之間的關係。筆者就將我的理解總結在下面,如有筆誤也歡迎指正。

blas 全稱為 basic linear algebra subprograms,是乙個api標準,其設計目的是為了提供對向量和矩陣計算的基礎支援,具體分為blas1(向量間運算),blas2(矩陣與向量計算),blas3(矩陣與矩陣計算)。設計blas的原因是由於不同的計算機硬體架構(匯流排、各級快取、cpu暫存器數量),邏輯上相同的運算在寫為機器碼過程中有很大的優化空間,所以通過這樣乙個標準來分離底層運算及更高階的呼叫,達到較好的跨平台性及運算速度。現在較為知名的blas實現是 netlib 的 cblas, 第乙個做到跨平台可伸縮的 atlas,boost 提供的ublas,以及 gotoblas2 的繼承改進版 openblas,還有intel專門為intel處理器開發的mkl。

lapack 全稱 linear algebra package,是乙個基於 level 3 blas 的線性代數數值計算庫,其繼承了linpack的線性方程求解和最小二乘求解,eispack的特徵值求解,以及實現了多種矩陣分解演算法(lu, cholesky, qr, svd, schur, generalized schur)。最新的 lapack 是由fortran 90寫成的。lapacke 是 lapack 的 c 語言api。

比較全的介紹可以在 blas 的 wiki 中找到,以下主要談一談筆者的體會。

openblas 是筆者現在使用的 blas 庫,其繼承了 gotoblas2 的設計,還對 lapack 實現進行了優化,具有較好的效能。雖然趕不上 mkl 在 intel x86-64 計算機上的效能,但是由於其開源性,筆者可以不用擔心哪天 mkl 又不免費了。而且正是因為這些開源軟體不斷提高的品質才使得商業公司不得不免費提供他們的產品給社群以保持市場占有。所以雖然 openblas 在效能上落於 mkl 之下,筆者仍然將其放在第一位。

atlas 全稱 automatically tuned linear algebra software,是乙個可以對任何計算機硬體生成優化過的blas庫的軟體。雖然在對指定硬體架構上效能不及專門優化過的blas庫,其自動生成能力使得它能夠對任意新系統生成第乙個優化過的blas庫,並作為後來者的對比基準。

cblas 是netlib提供的基於 fortrain 實現的 blas 的c語言api,其存在價值在於通常預設安裝於系統中。

ublas 是 boost 包提供的 c 語言 blas 實現,效能不敢恭維。

clblas 是 blas 基於 opencl 的實現,主要針對並行和 amd gpu進行了優化。clblas的優點是它為開源專案,其作用之於 nvidia 類似於 openblas 之於 intel。

suitesparse 不提供 windows 下編譯安裝的官方支援,但是 github 上有大神做了乙個出來 suitesparse-metis-for-windows,按照說明一步一步安裝再編譯就不會有什麼問題。在配置 cmake 時可以手動指定使用的 blas 庫,比如 openblas。

windows kit corcert_math rint issue

[1] 矩陣運算庫blas, cblas, openblas, atlas, lapack, mkl之間有什麼關係,在效能上區別大嗎? - 蝙蝠果的回答 - 知乎

python 運算子及優先順序關係梳理

取餘數,注意負數的取餘,要根據除數的正負,來套用公式判斷餘數是多少,如果被除數和除數都是負數,就在正常結果前面加上負號 冪運算 次方 地板除,取整除 是賦值 是比較 py3.8,可在表示式內部為變數賦值 a 15 b 8 a 0000 1111 b 0000 1000 a b 0000 1000 8...

C 矩陣運算庫推薦

最近在幾個地方都看到有人問c 下用什麼矩陣運算庫比較好,順便做了個調查,做一些相關的推薦吧。主要針對稠密矩陣,有時間會再寫乙個稀疏矩陣的推薦。許可證 mpl 2.0 目前使用比較廣的c 矩陣運算庫之一,是在c 下使用matlab方式操作矩陣很好的選擇,許多matlab的矩陣操作函式都可以找到對應,這...

C 矩陣運算庫推薦

矩陣運算再很多數學演算法中經常用到,不懂矩陣,就不算真正理解現代數學。大量現代高階演算法都需要用到矩陣運算,根據之前的工作,順便做了個調查,做一些相關的推薦吧。許可證 mpl 2.0 目前使用比較廣的c 矩陣運算庫之一,是在c 下使用matlab方式操作矩陣很好的選擇,許多matlab的矩陣操作函式...