如何使用非阻塞点对点 MPI 例程而不是集合体

How to use non-blocking point-to-point MPI routines instead of collectives

在我的程序中,我想大量并行化许多数学计算,然后将其结果写入输出文件。

我使用集体通信(gatherscatter 等)成功实现了这一点,但我注意到使用这些同步例程,所有处理器中最慢的处理器控制了执行时间并大大减少了整体计算量时间,因为快速处理器花费大量时间等待。

所以我决定切换到该方案,其中一个 (master) 处理器专用于接收结果块和处理文件输出,所有其他处理器计算这些结果并将它们发送到掌握使用非阻塞 send 例程。

不幸的是,我真的不知道如何实现 master 代码;我是否需要 运行 与 MPI_Recv() 的无限循环,侦听传入消息?我怎么知道什么时候停止循环?我可以结合使用 MPI_Isend()MPI_Recv(),还是两种方法都必须是非阻塞的?这通常是如何完成的?

MPI 3.1 提供 non-blocking 集合体。我强烈建议不要自己实施它。

但是,它可能终究帮不了你。最终您需要来自所有进程的数据,即使是慢进程。所以你可能会在某个时候再次等待。 Non-blocking 通信与通信和计算重叠,但它不能解决负载不平衡问题。

更新(或多或少是一个很长的澄清评论)

你的问题有好几个层次,我可能被标题弄糊涂了,不知道你期待什么样的答案。也许问题是

How do I implement a centralized work queue in MPI?

这会定期弹出,最近 here。但这实际上通常是不可取的,因为中央组件很快就会成为大型程序的瓶颈。所以你遇到的实际问题是你的工作分解和映射是不平衡的。所以更基本的"X-question"是

How do I load balance an MPI application?

届时您必须提供有关您的数学问题及其当前实现的更多信息。最好是 [mcve] 的形式。同样,没有标准的解决方案。负载均衡是一个巨大的研究领域。它甚至可能是 CS.SE 而不是 SO 的主题。