我的情况很简单:我想在一台多处理器/核心机器上运行一个支持MPI的软件,比方说8台。
我的MPI实现是MPICH2。
据我所知,我有几个选择:
$ mpiexec -n 8 my_software
$ mpiexec -n 8 -hosts {本地主机:8} my_software
或者我也可以指定Hydra为"fork“而不是"ssh";
$ mpiexec -n 8 -launcher分支my_software
你能告诉我是否会有什么不同,或者行为是一样的吗?
当然,因为我的所有节点都在同一台机器上,所以我不希望“消息传递”通过网络(甚至是本地循环),而是通过共享内存。据我所知,MPI将自己弄清楚这一点,这将是所有三个选项的情况。
发布于 2012-03-09 00:02:48
答案很简单:
所有的方法都应该产生相同的性能。您将有8个进程在内核上运行,并使用共享内存。
技术答案:
在rsh/ssh进程产生问题的系统上,"fork“具有兼容性优势。但是,我想,只能在本地启动进程。
最后(除非MPI被奇怪地配置),同一个CPU上的所有进程都将使用“共享内存”,而启动器或主机规范方法应该与此无关。通信方法由另一个参数(-channel ?)处理。
主机规范方法的特定语法可以允许将进程绑定到特定的CPU核心,然后根据应用程序的不同,您可能会有稍微更好或更差的性能。
发布于 2012-03-08 23:38:25
如果你已经正确地设置了所有的东西,那么我不认为你的程序的行为将取决于你如何启动它,除非它在其中一个或另一个选项下启动失败。(这意味着您在一开始就没有正确地设置所有内容。)
如果我没记错的话,消息传递的实现方式取决于您使用的MPI设备。过去,你会使用mpi ch_shmem设备。这管理了进程之间的消息传递,但它确实使用了缓冲区空间,并且消息是从这个空间发送到这个空间的。因此,消息传递完成了,但以内存总线速度进行。
我用过去式写作,因为我知道(或者,坦率地说,关心)低级实现细节的硬件已经有一段时间了,而更现代的MPI安装可能会有点或更复杂。我会感到惊讶和高兴的是,任何现代的MPI安装实际上都将消息传递替换为多核/多处理器机器上的共享内存读/写。我会感到惊讶,因为它需要将消息传递转换为共享内存访问,而我不确定这对整个MPI来说是否容易(或足够简单到可行)。我认为更有可能的是,当前的实现仍然依赖于通过一些缓冲区在内存总线上传递消息。但是,正如我所说的,这只是我最好的猜测,在这些问题上我经常是错的。
https://stackoverflow.com/questions/9618937
复制相似问题