1. 程式人生 > >稀疏超大型線性方程組求解

稀疏超大型線性方程組求解

筆者近期工作需要求解線性方程組,但基本不懂執行緒方程組求解,本來寄希望於Eigen,結果發現

  1. 稠密矩陣方面,Eigen在功能還算全面(雖然經網友對比,Eigen慢於OpenBLAS和Intel MKL),
  2. 稀疏矩陣方面,著實差了點,自帶的幾個求解器,按官網推薦,嘗試了SimplicialLLT和BiCGSTAB ,筆者的方程組嚴格對稱且對角線絕對佔優,但SimplicialLLT慢得不能用,BiCGSTAB直接算不過去。

我只能放棄用Eigen自帶的稀疏方程求解器。幸好Eigen支援很多第三方求解器。列在這個頁面

在網上搜索了下,得到了簡單的對比詳細對比,還有一些討論帖,帖1帖2帖3

。大體有Intel MKL、PETSc 、Trilinos、UMFPACK、SUPERLU、SuiteSparse和cuSPARSE。
由於有了Eigen的初級使用經驗,想著還是少寫程式碼為妙,於是我還是想選Eigen給了支援的,那麼Intel MKL 和SuiteSparse成為了選擇。

以下均在程式中使用12000*12000的矩陣測試,但這個矩陣以12X12的子矩陣為子單元,絕大部分是空的。目前程式中使用的演算法是定製的SOR演算法,矩陣大時計算太慢,做為基準,在算例中計算大約30次只要41秒左右。

測試Intel MKL

使用Intel MKL請看網友的VS2015+Intel MKL+Eigen的安裝與混合程式設計


Eigen提供了封裝類 PardisoLLT 、PardisoLDLT 和 PardisoLU。都是稀疏矩陣直接法求解器,前兩個Cholesky 分解,最後一個LU分解。
我測試了下PardisoLDLT,同樣場景需要30秒左右。
除了速度,我想讓演算法可執行在其他處理器上,所以用不成了。

測試 SuiteSparse

那麼選擇只剩下SuiteSparse,這個庫是由眾多作者寫的,每個求解器都有各自的liscene,一定要看清楚啊。原始程式碼只能在類unix系統(unix、linux、mac)上使用,要在windows使用,需要藉助cmake封裝介面來完成windows版本的編譯,找到教程1

教程2
我看了下SuiteSparse的liscene,比較複雜,只列舉了部分:

元件名 協議 算例速度 支援GPU 備註
CHOLMOD GPL&LGPL 16秒 底層程式碼GPL
CCOLAMD BSD-3
CAMD BSD-3
COLAMD BSD-3
CSparse LGPL
CXSparse LGPL
SPQR GPL 計算結果無效 GPL
GPUQREngine GPL

問下對方程求解有些瞭解的人,得到回覆,我要解的方程是稀疏矩陣,使用直接法求解效果不好,而且矩陣分解會讓零元變成非零元,計算成本增加很多。建議我找迭代法求解,最好是分塊的迭代求解演算法。