为共享内存配置MPI意味着什么?

时间:2012-11-21 21:14:37

标签: parallel-processing mpi shared-memory openmpi message-passing

我有一些与研究相关的问题。

目前我已经完成了基于MPI的结构骨架框架的实现(特别是使用openmpi 6.3)。框架工作应该在单台机器上使用。 现在,我将它与之前的其他骨架实现进行比较(例如scandiumfast-flow,..)

我注意到的一件事是我的实现的性能不如其他实现。 我认为这是因为,我的实现基于MPI(因此需要匹配发送和接收操作的双向通信) 而我正在比较的其他实现基于共享内存。 (...但我仍然没有很好的解释来证明这一点,这是我的问题的一部分)

这两个类别的完成时间有很大差异。

今天我还介绍了配置open-mpi for shared memory => openmpi-sm

然后出现了我的问题。

第一为共享内存配置MPI意味着什么?我的意思是MPI进程存在于自己的虚拟内存中;究竟是什么标志就像在下面的命令一样呢? (我认为在MPI中,每次通信都是通过显式传递消息,进程之间没有共享内存)。

    shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out

第二为什么MPI的性能与为共享内存开发的其他骨架实现相比要差得多?至少我也在一台多核机器上运行它。 (我想这是因为其他实现使用了线程并行编程,但我没有令人信服的解释)。

非常欢迎任何建议或进一步讨论。

如果我需要进一步澄清我的问题,请告诉我。

谢谢你的时间!

1 个答案:

答案 0 :(得分:12)

Open MPI非常模块化。它有自己的组件模型,称为模块化组件架构(MCA)。这是--mca参数的名称来源 - 它用于为MCA参数提供运行时值,由MCA中的不同组件导出。

每当给定通信器中的两个进程想要彼此通信时,MCA就会找到合适的组件,这些组件能够将消息从一个进程传输到另一个进程。如果两个进程都驻留在同一节点上,则Open MPI通常会选择共享内存BTL组件,称为sm。如果两个进程都驻留在不同的节点上,则Open MPI会遍历可用的网络接口,并选择可以连接到另一个节点的最快的网络接口。它对InfiniBand等快速网络(通过openib BTL组件)提供了一些偏好,但如果您的集群没有InfiniBand,如果tcp BTL组件位于其中,则使用TCP / IP作为后备允许的BTL列表。

默认情况下,不需要执行任何特殊操作以启用共享内存通信。只需使用mpiexec -np 16 ./a.out启动您的计划即可。您所链接的是Open MPI FAQ的共享内存部分,它提供了有关sm BTL的哪些参数可以调整以获得更好性能的提示。我使用Open MPI的经验表明,即使在多级NUMA系统等奇特的硬件上,默认参数也几乎达到最佳状态并且运行良好。请注意,默认的共享内存通信实现将数据复制两次 - 一次从发送缓冲区复制到共享内存,一次从共享内存复制到接收缓冲区。快捷方式以KNEM内核设备的形式存在,但您必须单独下载并单独编译,因为它不是标准Linux内核的一部分。在KNEM支持下,Open MPI能够在同一节点上的进程之间执行“零拷贝”传输 - 复制由内核设备完成,它是从第一个进程的内存直接复制到第二个进程的内存处理。这大大改善了驻留在同一节点上的进程之间的大型消息传输。

另一种选择是完全忘记MPI并直接使用共享内存。您可以使用POSIX内存管理界面(请参阅here)创建一个共享内存块,让所有进程直接对其进行操作。如果数据存储在共享存储器中,则可能是有益的,因为不会制作副本。但请注意现代多插槽系统上的NUMA问题,其中每个插槽都有自己的内存控制器,并且从同一块板上的远程插槽访问内存的速度较慢。进程固定/绑定也很重要 - 将--bind-to-socket传递给mpiexec,使其将每个MPI进程固定到一个单独的CPU核心。