【问题标题】:MPI on a single machine dualcore单机双核上的 MPI
【发布时间】:2011-05-15 09:39:12
【问题描述】:

如果我在具有 2 个 cpu 的单台机器上运行需要 3 个节点(即 mpiexec -np 3 ./Program)的 MPI 程序会发生什么?

【问题讨论】:

  • 我可以建议删除“并发”作为标签吗? MPI 为您提供并行执行,但没有并发,因为您可以编写一个 Web 服务器,比如说用它。

标签: parallel-processing mpi


【解决方案1】:

这当然取决于您的 MPI 实现。最有可能的是,它将创建三个进程,并使用共享内存来交换消息。这将很好地工作:操作系统将在三个进程之间分派两个 CPU,并始终执行就绪进程之一。如果一个进程等待接收消息,它将阻塞,并且操作系统将调度另外两个进程之一运行 - 其中一个将是发送消息的那个。

【讨论】:

  • 但是说我希望三个进程尽可能独立,并且只通过消息传递进行通信。理想情况下,我需要一台具有 3 个 CPU 的机器,对吗?作为 MPI 实现,我使用的是 MPICH2。
  • 错了。这些进程将在两个处理器上已经独立。操作系统只会安排它们;每个人将获得一个 CPU 的 66%。除非它们阻止等待消息,否则它们将“全速”运行(这意味着它们将使两个 CPU 都处于满负荷状态,并取得所有单独的进展)。
  • 操作系统将在阻塞发送/接收操作上重新调度进程的假设并不普遍正确。一些 MPI 实现以这种方式运行,而另一些则不这样做,通常是出于性能原因。例如,当前 MPICH2 版本的库存构建将不会阻止(在操作系统意义上)阻塞 MPI 操作。
【解决方案2】:

Martin 给出了正确的答案,我给他加了 1,但我只想添加一些细节,这些细节有点太长,无法放入评论框中。

当然,拥有比内核更多的进程并没有错;在你运行任何 MPI 程序之前,你的机器上可能已经运行了几十个。您可以尝试使用任何命令行可执行文件,例如 Linux 机器上的 mpirun -np 24 hostnamempirun -np 17 ls,您将获得 24 个主机名副本,或 17 个(可能是交错的)目录列表,一切都运行很好。

在 MPI 中,这种使用比内核更多的进程通常称为“超额订阅”。它有一个特殊名称的事实已经表明它是一个特殊情况。当每个进程都有自己的内核时,使用 MPI 编写的程序通常性能最好。在某些情况下,情况并非如此,但(到目前为止)这是通常的情况。出于这个原因,例如,OpenMPI 已经针对通常情况进行了优化——它只是假设每个进程都有自己的核心,因此非常积极地使用 CPU 轮询以查看是否有消息进入然而(因为它认为它没有做任何其他重要的事情)。这不是问题,如果 OpenMPI 知道它被超额订阅(http://www.open-mpi.org/faq/?category=running#oversubscribing),可以很容易地关闭它。这是一项设计决策,可以提高绝大多数案例的性能。

由于历史原因,我比 MPICH2 更熟悉 OpenMPI,但我的理解是 MPICH2 的默认设置更能容忍超额订阅的情况——但我认为即使在那里,也可以打开更积极的忙等待。

无论如何,这是一个很长的说法,是的,你所做的一切都很好,如果你在切换 MPI 甚至 MPI 版本时发现任何奇怪的问题,请快速搜索以查看是否存在是在这种情况下需要调整的任何参数。

【讨论】:

  • 谢谢你们。这澄清了我的疑虑。
  • MPICH2 中的默认频道 (ch3:nemesis) 目前还不能很好地支持超额订阅,尽管未来计划提供更好的支持。如果您使用 ch3:sock 配置 MPICH2,那么超额订阅应该不是问题,但共享内存不会用于节点内的通信。相关FAQ条目:wiki.mcs.anl.gov/mpich2/index.php/…
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 2012-02-07
  • 2012-07-24
  • 2020-10-21
  • 2017-11-06
  • 2012-11-12
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多