我有一点研究相关问题。
目前,我有(特别是使用成品实现了基于MPI结构骨架的工作了openmpi 6.3 )。 框架工作是应该单个机器上使用。 现在,我与其他先前的框架实现它比较(如钪 , 快速流动 ,..)
有一两件事我注意到的是,我实现的性能并不像其他实现一样好。 我想这是因为,我的实现是基于MPI(因而需要发送的比赛和接收操作两面的通信),而其他实现我与基于共享内存比较。 (...但我仍然没有很好的解释弄明白这一点,这是我的问题的一部分)
上有两类完成时间一些大的区别。
今天,我还介绍到这里共享内存=>了openmpi的结构的openmpi-SM
偶然有我的问题是。
1这是什么意思配置MPI共享内存? 我的意思是当MPI进程活在自己的虚拟内存; 真正像在下面的命令做标记? (我想在MPI每个通信是通过明确传递消息,无记忆在进程间共享)。
shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out
第二 ,为什么是MPI的性能相比,共享内存等开发框架实现与差这么多? 至少我还运行它一个单一的多核机器上。 (我想这是因为其他实现中使用线程并行编程,但我有没有令人信服的解释)。
任何建议或进一步的讨论是非常欢迎的。
请让我知道,如果我有进一步澄清我的问题。
感谢您的时间!
开放式MPI非常模块化。 它有一个叫做模块化组件架构(MCA)自己的组件模型。 这是其中的名称--mca
参数来源于-它被用于提供运行时的值到MCA参数,通过在MCA的不同组件出口。
每当在一个给定的通信两个进程要相互交谈,MCA找到合适的组件,其能够从一个进程发送消息到另一个。 如果这两个进程驻留在同一节点上,打开MPI通常采共享存储器BTL成分,被称为sm
。 如果这两个进程驻留在不同的节点上,打开MPI走可用的网络接口,并据法权产,可以连接到其他节点最快的国家之一。 它把一些喜好对快速网络,如InfiniBand的(通过openib
BTL组件),但如果你的群集没有InfiniBand的,TCP / IP作为后备,如果tcp
BTL成分在允许BTLS的列表。
默认情况下,你不需要做任何特殊,以使共享内存进行通信。 只需启动你的程序mpiexec -np 16 ./a.out
。 你有什么联系到正在打开MPI FAQ这给什么参数提示的共享内存部分sm
BTL可能为了获得更好的性能进行调整。 我与开放MPI的经验表明,默认的参数几乎是最佳的,并且工作得很好,即使是在充满异国情调的硬件一样多NUMA系统。 需要注意的是默认的共享内存实现通讯的数据复制两次 - 从发送缓冲区共享内存一次,一次从共享内存接收缓冲区。 快捷方式存在于形式KNEM内核设备,但是你必须下载并单独编译它,因为它不是标准Linux内核的一部分。 与KNEM支撑,打开MPI能够在同一节点上的进程之间进行“零拷贝”转移 - 复制是由内核设备完成,它是从第一处理的存储器的直接复制到所述第二的存储器处理。 这极大地提高了大的消息的驻留在同一节点上的进程之间的转移。
另一种选择是完全忘记了MPI和直接使用共享内存。 您可以使用POSIX的内存管理接口(见这里 )来创建一个共享的内存块都处理上直接操作。 如果数据被存储在共享的内存,它可能是有益的,因为没有副本将作出。 但要注意的问题NUMA现代多插槽系统,其中每个插座具有远程插座自己的内存控制器和内存访问同一块板上较慢。 过程钉扎/结合也很重要-传递--bind-to-socket
到mpiexec
有它每个MPI过程PINN到一个单独的CPU核心。