【问题标题】:Need Help Solving Sparse Ax=b [closed]需要帮助解决稀疏 Ax=b [关闭]
【发布时间】:2016-04-20 19:13:53
【问题描述】:

我知道有很多关于这个主题的信息,但我正在努力为我的具体问题找到最佳解决方案。

对于我的问题,A 非常大(~145k X 145k)并且非常稀疏(每行最多 9 个非零值)。它不是正定的,也不是对称的,并且是复值(单精度)。稀疏模式可以通过想象一个三对角矩阵来可视化,然后在其上方和下方添加两个“三对角线”,远离主三对角线 N。这在每行中给出了 3 组 3 个非零,其中 3 组由 N 分隔(对于给定矩阵 A,N 是常数),并以主对角线为中心。由于边界条件,约 5% 的行不会填充所有 9 个非零位置,因此这些行将具有主要非零模式的子集。

我需要解决多个右手边 (~1024)。我还需要在 A 中解析具有不同数值但具有相同稀疏模式的相同系统。目前,我正在使用 SuperLU(单线程)将 A 分解为 LU,然后使用 cusparse(特别是 cusparseCcsrsm_solve)求解。

使用 LU 分解的稀疏直接求解器是解决我的问题的最佳方法吗?哪个库对于 LU 分解最快?使用反向替换解决哪个最快?

【问题讨论】:

  • 尝试进一步压缩问题;目前还不清楚您实际上在问什么。

标签: c++ multithreading performance linear-algebra


【解决方案1】:

就直接求解器中最快的而言,我更倾向于MUMPS。 主要参与者和积极开发的库(至少是我知道和使用过的)是MUMPSSuperLUUMFPACKSuiteSparseTrilinosPETSc

如果我要这样做,我会使用一个强大的迭代求解器,并使用不完整的 LU 分解对其进行预处理。

迭代求解器的用户之间有一条众所周知的经验法则,如果您的系统大于 4x4,那么您需要使用迭代求解器。

如果你想使用迭代求解器,我建议使用TrilinosPETSc。主要区别在于前者是面向对象的,而后者不是。它们之间的性能差异不大。

对于 GPU 编程,我没有足够的经验。我曾经使用过一个名为 PARALUTION 的库,这是一个不错的库。它为您隐藏了 GPU 实现。

【讨论】:

  • 请问您为什么要使用迭代求解器?鉴于我有大约 1024 个右手边,它真的可以在速度方面竞争吗?我倾向于检查 Trilinos,因为它为一些不同的迭代和直接求解器提供了一个通用接口。感谢您的帮助!
  • 好吧,迭代求解器的迭代很便宜 (O(N)),而直接求解器的迭代则更高。使用好的预处理器,迭代求解器胜过直接求解器。如果系统矩阵条件良好,那么您很可能从不完全 LU 中获得精确(或非常接近精确的)LU,然后迭代求解器将在最少两次迭代中收敛。
猜你喜欢
  • 2015-07-18
  • 2014-10-22
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多