防止 MPI 忙循环

Posted

技术标签:

【中文标题】防止 MPI 忙循环【英文标题】:Prevent MPI from busy looping 【发布时间】:2016-09-01 21:40:48 【问题描述】:

我有一个 MPI 程序过度订阅/过度使用其处理器。也就是说:进程比处理器多得多。

不过,这些进程中只有少数进程在给定时间处于活动状态,因此不应争用计算资源。

但是,就像海底总动员中的海鸥群,当这些进程等待通信时,它们都在忙循环,问“我的?我的?我的?”

                                     

我同时使用 Intel MPI 和 OpenMPI(用于不同的机器)。我怎样才能说服他们不要忙循环?

我的快速而肮脏的解决方案是在循环中使用 MPI_Iprobe 和 sleep 命令(请参阅 here)。

【问题讨论】:

您是否在单个主机上运行所有进程? 不,它们可能分布在多个主机上。 主机用什么样的网络连接? 我实际上在单个主机上遇到了这个问题,只是没有机会对此进行自己的研究。因此,如果有一个普遍的答案,我会非常感兴趣,而不仅仅是针对特定的 BTL。 @Zulan,我不相信有一个通用的开关。根据下面的硬件,每个 BTL 都有自己的同步和通知需求和偏好。 【参考方案1】:

这个问题已经有一段时间了,但是这个post 可能有你正在寻找的答案。 (如果您使用的是 OpenMPI,则将 --mca mpi_yield_when_idle 1 作为参数传递给 mpirun

除此之外,如果您的 MPI 进程在 MPI 障碍处等待,您可以设置 I_MPI_WAIT_MODE=1 以防止 INTEL 的 MPI 中的繁忙循环。对于 OpenMPI,请参阅链接的帖子。

【讨论】:

以上是关于防止 MPI 忙循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 MPI 在 C++ 中并行 for 循环

如何使用 MPI 和 OpenMP 运行并行循环

MPI (mpi4py) - 如果第一个 test() 返回 false,则 irecv() 和 test() 不会在循环中工作

为啥 MPI_SEND 在我的 for 循环中不起作用?如果明确说明它工作正常

等待条件的空循环(忙等待)

忙等待循环中是不是需要内存屏障或原子操作?