LeT*_*Tex 10 parallel-processing message-passing mpi shared-memory openmpi
我有一些研究相关的问题.
目前我已经完成了基于MPI(特别是使用openmpi 6.3)的结构骨架框架的实现.框架工作应该在单台机器上使用.现在,我将它与其他先前的骨架实现(例如scandium,fast-flow,..)进行比较
我注意到的一件事是我的实现的性能不如其他实现.我认为这是因为,我的实现基于MPI(因此需要匹配发送和接收操作的双向通信),而我正在比较的其他实现基于共享内存.(...但我仍然没有很好的解释来证明这一点,这是我的问题的一部分)
这两个类别的完成时间有很大差异.
今天我也介绍了配置open-mpi for shared memory => openmpi-sm
我的问题出现了.
1,为共享内存配置MPI意味着什么?我的意思是MPI进程存在于自己的虚拟内存中; 究竟是什么标志就像在下面的命令一样呢?(我认为在MPI中,每次通信都是通过显式传递消息,进程之间没有共享内存).
shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out
Run Code Online (Sandbox Code Playgroud)
第二,为什么MPI的性能与为共享内存开发的其他骨架实现相比要差得多?至少我也在一台多核机器上运行它.(我想这是因为其他实现使用了线程并行编程,但我没有令人信服的解释).
任何建议或进一步讨论都是非常受欢迎的.
如果我需要进一步澄清我的问题,请告诉我.
感谢您的时间!
Hri*_*iev 12
Open MPI非常模块化.它有自己的组件模型,称为模块化组件架构(MCA).这是--mca参数名称的来源 - 它用于为MCA参数提供运行时值,由MCA中的不同组件导出.
每当给定通信器中的两个进程想要彼此通信时,MCA就会找到合适的组件,这些组件能够将消息从一个进程传输到另一个进程.如果两个进程都驻留在同一节点上,则Open MPI通常会选择共享内存BTL组件,称为sm.如果两个进程都驻留在不同的节点上,则Open MPI会遍历可用的网络接口,并选择可以连接到另一个节点的最快的网络接口.它对InfiniBand等快速网络(通过openibBTL组件)提供了一些偏好,但如果您的集群没有InfiniBand,则如果tcpBTL组件位于允许的BTL列表中,则使用TCP/IP作为后备.
默认情况下,您无需执行任何特殊操作即可启用共享内存通信.只需启动你的程序mpiexec -np 16 ./a.out.你所链接的是Open MPI FAQ的共享内存部分,它提供了关于sm可以调整BTL的哪些参数以获得更好性能的提示.我使用Open MPI的经验表明,即使在多级NUMA系统等奇特的硬件上,默认参数也几乎达到最佳状态并且运行良好.请注意,默认的共享内存通信实现将数据复制两次 - 一次从发送缓冲区复制到共享内存,一次从共享内存复制到接收缓冲区.KNEM形式的快捷方式内核设备,但你必须下载它并单独编译它,因为它不是标准Linux内核的一部分.在KNEM支持下,Open MPI能够在同一节点上的进程之间执行"零拷贝"传输 - 复制由内核设备完成,它是从第一个进程的内存直接复制到第二个进程的内存处理.这极大地改善了驻留在同一节点上的进程之间的大型消息传输.
另一种选择是完全忘记MPI并直接使用共享内存.您可以使用POSIX内存管理界面(请参见此处)创建一个共享内存块,让所有进程直接对其进行操作.如果数据存储在共享存储器中,则可能是有益的,因为不会制作副本.但请注意现代多插槽系统上的NUMA问题,其中每个插槽都有自己的内存控制器,并且从同一块板上的远程插槽访问内存的速度较慢.进程固定/绑定也很重要 - 传递--bind-to-socket给mpiexec它将每个MPI进程固定到一个单独的CPU核心.