MPI是否适用于多核?

时间:2020-03-06 14:51:48  来源:igfitidea点击:

随着最近对多核编程的热议,有人在探索使用MPI的可能性吗?

解决方案

不,我认为这不适合我们在多核系统上执行的大多数处理。开销太高,传递的对象必须被深克隆,传递大的对象图然后运行很小的计算效率很低。这实际上是为了在单独的进程之间共享数据,这些进程通常在单独的内存空间中运行,并且最经常运行长时间的计算。
多核处理器是一台共享内存机器,因此存在许多更有效的并行处理方式,这些方式不涉及复制对象,并且大多数线程只在很小的时间内运行。例如,考虑一个多线程Quicksort。使用MPI和无限数量的处理器,与在单个处理器上运行的Quicksort相比,在分配内存之前将内存分配和将数据复制到线程的开销要慢得多。
例如,在Java中,我将使用BlockingQueue(共享内存构造)在线程之间传递对象引用,而开销很少。
并不是说它没有自己的位置,例如,请参阅使用消息传递的Google搜索集群。但这可能不是我们要解决的问题。

MPI有大量开销,主要用于处理进程间通信和异构系统。我在传输少量数据并且计算与数据的比例很大的情况下使用了它。
对于大多数消费者或者业务任务而言,这不是典型的使用场景,并且在任何情况下,如先前的答复所述,在诸如多核计算机之类的共享内存体系结构上,都有处理它的方法要快得多,例如内存指针。

如果我们对上述属性存在某种问题,并且希望将工作分散到其他计算机,这些计算机必须与我们位于同一高速网络上,那么MPI可能有意义。我很难想象这样的情况。

我个人已经接受了Erlang(到目前为止,我还很喜欢)。基于消息的方法似乎适合大多数问题,我认为这将成为多核编程的关键项目之一。我从不知道MPI的开销,感谢我们指出

我已经在具有多核节点的大型群集上广泛使用了MPI。我不确定单个多核设备是否合适,但是如果我们希望代码一天可以比单个芯片大,那么我们可以考虑在MPI中实现它。目前,没有比MPI更大的规模了。我不确定提到不可接受的间接费用的发帖人是从哪里来的,但是我试图在下面给出一些相关权衡的概述。继续阅读以获取更多信息。

MPI是用于大规模科学计算的事实上的标准,并且已经在多核计算机上广泛使用。非常快。看看最近的500强名单。在某些情况下,该列表中的顶级计算机具有成千上万个处理器,以及多插槽双核和四核节点。这些机器中的许多机器都具有非常快速的自定义网络(Torus,Mesh,Tree等)以及了解硬件的优化MPI实现。

如果要在单芯片多核计算机上使用MPI,它将可以正常工作。实际上,Mac OS X的最新版本预装了OpenMPI,我们可以在普通的多核Linux机器上毫不费力地下载安装的OpenMPI。 Los Alamos的大多数系统都使用OpenMPI。 Livermore在其Linux群集上使用mvapich。在开始学习之前,我们应该记住的一点是,MPI是为解决分布式内存系统上的大规模科学问题而设计的。我们正在处理的多核设备可能具有共享内存。

默认情况下,OpenMPI和其他实现将共享内存用于本地消息传递,因此在将消息传递给本地进程时,我们不必担心网络开销。它非常透明,我不确定其他海报在哪里引起他们对高开销的担忧。需要注意的是,MPI并不是在单个多核设备上获得并行性的最简单的方法。在MPI中,所有消息传递都是显式的。因此,它被称为并行编程的"汇编语言"。如果我们不是经验丰富的HPC人士,则在进程之间进行明确的通信并不容易,我们还可以尝试其他更适合共享内存的范例(UPC,OpenMP和类似Erlang的漂亮语言)。

我的建议是,如果我们期望编写一个并行应用程序,而该并行应用程序可能需要一个以上的机器来解决,那么我建议我们使用MPI。我们将能够使用常规的多核设备进行测试并正常运行,并且一旦在群集中工作就可以轻松迁移到群集。如果要编写只需要一台计算机的应用程序,请尝试其他方法。有更简单的方法来利用这种并行性。

最后,如果我们真的很喜欢冒险,请尝试将MPI与线程,OpenMP或者其他一些本地共享内存范例结合使用。我们可以将MPI用于分布式消息传递,而将其他用于节点并行。这就是大型机器的发展方向。未来有成千上万个处理器或者更多处理器的机器预计将具有可扩展到所有节点而非全部核心的MPI实现,并且HPC人员将被迫构建混合应用程序。这不是出于胆小,而且在此空间中存在公认的范式之前,还有很多工作要做。

MPI并非没有效率。我们需要将问题分解为多个块,然后将每个块传递出去,并在每个块完成结果后重新组织。当每个线程只处理一部分问题时,没有人会通过MPI绕过整个对象。并不是界面或者设计模式的低效率,而是程序员关于如何解决问题的知识的低效率。

使用锁定机制时,互斥锁的开销无法很好地扩展。这是由于下划线的运行队列不知道何时要锁定线程的事实。我们将使用互斥锁执行比消息传递设计模式更多的内核级抖动。

我将不得不同意tgamblin。我们可能必须袖手旁观,并真正使用MPI来探究代码,从而显式地处理自己传递消息的组织。如果这是我们喜欢或者不愿意做的事情,我希望MPI在多核计算机上的运行效果与在分布式集群上一样好。

从个人经验上讲...我在研究生院编写了一些C代码,在每个节点本身都是多核机器的集群上进行了一些大规模的电生理模型建模。因此,我想到了几种不同的并行方法来解决该问题。

1)我可以单独使用MPI,即使将每个处理器组合在同一台计算机上,也将每个处理器视为自己的"节点"。

2)我可以使用MPI处理在多核节点之间移动的数据,然后在每台多核计算机(处理器共享内存)中使用线程(POSIX线程)。

对于我正在处理的特定数学问题,我首先在一台多核计算机上测试了两种公式:一种使用MPI,一种使用POSIX线程。事实证明,MPI实施效率更高,双核计算机的速度提高了将近2,而线程实施的速度则为1.3-1.4. 对于MPI代码,我能够组织操作,以使处理器很少处于空闲状态,而在它们之间传递消息时却保持忙碌状态,从而掩盖了传输数据的大部分延迟。有了线程代码,我最终遇到了许多互斥锁瓶颈,迫使其他线程在完成其他计算时经常坐下来等待。使线程之间的计算负载保持平衡似乎并没有帮助这个事实。

这可能只是我正在研究的模型所特有的,而线程与MPI的有效性对于其他类型的并行问题可能会有很大的不同。但是,我不同意MPI的开销很大。