使用MPI将数据发送到随机选择的主机

时间:2011-09-08 16:08:29

标签: parallel-processing mpi

我有41台计算机在同一局域网上使用MPI。 MPI在这些机器上运行良好,没有任何问题。我想使用其中一个通过随机选择向其他40台计算机发送一个浮点数。我的意思是主分配器计算机将随机选择一个主机并向其发送一个浮点数。这个过程将重复执行。这40个主机将使用这些浮点数进行计算。某些“启发式优化”原因需要随机选择。因此,对于发送浮点数,可能会频繁选择某些主机,可能很少选择某些主机(可能永远不会选择)。

我尝试通过阅读文档和使用示例来了解阻止和非阻塞通信。结果,我看到我不能像我提到的那样随机选择MPI_SendMPI_Recv。因为接收器主机必须等待分配器计算机的发送过程而不进行任何益处计算作为其阻塞模型的性质。 MPI_ISendMPI_IRecv可能有用,但我找不到办法。因为我发现的示例程序主要使用MPI_Wait。最终这些程序也在等待来自分配器计算机的数据而不做任何事情。 我的主机必须检查邮件,但如果没有邮件,则必须使用初始浮点数值或先前收到的值继续自己的计算。

我该怎么办?至少,哪些功能可用于此目的。

感谢您阅读

3 个答案:

答案 0 :(得分:3)

MPI_Test正是您要找的。它将轮询由MPI_Irecv发起的非阻塞接收,并立即返回,即使通信尚未完成。您可以在调用后检查 MPI_Status对象 flag参数,以查看是否收到了新消息,并进行相应的分支。

答案 1 :(得分:2)

正如suszterpatt所提到的,MPI_Test是解决这个问题的好方法。

或者,您可以使用MPI_Iprobe而不提前发布消息,如果由于某种原因您无法弄清楚消息的大小/形状是什么,直到它发送给您。一般来说,MPI_Irecv + MPI_Test优于MPI_Iprobe。此外,如果您正在编写多线程代码,则MPI_Iprobe可能完全无法使用。

答案 2 :(得分:1)

如果随机数的潜在刷新将以“定期间隔”对所有等级进行......那么集体操作可能是合适的。

MPI_Scatter特别允许每个等级接收不同的值。这可以用于分配随机数,只要可以建立一些“控制”数(0,MAXFOAT或类似的东西)。 MPI_Scatter可以允许每个等级接收多个数字(请参阅recvcount参数)。这可以用于向每个等级发送数字对。可以建立一些模式以向每个等级发送“标志”和“值”。例如,如果第一个数字为正数,则使用第二个数字作为新种子...如果第一个数字为负数,则继续使用最后一个种子。

或者,MPI_Scatter可用于分发一个标志,该标志将允许将接收随机数的特定排名执行特定的阻塞recv。这将有助于简化作业的清理,并避免让所有级别清理无与伦比的MPI_Recv。