现在我一直相信FEM/CFD 在 GPU 单元上应该更快——这里我使用 CUDA 作为可靠的例子。但是,我还没有找到一篇令人信服的论文,其中的基准实际上对我来说是“是的,这是真的!”。我可以指点一个吗?或者如果没有,与 CFD/FEM 的 CPU 相比,GPU 单元有什么原因会很糟糕?它与稀疏矩阵结构有什么关系吗?在速度/并行度等性能指标方面。
GPU(特别是 CUDA)真正加速 FEM/CFD 的真正神话
这是与 GPU 的交易。在 GPU 上,每个内核都很慢。真的很慢。但是,您有数千个内核。如果您可以一次有效地使用数千个内核,那么您的算法将在 GPU 上运行得更好。如果你不能,那么它会在 GPU 上运行得更慢。
线性代数是一个真正建立良好并行性的领域。因此,为 GPU 编写的最佳方法是让 GPU 完成所有线性代数:它本质上变成了计算卡,Ax=b
并且A*B
比 CPU 快得多(这个事实很容易检查,查看众多基准测试或甚至只需打开 MATLAB 并输入A*B
矩阵和 GPU 矩阵)。但有一个警告:数据传输到 GPU 非常慢。此外,GPU 上的内存分配非常慢。因此,虽然线性代数很快,但您必须处理以下事实:
- 串行性能很糟糕。
- 在 GPU 上动态分配内存会破坏性能。
- 在 CPU 和 GPU 之间来回传输很慢。
这对您的算法施加了限制:您需要尽量在 GPU 上留下尽可能多的内容,来回传输最少的数量,同时尽量避免串行部分在 GPU 上运行。同样,GPU 可以轻松地以比 CPU 快 1000 倍的速度执行线性代数(这通常是性能瓶颈),因此在许多情况下,您可以有效地管理这一困境并最终获得巨大的性能提升。
一种有趣的选择是 Xeon Phi。这些卡具有更快的数据传输、更好的串行性能,并且可以更好地分配内存。然而,权衡是它不那么专业地成为一个“愚蠢的线性代数求解器”,因此你必须付出更高的代价,作为回报,它的线性代数性能大约是 GPU 的一半。但是,这可以更容易开发代码(OpenMP 并行代码将自动使用它,并且您可以通过 MPI 将 Xeon Phi 卡用作另一个节点,因此如果您已经并行化了代码,则可以使用相同的代码Phi),并且通过允许您更有效地将数据保存在加速器上或使用更高的数据传输速度,在实际 (S)PDE 求解中可以比 GPU 快得多。当然,这在很大程度上取决于实施。
要通过参考扩展 Chris Rackauckas 的详尽答案,请尝试查看Torres、Gonzalez-Escribano、Llanos 的pdf。它是关于 GPU 的调整,这是性能的一个重要方面。
正如 Bill Greene 的评论所记得的,计算工作中最相关的部分是关于求解线性系统,但是组装部分可能需要一段离散的时间。在这方面,gpu 是一个很好的帮助,因为这部分具有天生的高并行度。您可以独立计算每个元素并最终构建矩阵。
(对于我的数学硕士论文,我用 CUDA 开发了一个用 matlab 编写的 CFD 求解器的并行版本)
这实际上取决于如何解决具有大规模并行性的 FE 系统。
请参阅这篇文章,了解如何在 GPU 上以非常好的效率解决线性/非线性 FE 问题。