共享内存的MPI与openMP

共享内存的MPI与openMP,mpi,openmp,shared-memory,Mpi,Openmp,Shared Memory,假设有一台计算机有4个CPU,每个CPU有2个核,所以总共有8个核。在我有限的理解下,我认为在这种情况下,所有处理器共享相同的内存。现在,最好是直接使用openMP还是使用MPI使其通用化,以便代码可以在分布式和共享设置上工作。另外,如果我将MPI用于共享设置,那么与openMP相比,性能会下降吗?用于这样的单个共享内存机器,我建议使用openMP。它使问题的某些方面变得更简单,可能会更快 如果您计划迁移到分布式内存机器,那么请使用MPI。这样你就不用再解决同样的问题两次了 我之所以说OpenM

假设有一台计算机有4个CPU,每个CPU有2个核,所以总共有8个核。在我有限的理解下,我认为在这种情况下,所有处理器共享相同的内存。现在,最好是直接使用openMP还是使用MPI使其通用化,以便代码可以在分布式和共享设置上工作。另外,如果我将MPI用于共享设置,那么与openMP相比,性能会下降吗?

用于这样的单个共享内存机器,我建议使用openMP。它使问题的某些方面变得更简单,可能会更快

如果您计划迁移到分布式内存机器,那么请使用MPI。这样你就不用再解决同样的问题两次了


我之所以说OpenMP可能更快,是因为一个好的MPI实现可以足够聪明地发现它正在共享内存环境中使用,并相应地优化它的行为。

现在大多数分布式内存平台都由SMP或NUMA节点组成,不使用OpenMP毫无意义。OpenMP和MPI可以完美地协同工作;OpenMP为每个节点上的核心提供数据,MPI在节点之间进行通信。这就是所谓的混合编程。10年前它被认为是异国情调,但现在它正在成为高性能计算的主流


至于问题本身,根据所提供的信息,正确的答案总是一样的:这取决于

只是为了更大的图景,混合编程已经变得流行,因为OpenMP通过使用相同的地址空间从缓存拓扑中获益。由于MPI可能在内存上复制了相同的数据(因为进程无法共享数据),因此它可能会受到缓存取消的影响

另一方面,如果您对数据进行了正确的分区,并且每个处理器都有一个私有缓存,那么如果您的问题完全适合缓存,则可能会出现问题。在这种情况下,你有超线性加速


通过在缓存中讨论,在最近的处理器上有非常不同的缓存拓扑,并且总是:这取决于……

您是否需要或想要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。

更好的方法取决于你对该计划的未来计划。尽管OpenMP简单得多。这个问题的措辞不是建设性的e、 “更好”这个词太主观了,按照SO的标准,很难得到好的答案。@Michael Schlottke:亲爱的Michael,你能给我解释一下为什么混合解决方案比MPI更快吗?只有一个用例有两个或更多节点,每个节点都有16个以上的CPU?在这种情况下只使用MPI有什么缺点?谢谢lot@neil_mccauley 根据个人经验(以及查看其他研究小组的示例),大多数科学代码在尝试充分利用多个核心节点时使用混合方法。特别是在支持硬件线程的情况下,在节点(甚至核心)内一定程度上使用线程级并行似乎是有意义的。具有极端数量的