在我的程序中,我想大量并行化许多数学计算,然后将其结果写入输出文件。
我使用集体通信(gather
,scatter
等)成功实现了这一点,但我注意到使用这些同步例程,所有处理器中最慢的处理器占据了执行时间并大大减少了总体计算时间,因为快速的处理器会花很多时间等待。
所以我决定切换到这个方案,其中一个(master
)处理器专用于接收结果块并处理文件输出,并且其他处理器计算这些结果并使用它们发送给主服务器。非阻塞send
例程。
不幸的是,我真的不知道如何实现master
代码;我是否需要使用MPI_Recv()
运行无限循环,侦听传入的消息?我怎么知道何时停止循环?我可以合并MPI_Isend()
和MPI_Recv()
,还是两种方法都需要非阻塞?这通常是怎么做的?
答案 0 :(得分:3)
MPI 3.1提供非阻塞集体。我强烈建议不要自己实施。
然而,毕竟它可能对你没有帮助。最终,您需要来自所有进程的数据,即使是慢进程中的数据。所以你可能会在某个时候再次等待。非阻塞通信与通信和计算重叠,但它不能解决您的负载不平衡问题。
更新(或多或少的澄清评论)
您的问题有几个层次,我可能会对标题感到困惑,因为您期望得到什么样的答案。也许问题是
如何在MPI中实现集中式工作队列?
这会定期弹出,最近才出现here。但实际上这通常是不受欢迎的,因为中心组件很快成为大规模程序的瓶颈。所以你遇到的实际问题是你的工作分解和映射是不平衡的。所以更基本的“X问题”是
如何对MPI应用程序进行负载均衡?
此时,您必须提供有关您的数学问题的更多信息,以及它当前的实施情况。优选以[mcve]的形式。同样,没有标准的解决方案。负载平衡是一个巨大的研究领域。它甚至可能是CS.SE的主题,而不是SO。