我目前正在研究由某些算法生成的非常大的对称(但不是正定)系统。这些矩阵具有很好的块稀疏性,可用于并行求解。但是我无法决定是否应该使用直接方法(例如多边方法)还是迭代方法(预处理GMRES或MINRES)。我所有的研究都表明,迭代求解器(即使具有7个内部迭代的快速收敛)也无法击败MATLAB中的直接“ \”运算符。但是从理论上讲,直接方法应该更昂贵。这是怎么回事?是否有最新的文件或纸张用于此类情况?我可以在使用直接方法的并行系统中使用块稀疏性,就像GMRES这样的灵活迭代求解器一样有效吗?
我目前正在研究由某些算法生成的非常大的对称(但不是正定)系统。这些矩阵具有很好的块稀疏性,可用于并行求解。但是我无法决定是否应该使用直接方法(例如多边方法)还是迭代方法(预处理GMRES或MINRES)。我所有的研究都表明,迭代求解器(即使具有7个内部迭代的快速收敛)也无法击败MATLAB中的直接“ \”运算符。但是从理论上讲,直接方法应该更昂贵。这是怎么回事?是否有最新的文件或纸张用于此类情况?我可以在使用直接方法的并行系统中使用块稀疏性,就像GMRES这样的灵活迭代求解器一样有效吗?
Answers:
MUMPS稀疏直接求解器可以处理对称的不确定系统,并且可以免费获得(http://graal.ens-lyon.fr/MUMPS/)。Ian Duff是MUMPS和MA57的作者之一,因此算法有很多相似之处。
MUMPS是为分布式内存并行计算机而设计的,但在单处理器计算机上也能很好地工作。如果将其与多线程BLAS库链接,则可以在共享内存,多核处理器上实现合理的加速。
您没有说“非常大”是多少,但是MUMPS还具有核外功能,可以处理因式分解矩阵不适合可用内存的问题。
直接求解器遭受的一般问题是填充现象,这意味着稀疏矩阵的逆可能是稠密的。如果矩阵的结构不适合,则会导致巨大的内存需求。
有尝试解决这些问题的方法,而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)可能已将您带到某个地方。
由于具有一流的编程功能,Matlab的'\'运算符非常高效。您可能会在蒂莫西·戴维斯(Timothy Davis)的书中看到一些想法以及它们如何使用所有可能的捷径。
在matlab中,您可以使用完善且稳定的gmres。理论上最适合您的情况下,可能的碎石可能不那么可靠(至少我的经验如此)。您应该从matlab gmres获得同等或更高的效率,如果
对于更大的系统,请使用PETSc之类的工具。
如果矩阵的维数在几万以下,请使用直接方法,尽管对于不确定的对称系统(实际上,我所知道的都不是开源的)没有很多免费的直接方法。HSL 有MA57,但这只是免费供学术使用。您当然可以忽略对称性,而使用UMFPACK。
在大约几千个维度的范围内,直接方法的内存使用量开始超出典型台式计算机可以合理处理的范围,因此,除非您拥有强大的共享内存计算机,否则您将需要使用迭代方法。对于不确定的问题,您可以将BiCG(双共轭梯度)专用于对称系统,尽管可能会发生故障。最近发布了用于对称系统的MINRES-QLP,可提供更高的数值稳定性。
这两种方法需要非常不同的实现,因为对于直接方法,您实际上需要形成矩阵,而在迭代方法中,通常不会显式地形成矩阵。
有多种原因导致一种方法可能比另一种方法更快,尤其是根据矩阵维数的函数。对于病情严重的系统,迭代方法可能会停滞不前。对于不太稀疏的矩阵,直接方法最终会创建大量的填充,这会大大减慢速度。此外,Matlab中的直接方法已得到高度优化(内部使用UMFPACK或MA57),而迭代方法通常直接在Matlab中进行编码,并且由于瓶颈是Matvecs和点积的应用,因此利用3级BLAS的机会较少。