让我们说有一台4个CPU的计算机,每个CPU有2个核心,所以共有8个核心。由于我的理解有限,我认为在这种情况下所有处理器共享相同的内存。现在,最好直接使用openMP或使用MPI使其通用,以便代码可以在分布式和共享设置上工作。另外,如果我将MPI用于共享设置,那么与openMP相比性能会下降吗?
答案 0 :(得分:51)
您是否需要或希望MPI或OpenMP(或两者)在很大程度上取决于您运行的应用程序类型,以及您的问题主要是内存限制还是CPU绑定(或两者兼而有之)。此外,它取决于您运行的硬件类型。几个例子:
示例1
您需要并行化,因为内存不足,例如:你有一个模拟,问题的大小是如此之大,以至于你的数据不再适合单个节点的内存。但是,您对数据执行的操作相当快,因此您不需要更多的计算能力。
在这种情况下,您可能希望使用MPI并在每个节点上启动一个MPI进程,从而最大限度地利用可用内存,同时将通信限制在最低限度。
示例2
您通常拥有较小的数据集,并且只想加速您的应用程序,这在计算上很重。此外,您不希望花太多时间考虑并行化,而是更多的算法。
在这种情况下,OpenMP是您的首选。您只需要在这里和那里添加一些语句(例如,在您想要加速的for循环前面),如果您的程序不是太复杂,OpenMP将自动为您完成剩下的工作。
示例3
你想要一切。您需要更多内存,即更多计算节点,但您也希望尽可能加快计算速度,即每个节点运行多个核心。
现在您的硬件开始发挥作用了。根据我的个人经验,如果每个节点只有几个核心(4-8),那么使用OpenMP(即启动OpenMP线程等)的一般开销所产生的性能损失不仅仅是处理器内部的开销。 MPI通信(即在实际共享内存且不需要MPI进行通信的进程之间发送MPI消息) 但是,如果您正在使用每个节点(16+)具有更多核心的计算机,则必须使用混合方法,即同时与MPI和OpenMP并行化。在这种情况下,混合并行化对于充分利用您的计算资源是必要的,但它也是最难编码和维护的。
<强>摘要强>
如果您遇到的问题足够小,只能在一个节点上运行,请使用OpenMP。如果您知道需要多个节点(因此肯定需要MPI),但您喜欢代码可读性/工作量而不是性能,请仅使用MPI。如果使用MPI只是没有给你你想要/需要的加速,你必须做到这一切,然后去混合。
关于你的第二个问题(如果不清楚的话):
如果您设置的是根本不需要MPI(因为您将始终仅在一个节点上运行),请使用OpenMP,因为它会更快。但是如果你知道你还需要MPI,我会从那开始,只有在你知道你已经用尽所有合理的MPI优化选项时才添加OpenMP。
答案 1 :(得分:28)
现在大多数分布式内存平台都包含SMP或NUMA节点,因此不使用OpenMP是没有意义的。 OpenMP 和 MPI可以完美地协同工作; OpenMP为每个节点上的核心提供数据,MPI在节点之间进行通信。这称为混合编程。它在10年前被认为是异国情调,但现在它已成为高性能计算的主流。
至于问题本身,鉴于所提供的信息,正确的答案始终是同一个: IT DEPENDS 。
答案 2 :(得分:4)
对于在这样的单个共享内存机器上使用,我建议使用OpenMP。它使问题的某些方面更简单,可能更快。
如果您打算转移到分布式内存计算机,请使用MPI。这样可以避免两次解决同样的问题。
我之所以说OpenMP可能更快,是因为MPI的良好实现可以足够聪明地发现它正在共享内存环境中使用并相应地优化其行为。
答案 3 :(得分:3)
仅仅为了更大的图景,混合编程已经变得流行,因为OpenMP通过使用相同的地址空间从缓存拓扑中获益。由于MPI可能在内存中复制了相同的数据(因为进程无法共享数据),因此可能会遇到缓存取消。
另一方面,如果您正确地对数据进行分区,并且每个处理器都有一个私有缓存,那么您的问题可能完全适合缓存。在这种情况下,您具有超线性加速。
通过在缓存中进行交谈,最近的处理器上存在非常不同的缓存拓扑,并始终: IT DEPENDS ...