【发布时间】:2018-11-05 03:32:14
【问题描述】:
每个人。
我对线性代数方程求解器几乎没有经验。
但现在,我需要求解大型稀疏块压缩线性方程。
即Ax=b。
矩阵A由大小为(nb,nb)的子块组成。 A 的大小是 (N,N) 子块。
那么矩阵A的实际大小是(nb*N,nb*N)。
只有很少的子块存在。而A 是对角线占优。
我已经尝试过 Eigen 的内置 slover。即 SimplicialLLT 和 BiCGSTAB,第一个很慢,而第二个不能收敛。
然后我用 Intel MKL 尝试了 Eigen 的第三方求解器,即 PardisoLLT 、PardisoLDLT 和 PardisoLU。他们也很慢。
最后,我尝试了使用 SuiteSparse 的 Eigen 第三方求解器,即 CHOLMOD 和 SPQR。第一个很慢,而第二个给出了相同的输入值,似乎它不起作用。
我想可能是因为我使用了错误的求解器,我没有利用“块压缩”功能,从而触发了很多无用的计算。
谁能给我一些建议?
【问题讨论】:
-
N 有多大?当您使用 cholmod 时,您使用 GPU 吗?如果没有一些代码或构建环境的详细信息,很难提供帮助
-
可能很大。目前,我尝试使用大小为 1200*1200 的矩阵。 (即 Nb 为 12,N 为 100)。我目前只有一个gtx 1080卡,但我必须使用“双”来保持精度。所以,也许gpu不是一个好的选择。
-
我有一个 SOR 迭代求解器,专为这个块压缩方程设计。 SOR 求解器求解该方程约 1500 次,耗时约 110 秒。而具有 Eigen 接口的 cholmod 求解器花费大约 330 秒。但是 SOR 求解器只能使用 1 个线程,这在大方程情况下会很慢。
-
Matrix 1200*1200 对于稀疏矩阵来说不是很大的尺寸。它的稀疏性是多少(非零/1200/1200)? 330 秒只适用于 cholmod 的一次调用?
-
谢谢你,Masud 和 ztik。我发现我的 IDE (QtCreator) 使方程求解时间增加了一倍,因为我在调试中超过一周没有重新启动它。当我重新启动 QtCreator 时,使用 SuiteSparse CHOLMOD 求解器的 Eigen 在方程 12000*12000(即 Nb=12,N=1000)中比我当前的方程求解工具更快。
标签: c++ sparse-matrix solver algebra