反转数百万矩阵的最快方法是什么?

计算科学 矩阵 雅可比
2021-12-03 18:36:56

我的项目涉及大型模拟和估计。对于每个模拟,我需要求解 600,000 个非线性方程组。目前我正在使用牛顿的方法来寻找解决方案。这涉及在每次迭代中反转 600,000 万个雅可比矩阵。目前,我使用 mex C 文件在 MATLAB 中迭代 100 次以进行收敛,一个内核上的一次仿真需要 250 秒。这种速度使其无法进行估计。

你们能告诉我这应该是反转大量小矩阵的最快方法吗?所有矩阵都在 2 x 2 到 6 x 6 之间。我的直觉是 CUDA 可能是唯一可行的估计方法。我目前正在将代码翻译成 MKL fortran,我完全没有使用 CUDA 的经验。所以请给我一些建议——我需要尽快决定实施哪个平台。

1个回答

我知道这不是一个明确的答案,但它可以给出一个如何使用 CUDA 的想法。在这个阶段很难给出建议,因为为此需要详细了解实际代码

正如评论中已经写的那样,一般来说,最好不要反转矩阵,而是求解线性系统(有关为什么请参阅此问题的详细信息)。

有可能 CUDA 可以帮助你,但在你之前应该考虑一些方面。一般来说,CUDA 应用程序的真正瓶颈是内存传输,有时重新计算比移动它们更好,您必须考虑可用内存,在其他情况下,内存传输使用更多时间尊重 cpu 的使用。另一个需要关注的点是您希望并行化的流中存在if条件,在这种情况下,流被停止,两个不同的分支按顺序执行,性能大大降低。我需要什么精度?这对于硬件的选择很重要,并且还取决于您使用的算法。

考虑到这一点,您可以开始研究算法的哪些部分从并行化中获得了最大优势。例如,更好地为每个 CUDA 内核分配一个线性系统还是更好地并行化某些任务?也许一个想法,而不是真正尊重您的代码,是并行化线性系统的解决方案(=反转矩阵)。另一个,如果您使用 feval,则尝试在 matlab 中使用并行 feval其他可能性可以考虑牛顿方法的变体来获得加速,这不仅与 GPU 的使用有关。


一些链接:

  • 用于 cuda 中求解器的CUDA 库。
  • pdf与 CUDA 中针对 Netwon 方法的特定案例的示例
  • 带有 CUDA 的牛顿方法变体的文章 pdf 。Philip-Daniel Beck, Marco Nehmeier在 CUDA 上的平行区间牛顿法