【问题标题】:Efficient large sparse block compressed linear equation in C++C++中高效的大稀疏块压缩线性方程
【发布时间】: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


【解决方案1】:

只要您的矩阵大小不超过大约 5000 行/列,使用稀疏求解器不会带来任何合理的好处;对于这样的矩阵,一个普通的密集求解器也很好,因为它不包含与存储和操作稀疏结构(例如链表或邻接结构)相关的“开销”。另一方面,如果您的矩阵非常大(例如,一百万左右的行/列),则只有迭代求解器才能工作。我建议您访问以下网页,其中包含与您正在使用的问题非常相似的问题和解决方案的描述(包括具有块结构的稀疏矩阵的系统的解决方案,以及图像处理):http://members.ozemail.com.au/~comecau/CMA_LS_Sparse.htm

【讨论】:

  • 万一你找不到好的求解器,你可以考虑我给你参考的那个;它可以作为附有 CD-ROM 的小册子提供(它肯定适用于非常大的矩阵;唯一的限制是矩阵的条件比,即矩阵应该是相当好的条件,c.r. 值不超过大约最多10^4或10^5,否则可能无法保证收敛):members.ozemail.com.au/~comecau/CMA_brochure.htm
  • Erwin Kalvelagen:您使用什么产品,在什么平台上使用?如果您能给出此类问题和解决方案的可靠示例,将不胜感激。
猜你喜欢
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多