复数的 OpenMP 线程非线性求解器

计算科学 非线性方程 迭代法 预处理 格瑞斯 复数
2021-12-15 00:34:53

问题: 我已将CT Kelley编写的 Jacobian-Free Newton-Krylov求解器翻译成 Fortran,现在想在一个共享内存系统上使用 OpenMP 将其并行化。另外,我想用 ILU0 或 ILUT 预处理器对系统进行预处理。

考虑的解决方案: 我想使用英特尔 MKL 库中的 FGMRES - 我希望它经过高度优化和线程化。由于它不支持复数,我将按照英特尔的解决方案来拆分问题:

(ArAiAiAr)(xrxi)=(frfi)

对于 ILU0 前提条件,我决定使用Yousef Saad的《稀疏线性系统的迭代方法第二版》一书中的一段代码并将其并行化。

然后我将使用?getriMKL 中的“计算 LU 因子一般矩阵的逆”。

问:听起来合理吗?共享内存系统的任何其他求解器?

1个回答

您还考虑过哪些其他预处理器?根据我使用 ILU 的经验,有效并行化比交替施瓦茨或代数多重网格等其他方法更难。与往常一样,您的里程可能会有所不同:在信任互联网上的 nincompoops 之前进行实验和配置文件。

使用交替 Schwarz 将问题分解为多个子问题,这些子问题可以连续求解,根据大小,ILU + Krylov 子空间求解器或直接 LU 分解可能非常有效。

至于 OpenMP,这类事情的最佳同类库(PETSc、Trilinos)在共享内存并行之前使用通过 MPI 传递消息。上述库可以链接到英特尔 MKL;如果您选择使用它们,您仍然可以充分利用所有优化的线性代数内核。但是,您必须权衡学习如何使用该库所花费的时间与您自己编写它需要多长时间。

最后,共享内存并行性使其自身成为比消息传递更难诊断的 bug 的杀手锏当库 A 使用 OpenMP 而库 B 使用 OpenMP 并且它们相互短路时会发生什么?这只有在您编写大型应用程序时才会成为考虑因素,但您永远不知道您编写的某些脚本何时会因为在长途飞行中无法入睡而变成......一半的博士学位。论文*。

*根据经验说话。