大型矩阵求逆(Large Matrix Inversion)

2019-07-30 04:02发布

我期待在服用大矩阵的逆,1000×1000大小共同的,但有时会超过100000 X 100000(这是目前未能由于时间和存储器)。 我知道,正常的情绪“不采取逆,找到一些其他的方式来做到这一点”,但是这是不可能的时刻。 这样做的原因是由于软件已经被提出,期望得到的矩阵求逆使用。 (注:我期待到改变这种方式,但这需要很长的时间)

目前,我们使用的是LU分解法从数值重新复制,和我目前在测试本征库的过程。 本征库似乎更稳定,更快一点,但我仍然在测试阶段的准确性。 我已经采取了快速浏览一下其他库,如ATLAS和LAPACK,但还没有对这些任何实质性的测试呢。

它好像本征库不使用并行方法来计算逆(虽然不为逆LU分解一部分),据我可以告诉ATLAS与LAPACK在此限制类似。 (我目前正在测试用于OpenMP和不征的速度差。)

第一个问题是任何人都可以解释它如何能够通过并行优化矩阵求逆。 我发现了一篇文章在这里谈到有关矩阵求逆并行算法,但我不明白。 看来这对另一种方法的文章会谈? 我也不能肯定的ScaLAPACK或PETSc的是有用的?

第二个问题,我看了这个文章使用GPU来提高性能的,但我从来没有编码的GPU,因此不知道是什么人所要表达的,但在底部的图表看起来相当惊人。 如何是这甚至可能,我该怎么办哪里开始着手实施这样的事情如果是真的。

我也发现这个文章,尚未有通过它来阅读理解的时间,但它似乎有前途的,内存是当前问题与我们的软件。

这些文章或一般的问题的任何信息,将有很大的帮助。 我再次道歉,如果这问题似乎含糊其辞,我会尝试,如果要扩大更多。

Answer 1:

第一个问题是任何人都可以解释它如何能够通过并行优化矩阵求逆。

我大胆猜测,这和线性代数相关的主题,是在并行计算研究得最多的话题之一。 如果你坚持找地方开始阅读,以及良好的老戈卢布和Van贷款对题目的一章。 至于是否ScaLAPACK的和PETSC可能是有用的,肯定是前者,可能是后者。 当然,它们都依赖于MPI但是这样的考虑在这一领域的授权。

第二个问题...

使用的GPU,如果你已经有了它们,你能负担得起你的代码翻译成你的GPU支持的编程模型。 如果你从来没有编码的GPU,并有机会获得商品型CPU的集群,你会得到了通过使用比用新技术摔跤集群加速更快。

至于你提到的最后一篇文章,它现在在非常快速变化的领域10岁(尝试使用GPU来矩阵求逆找到一个10岁的研究论文)。 我不能在其卓越或其他属性进行评论,但问题大小你提到在我看来,现代集群的能力范围内很好地在核心(使用旧的术语)计算。 如果你的矩阵是非常大的,是他们也稀疏?

最后,我坚决支持你的明确意图,利用现有过的,现成的代码,而不是尝试开发自己。



Answer 2:

100000 X 100000是在双精度80GB。 您需要支持磁盘上的内存映射矩阵库。 我不能推荐一个特定的库,我没有找到快速谷歌搜索什么。 但是从数字食谱肯定的代码不会是足够的。



Answer 3:

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

我假设你正在做你的矩阵的LU分解,然后用分解来解决A * B计算逆= I其中A是你原来的矩阵,B是你解决的矩阵,I是单位矩阵。 则B是逆。

最后一步是很容易parallellize。 除以沿着列的单位矩阵。 如果你具有P个CPU和你的矩阵是n乘n,那么每一个部分都有N / P列和N行。 让调用零件I1,I2等在每个CPU,解决形式A * B1 = I1的一个系统,这给你的部件B1,B2等,并且可以将它们组合起来,以形成B,其是逆。



Answer 4:

在GPU上的LU分解可以比在CPU上〜10倍的速度更快。 虽然这正在改变,GPU的传统设计围绕单精度运算,等老的硬件单精度运算一般比的双精度运算速度更快。 此外,存储要求和性能将大大你的矩阵结构的影响。 稀疏100000×100000矩阵LU分解是解决一个合理的问题,并不会需要太多的内存。

除非你想成为一个专家,花了很多时间调整为硬件更新,我会强烈建议使用商业库。 我建议CULA工具 。 他们有两个疏与密GPU库,事实上其免费的图书馆提供SGETRF -单精度(密集)LU分解程序。 你必须支付他们的双精度库。



Answer 5:

我知道这是旧的文章 - 但真的 - OpenCL的(你下载基于您的显卡有关的一个)+ OpenMP的+矢量(不按照这个顺序)是要走的路。

总之 - 对我来说我有什么矩阵经验是真正从进出该系统还垫了复制双人双阵列,开销做或计算的任何开始前初始化0矩阵 - 尤其是当我与创建.xll工作Excel的使用。

如果我要重新安排顶部 -

  1. 尝试向量化的代码(的Visual Studio 2012和英特尔C ++有自动向量化 - 我不知道MinGW的或GCC,但我觉得有国旗的编译器来分析你的for循环来生成正确的汇编代码,而不是使用的正常的寄存器来保存你的数据,来填充你的处理器的向量寄存器我觉得Excel正在这样做,因为当我监控的Excel的线程同时运行他们MINVERSE(),我发现只使用1线程我不知道很多汇编语言。 - 所以我不知道该怎么向量化手动...(没有时间去学习这还不过SOOOOO想做到这一点!)
  2. 使用OpenMP(OMP编译)或MPI或pthread库(parallel_for时)并行 - 很简单 - 但是......这里的渔获 - 我意识到,如果你的矩阵类是完全单线程在首位 - 然后并行垫子一样的操作乘法或逆是scrappable - 并行的Cuz将恶化由于初始化或复制或只访问所述非并行矩阵类的速度。 但是...其中并行帮助是 - 如果你正在设计自己的矩阵类并将其并行操作的构造(填充以0等),那么你的LU的计算(A ^ -1)= I也将更快。 这也是数学简单也优化你的LU分解,同时也优化了身份的特殊情况UR前进后退替代。 (即不要浪费时间创建任何单位矩阵 - 分析在您的(行= COL)和评价与1的功能和为0的其余部分)
  3. 一旦它被并行(在外层) - 要求逐个元素的矩阵操作可以被映射到由GPU(SSSSSS)被计算 - 几百个处理器来计算元素 - 击败! 目前人们品尝ATI的网站上提供蒙特卡洛代码 - 使用ATI的OpenCL的 - 不用担心移植代码的东西,采用的GeForce - 所有的u要做的就是重新编译存在。

对于2和3,但-记得开销招致如此没有意义,除非你正在处理F * K * g ^巨大的矩阵-但我看到10万平方公尺? 哇...

基因



文章来源: Large Matrix Inversion