多核机器上的MPI

多核机器上的MPI,mpi,Mpi,我的情况很简单:我想在一台多处理器/核心机器上运行一个支持MPI的软件,比如说8台 我的MPI实现是MPICH2 据我所知,我有几个选择: $mpiexec-n 8我的\u软件 $mpiexec-n8-hosts{localhost:8}myu软件 或者我也可以将Hydra指定为“fork”,而不是“ssh” $mpiexec-n 8-启动程序分叉my_软件 你能告诉我是否会有什么不同,或者行为是否会相同吗 当然,由于我的所有节点都在同一台机器上,我不希望“消息传递”通过网络(甚至本地循环)完成

我的情况很简单:我想在一台多处理器/核心机器上运行一个支持MPI的软件,比如说8台

我的MPI实现是MPICH2

据我所知,我有几个选择:

$mpiexec-n 8我的\u软件

$mpiexec-n8-hosts{localhost:8}myu软件

或者我也可以将Hydra指定为“fork”,而不是“ssh”

$mpiexec-n 8-启动程序分叉my_软件

你能告诉我是否会有什么不同,或者行为是否会相同吗


当然,由于我的所有节点都在同一台机器上,我不希望“消息传递”通过网络(甚至本地循环)完成,而是通过共享内存完成。据我所知,MPI将自行解决这一问题,所有三个选项都是如此。

如果您已正确设置了所有设置,则我看不出您的程序的行为将取决于您如何启动它,除非它无法在一个或另一个选项下启动。(这意味着您没有在一开始就正确设置所有内容。)

如果内存很好,那么消息传递的实现方式取决于您使用的MPI设备。过去你会使用mpi ch_shmem设备。这管理了进程之间的消息传递,但它确实使用了缓冲区空间,并且消息被发送到该空间或从该空间发送出去。所以消息传递完成了,但速度是内存总线速度

我用过去时写作,因为我已经有一段时间不熟悉硬件了,我知道(或者说,坦率地说,我关心)底层的实现细节,更现代的MPI安装可能会更复杂一些。事实上,任何现代MPI安装都会用多核/多处理器机器上的共享内存读/写来代替消息传递,这让我感到惊讶和高兴。我会感到惊讶,因为它需要将消息传递转换为共享内存访问,我不确定这对整个MPI来说是否容易(或者说足够容易)。我认为目前的实现更可能仍然依赖于通过某个缓冲区通过内存总线传递的消息。但是,正如我所说,这只是我最好的猜测,在这些问题上我经常是错的。

简单的回答:

所有方法都应导致相同的性能。您将有8个进程在内核上运行并使用共享内存

技术性答复:

“fork”具有兼容性的优势,在rsh/ssh进程生成将成为问题的系统上。但是,我想,只能在本地启动进程

最后(除非MPI被奇怪地配置),同一CPU上的所有进程都将使用“共享内存”,而启动器或主机规范方法对此不重要。通信方法由另一个参数(-channel?)处理

主机规范方法的特定语法可以允许将进程绑定到特定的CPU核心,然后根据应用程序的不同,您的性能可能会稍好或稍差