大型稀疏对称(但不是正定)系统的求解器的最佳选择


10

我目前正在研究由某些算法生成的非常大的对称(但不是正定)系统。这些矩阵具有很好的块稀疏性,可用于并行求解。但是我无法决定是否应该使用直接方法(例如多边方法)还是迭代方法(预处理GMRES或MINRES)。我所有的研究都表明,迭代求解器(即使具有7个内部迭代的快速收敛)也无法击败MATLAB中的直接“ \”运算符。但是从理论上讲,直接方法应该更昂贵。这是怎么回事?是否有最新的文件或纸张用于此类情况?我可以在使用直接方法的并行系统中使用块稀疏性,就像GMRES这样的灵活迭代求解器一样有效吗?


3
我认为人们在不了解有关您的特定矩阵的更多细节的情况下无法真正有效地发表评论。尺寸是多少?稀疏模式是什么样的?
Costis 2013年

2
很大程度上取决于您的意思。变量的数量是成千上万吗?百万?ñ
Brian Borchers 2013年

2
这个问题与scicomp.stackexchange.com/q/81/276很多重叠;您可以在那里找到有用的信息。同样,基于该问题,谈论操作员的频谱(或预处理操作员的频谱)可能会很有用。
Geoff Oxberry

Answers:


9

MUMPS稀疏直接求解器可以处理对称的不确定系统,并且可以免费获得(http://graal.ens-lyon.fr/MUMPS/)。Ian Duff是MUMPS和MA57的作者之一,因此算法有很多相似之处。

MUMPS是为分布式内存并行计算机而设计的,但在单处理器计算机上也能很好地工作。如果将其与多线程BLAS库链接,则可以在共享内存,多核处理器上实现合理的加速。

您没有说“非常大”是多少,但是MUMPS还具有核外功能,可以处理因式分解矩阵不适合可用内存的问题。


7

直接求解器遭受的一般问题是填充现象,这意味着稀疏矩阵的逆可能是稠密的。如果矩阵的结构不适合,则会导致巨大的内存需求。

有尝试解决这些问题的方法,而MATLAB的default lu-function使用了其中的一些方法。有关置换,对角线缩放等的概述,请参见http://www.mathworks.de/de/help/matlab/ref/lu.html。当然,对于MUMPS(http://graal.ens-lyon.fr/MUMPS/)等更高级的软件包也是如此。

但是,通常来说,如果问题足够大,那么您将达到内存边界,并且必须使用迭代(Krylov)方法。

如果您的问题是对称且不确定的,MINRES可能是显而易见的选择。但是请注意,如果问题是对称的,则GMRES和MINRES在精确的算术中会做同样的事情,但是GMRES往往遭受较少的正交性损失。因此,有人认为GMRES是“ MINRES的最佳实现”。

无论如何,您可能会从预处理系统中受益。如果您不想花费时间来量身定制预处理器,那么不完整的LU分解预处理器(ILU)可能已将您带到某个地方。


2

只有问题足够大(很大,取决于许多因素,例如所需的存储量,实现的效率),任何迭代求解器才能击败直接方法。而且,只有在使用适当的预处理条件(实际上)的情况下,任何krylov方法(例如GMRES)才是好的。如果您不使用任何预处理,那么一般来说,krylov方法是没有用的。我也使用块稀疏矩阵(它们来自PDE应用程序),并观察到块预处理(重叠添加剂schwarz)krylov解算器(重新启动GMRES或BiCG-Stab)与粗网格校正(或多网格)配合使用可扩展矩阵类型。


2

由于具有一流的编程功能,Matlab的'\'运算符非常高效。您可能会在蒂莫西·戴维斯(Timothy Davis)的书中看到一些想法以及它们如何使用所有可能的捷径。

在matlab中,您可以使用完善且稳定的gmres。理论上最适合您的情况下,可能的碎石可能不那么可靠(至少我的经验如此)。您应该从matlab gmres获得同等或更高的效率,如果

  1. 您的系统足够大(至少几千乘几千)。
  2. 如果使用的参数类型正确(RESTART,MAXIT,X0)。没有明确的指导方针可用于此。利用您的经验。
  3. 使用良好的预处理器。您可以使用ILU或更便宜的Jacobi街区。这将大大减少工作量。
  4. 最重要的是:如果矩阵稀疏,请使用matlab稀疏格式。Matlab gmres是为此目的而理想构建的。这将在很大程度上降低成本。

对于更大的系统,请使用PETSc之类的工具。


1

如果矩阵的维数在几万以下,请使用直接方法,尽管对于不确定的对称系统(实际上,我所知道的都不是开源的)没有很多免费的直接方法。HSL 有MA57,但这只是免费供学术使用。您当然可以忽略对称性,而使用UMFPACK

在大约几千个维度的范围内,直接方法的内存使用量开始超出典型台式计算机可以合理处理的范围,因此,除非您拥有强大的共享内存计算机,否则您将需要使用迭代方法。对于不确定的问题,您可以将BiCG(双共轭梯度)专用于对称系统,尽管可能会发生故障。最近发布了用于对称系统的MINRES-QLP,可提供更高的数值稳定性。

这两种方法需要非常不同的实现,因为对于直接方法,您实际上需要形成矩阵,而在迭代方法中,通常不会显式地形成矩阵。

有多种原因导致一种方法可能比另一种方法更快,尤其是根据矩阵维数的函数。对于病情严重的系统,迭代方法可能会停滞不前。对于不太稀疏的矩阵,直接方法最终会创建大量的填充,这会大大减慢速度。此外,Matlab中的直接方法已得到高度优化(内部使用UMFPACK或MA57),而迭代方法通常直接在Matlab中进行编码,并且由于瓶颈是Matvecs和点积的应用,因此利用3级BLAS的机会较少。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.