【发布时间】:2011-05-15 09:39:12
【问题描述】:
如果我在具有 2 个 cpu 的单台机器上运行需要 3 个节点(即 mpiexec -np 3 ./Program)的 MPI 程序会发生什么?
【问题讨论】:
-
我可以建议删除“并发”作为标签吗? MPI 为您提供并行执行,但没有并发,因为您可以编写一个 Web 服务器,比如说用它。
如果我在具有 2 个 cpu 的单台机器上运行需要 3 个节点(即 mpiexec -np 3 ./Program)的 MPI 程序会发生什么?
【问题讨论】:
这当然取决于您的 MPI 实现。最有可能的是,它将创建三个进程,并使用共享内存来交换消息。这将很好地工作:操作系统将在三个进程之间分派两个 CPU,并始终执行就绪进程之一。如果一个进程等待接收消息,它将阻塞,并且操作系统将调度另外两个进程之一运行 - 其中一个将是发送消息的那个。
【讨论】:
Martin 给出了正确的答案,我给他加了 1,但我只想添加一些细节,这些细节有点太长,无法放入评论框中。
当然,拥有比内核更多的进程并没有错;在你运行任何 MPI 程序之前,你的机器上可能已经运行了几十个。您可以尝试使用任何命令行可执行文件,例如 Linux 机器上的 mpirun -np 24 hostname 或 mpirun -np 17 ls,您将获得 24 个主机名副本,或 17 个(可能是交错的)目录列表,一切都运行很好。
在 MPI 中,这种使用比内核更多的进程通常称为“超额订阅”。它有一个特殊名称的事实已经表明它是一个特殊情况。当每个进程都有自己的内核时,使用 MPI 编写的程序通常性能最好。在某些情况下,情况并非如此,但(到目前为止)这是通常的情况。出于这个原因,例如,OpenMPI 已经针对通常情况进行了优化——它只是假设每个进程都有自己的核心,因此非常积极地使用 CPU 轮询以查看是否有消息进入然而(因为它认为它没有做任何其他重要的事情)。这不是问题,如果 OpenMPI 知道它被超额订阅(http://www.open-mpi.org/faq/?category=running#oversubscribing),可以很容易地关闭它。这是一项设计决策,可以提高绝大多数案例的性能。
由于历史原因,我比 MPICH2 更熟悉 OpenMPI,但我的理解是 MPICH2 的默认设置更能容忍超额订阅的情况——但我认为即使在那里,也可以打开更积极的忙等待。
无论如何,这是一个很长的说法,是的,你所做的一切都很好,如果你在切换 MPI 甚至 MPI 版本时发现任何奇怪的问题,请快速搜索以查看是否存在是在这种情况下需要调整的任何参数。
【讨论】: