Shi*_*bli 25 mpi openmp shared-memory
让我们说有一台4个CPU的计算机,每个CPU有2个核心,所以共有8个核心.由于我的理解有限,我认为在这种情况下所有处理器共享相同的内存.现在,最好直接使用openMP或使用MPI使其通用,以便代码可以在分布式和共享设置上工作.另外,如果我将MPI用于共享设置,那么与openMP相比性能会降低吗?
Mic*_*per 52
您是否需要或希望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.
Hri*_*iev 28
现在大多数分布式存储器平台都包含SMP或NUMA节点,因此不使用OpenMP是没有意义的.OpenMP 和 MPI可以完美地协同工作; OpenMP为每个节点上的核心提供数据,MPI在节点之间进行通信.这称为混合编程.它在10年前被认为是异国情调,但现在它已成为高性能计算的主流.
至于问题本身,鉴于提供的信息,正确的答案始终是同一个:IT取之不尽.