25

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

4

7 回答 7

69

我在具有多核节点的大型集群上广泛使用了 MPI。我不确定这对于单个多核机器是否正确,但如果您预计您的代码有一天可能会比单个芯片更大,您可能会考虑在 MPI 中实现它。现在,没有什么比 MPI 更大。我不确定提到不可接受的开销的海报来自哪里,但我试图在下面概述相关的权衡。继续阅读以了解更多信息。

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

如果你想在单芯片多核机器上使用 MPI,它会工作得很好。事实上,最新版本的 Mac OS X 预装了OpenMPI,您可以在普通的多核 Linux 机器上轻松下载安装 OpenMPI。洛斯阿拉莫斯的大部分系统 都在使用 OpenMPI 。Livermore在他们的 Linux 集群上使用mvapich 。在深入研究之前你应该记住的是,MPI 是为解决分布式内存系统上的大规模科学问题而设计的。您正在处理的多核机器可能具有共享内存

OpenMPI 和其他实现默认使用共享内存进行本地消息传递,因此当您将消息传递给本地进程时,您不必担心网络开销。它非常透明,我不确定其他海报从哪里得到他们对高开销的担忧。需要注意的是,MPI 并不是您可以用来在单个多核机器上获得并行性的最简单的方法。在 MPI 中,所有消息传递都是显式的。由于这个原因,它被称为并行编程的“汇编语言”。如果您不是经验丰富的HPC人员,则进程之间的显式通信并不容易,并且还有其他更适合共享内存的范例(UPCOpenMPErlang仅举几例),您可能会先尝试。

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

最后,如果您真的很喜欢冒险,请尝试将 MPI 与线程、OpenMP 或其他一些本地共享内存范例结合使用。您可以使用 MPI 进行分布式消息传递,并使用其他方式进行节点并行。这就是大型机器的发展方向;未来拥有数十万个或更多处理器的机器预计将具有可扩展到所有节点但不是所有内核的 MPI 实现,HPC 人员将被迫构建混合应用程序。这不适合胆小的人,在这个领域有一个公认的范式之前还有很多工作要做。

于 2008-12-12T16:17:56.223 回答
12

我不得不同意 tgamblin。您可能不得不卷起袖子,真正深入研究使用 MPI 的代码,自己明确地处理消息传递的组织。如果这是您喜欢或不介意做的事情,我希望 MPI 在多核机器上的工作与在分布式集群上一样好。

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

1)我可以单独使用 MPI,将每个处理器视为它自己的“节点”,即使它们中的一些在同一台机器上组合在一起。

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

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

这可能仅针对我正在处理的模型,并且对于其他类型的并行问题,线程与 MPI 的有效性可能会有很大差异。尽管如此,我不同意 MPI 的开销很大。

于 2009-01-17T01:27:59.870 回答
4

不,在我看来,它不适合您在多核系统上进行的大多数处理。开销太高,你传递的对象必须被深度克隆,传递大对象图然后运行非常小的计算是非常低效的。它实际上是为了在不同的进程之间共享数据,通常在单独的内存空间中运行,并且通常运行长时间的计算。
多核处理器是共享内存机器,因此有更有效的并行处理方法,不涉及复制对象,并且大多数线程运行时间很短。例如,考虑一个多线程快速排序。使用 MPI 和无限制分配内存和将数据复制到线程之前,它可以被分区的开销会慢得多处理器数量比在单个处理器上运行的 Quicksort 多。
例如,在 Java 中,我会使用 BlockingQueue(一种共享内存结构)在线程之间传递对象引用,而且开销很小。
并不是说它没有它的位置,例如使用消息传递的谷歌搜索集群。但这可能不是您要解决的问题。

于 2008-09-29T08:10:33.550 回答
3

MPI 并不是低效的。您需要将问题分解成块并传递块并在每个块的结果完成时重新组织。当每个线程只处理部分问题时,没有人会通过 MPI 传递整个对象。不是接口或设计模式的低效,而是程序员在如何分解问题方面知识的低效。

当您使用锁定机制时,互斥体的开销不能很好地扩展。这是因为下划线的 runqueue 不知道您接下来何时要锁定线程。与消息传递设计模式相比,您将使用互斥锁执行更多的内核级抖动。

于 2008-12-12T17:02:57.507 回答
1

MPI 的开销非常大,主要用于处理进程间通信和异构系统。我在传递少量数据并且计算与数据的比率很大的情况下使用它。这不是大多数消费者或业务任务的典型使用场景,无论如何,正如之前的回复所提到的,在像多核机器这样的共享内存架构上,有更快的方法来处理它,比如内存指针。

如果您对上面描述的属性有某种问题,并且希望能够将工作分散到其他机器上,而这些机器必须与您在同一个高速网络上,那么 MPI 可能是有意义的。不过,我很难想象这样的场景。

于 2008-09-29T08:29:37.547 回答
1

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

于 2008-09-29T09:13:36.397 回答
0

您必须决定是要低级线程还是高级线程。如果您想要低级别,请使用 pThread。您必须小心不要引入竞争条件并使线程性能对您不利。

我使用了一些用于(C 和 C++)的 OSS 包,它们可扩展并优化任务调度。TBB(线程构建块)和 Cilk Plus 非常好,易于编码和获得应用。我也相信他们足够灵活,如果需要,可以在以后将其他线程技术集成到其中(OpenMP 等)

www.threadingbuildingblocks.org www.cilkplus.org

于 2012-12-12T17:49:19.900 回答