Concurrency 大矩阵求逆

Concurrency 大矩阵求逆,concurrency,parallel-processing,linear-algebra,eigen,matrix-inverse,Concurrency,Parallel Processing,Linear Algebra,Eigen,Matrix Inverse,我正在研究一个大矩阵的逆矩阵,通常大小为1000 x 1000,但有时超过100000 x 100000(由于时间和内存的原因,该矩阵目前正在失败)。我知道,正常的情绪是‘不要采取相反的做法,找其他方法来做’,但这在目前是不可能的。这是因为使用了已经制作的软件,希望得到矩阵逆。(注意:我正在寻找改变这种情况的方法,但这需要很长时间) 目前,我们正在使用数值记录中的LU分解方法,我目前正在测试特征库。eigen库似乎更稳定,速度更快,但我仍处于精度测试阶段。我已经快速查看了其他库,如ATLAS和L

我正在研究一个大矩阵的逆矩阵,通常大小为1000 x 1000,但有时超过100000 x 100000(由于时间和内存的原因,该矩阵目前正在失败)。我知道,正常的情绪是‘不要采取相反的做法,找其他方法来做’,但这在目前是不可能的。这是因为使用了已经制作的软件,希望得到矩阵逆。(注意:我正在寻找改变这种情况的方法,但这需要很长时间)

目前,我们正在使用数值记录中的LU分解方法,我目前正在测试特征库。eigen库似乎更稳定,速度更快,但我仍处于精度测试阶段。我已经快速查看了其他库,如ATLAS和LAPACK,但还没有对它们进行任何实质性的测试

似乎eigen库不使用并发方法来计算逆(尽管对逆的LU分解部分使用了并发方法),就我所知,ATLAS和LAPACK在这个限制方面是相似的。(我目前正在测试带openMP和不带openMP的eigen的速度差。)

第一个问题是谁能解释一下如何通过并行化来优化矩阵求逆。我发现了一篇关于矩阵求逆并行算法的文章,但我不理解。这篇文章似乎在谈论另一种方法?我也不确定scaLAPACK或PETSc是否有用

第二个问题,我读了一篇关于使用GPU提高性能的文章,但我从未为GPU编写过代码,因此不知道要传达什么,但底部的图表看起来相当令人担忧。这是怎么可能的,如果这是真的,我应该从哪里开始实施这样的东西呢

我还发现了这篇文章,还没有来得及通读理解,但它似乎很有希望,因为内存是我们软件当前的一个问题


关于这些文章或一般问题的任何信息都会有很大帮助。如果这个问题显得含糊不清,我再次表示歉意,如有必要,我将尝试进行更多扩展。

100000 x 100000是80GB的双精度。您需要一个支持磁盘上内存映射矩阵的库。我不能推荐一个特定的图书馆,而且我也没有通过快速的谷歌搜索找到任何东西。但是来自数值公式的代码肯定不够用。

第一个问题是,有人能解释一下如何通过并行化优化矩阵求逆吗

我猜这个,以及线性代数中的相关主题,是并行计算中研究最多的主题之一。如果你一直在寻找一个开始阅读的地方,那么好的老朋友应该有一个关于这个主题的章节。至于Scalapack和Petsc是否有用,肯定是前者,可能是后者。当然,它们都依赖于MPI,但在这个领域这是理所当然的

第二个问题

如果你有GPU,并且你有能力将你的代码转换成GPU支持的编程模型,那么就使用GPU。如果您从未为GPU编写过代码,并且能够访问商品类型的CPU集群,那么使用该集群会比使用新技术更快地提高速度

至于你提到的最后一篇文章,它在一个变化非常快的领域已经有10年的历史了(试着找一篇10年前关于使用GPU进行矩阵求逆的研究论文)。我无法评论它的优点或其他属性,但在我看来,您提到的问题规模在现代集群的核心(使用旧术语)计算能力范围内。如果你的矩阵很大,它们也是稀疏的吗


最后,我强烈支持您使用现有现成代码而不是开发自己的代码的明显意图。

关于第一个问题(如何并行计算逆):

我假设你通过对矩阵进行LU分解来计算逆矩阵,然后使用分解来解A*B=I,其中A是原始矩阵,B是你解的矩阵,I是单位矩阵。那么B是相反的


最后一步很容易并行化。沿列分割您的身份矩阵。如果有p个CPU,并且矩阵是n乘n的,那么每个部分都有n/p列和n行。让我们调用每个CPU上的部分I1、I2等,求解形式为a*B1=I1的系统,这将为您提供部分B1、B2等,您可以将它们组合成形式B,这是相反的。

GPU上的LU解压缩速度可以比CPU上快约10倍。尽管这种情况正在发生变化,但GPU传统上是围绕单精度算法设计的,因此,较旧的硬件单精度算法通常比双精度算法快得多。此外,存储需求和性能将受到矩阵结构的极大影响。稀疏100000 x 100000矩阵LU解压缩是一个需要解决的合理问题,并且不需要太多内存


除非你想成为一名专家并花大量时间调整硬件更新,否则我强烈建议你使用商业库。我建议。他们既有稀疏的GPU库也有密集的GPU库,事实上他们提供了SGETRF——一个单精度(密集的)LU解压缩例程。你必须为他们的双精度库付费。

我知道这是一个很老的帖子,但实际上——OpenCL(你可以根据你的图形卡下载相关的一个)+OpenMP+矢量化(不是按那个顺序)是一个不错的选择

无论如何-对我来说,我对矩阵的经验实际上与在系统内外复制双数组以及在开始计算之前用0填充或初始化矩阵的开销有关-尤其是在我使用Excel创建.xll时

如果我再