如果我在一台拥有2个CPU的计算机上运行需要3个节点(即mpiexec -np 3 ./Program)的MPI程序会发生什么?
答案 0 :(得分:9)
这当然取决于你的MPI实现。最有可能的是,它将创建三个进程,并使用共享内存来交换消息。这样可以正常工作:操作系统将在三个进程中分配两个CPU,并始终执行其中一个就绪进程。如果进程等待接收消息,它将阻塞,操作系统将安排另外两个进程之一运行 - 其中一个进程将是发送消息的进程。
答案 1 :(得分:8)
马丁给出了正确的答案,我加上了他,但我只是想添加一些有点太长的微妙之处,以适应评论框。
当然,拥有更多进程而不是核心是没有错的;在运行任何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),可以轻松关闭。这是一个设计决策,可以改善绝大多数情况下的表现。
由于历史原因,我对OpenMPI比MPICH2更熟悉,但我的理解是MPICH2s的默认值更宽容超额认购的情况 - 但我认为即使在那里,也有可能开启更激进的忙碌等待。
无论如何,这是一个很长的说法,是的,你正在做的事情是完美的,如果你在切换MPI甚至MPI的版本时看到任何奇怪的问题,快速搜索,看看是否有是否需要针对此案例进行调整的任何参数。