Parallel processing 使用MPI向随机选择的主机发送数据

Parallel processing 使用MPI向随机选择的主机发送数据,parallel-processing,mpi,Parallel Processing,Mpi,我有41台在同一局域网上使用MPI的计算机。MPI在这些机器上运行良好,没有任何问题。我想用其中一个随机选择,将浮点数发送给其他40台计算机。我的意思是,主分发服务器计算机将随机选择一台主机,并向其发送一个浮点数。此过程将重复执行。这40台主机将使用这些浮点数进行计算。出于某些启发式优化原因,需要进行随机选择。因此,对于发送浮点数,一些主机可能经常被选择,一些主机可能很少被选择,一些主机可能永远不会被选择 我试图通过阅读文档和使用示例来理解阻塞和非阻塞通信。结果,我发现我不能使用MPI_Send

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

我试图通过阅读文档和使用示例来理解阻塞和非阻塞通信。结果,我发现我不能使用MPI_Send和MPI_Recv进行我提到的随机选择。因为,作为其阻塞模型的一种性质,接收方主机必须等待分发计算机的发送过程,而不进行任何收益计算。MPI_ISend和MPI_IRecv可能有用,但我找不到方法。因为我发现的示例程序大多使用MPI_Wait。最终,这些程序也会等待来自distributer计算机的数据,而不做任何事情。我的主机必须检查消息,但如果没有消息,它必须使用初始浮点数值或以前收到的值继续自己的计算

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

感谢您的阅读

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

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

正如suszterpatt提到的,MPI_测试是解决此问题的一个好方法

或者,如果由于某种原因,您在邮件发送给您之前无法确定邮件的大小/形状,则可以使用MPI_Iprobe,而无需提前发布邮件。一般而言,MPI_Irecv+MPI_测试优于MPI_Iprobe。另外,如果您正在编写多线程代码,那么MPI_Iprobe可能完全不可用。

正如suszterpatt提到的,MPI_测试是解决此问题的一个好方法


或者,如果由于某种原因,您在邮件发送给您之前无法确定邮件的大小/形状,则可以使用MPI_Iprobe,而无需提前发布邮件。一般而言,MPI_Irecv+MPI_测试优于MPI_Iprobe。另外,如果您正在编写多线程代码,那么MPI_Iprobe可能完全不可用。

如果随机数的潜在刷新将定期对所有列组执行……那么集体操作可能是一个很好的选择

MPI_分散特别允许每个列组接收不同的值。这可用于分配随机数,前提是可以建立一些控制数0、MAXFOAT或类似的值。MPI_分散可以允许每个列组接收多个数字。请参见recvcount参数。这可用于向每个列组发送成对的数字。可以建立一些模式,将标志和值传输到每个列组。例如,如果第一个数字为正,则使用第二个数字作为新种子…如果第一个数字为负,则继续使用最后一个种子


或者,MPI_散点可用于分配标志,该标志将允许接收随机数的特定列组执行特定的阻塞recv。这将有助于简化作业的清理,并避免让所有级别清理不匹配的MPI_Recv

如果随机数的潜在刷新将定期对所有列组进行……那么集体操作可能是一个很好的选择

MPI_分散特别允许每个列组接收不同的值。这可用于分配随机数,前提是可以建立一些控制数0、MAXFOAT或类似的值。MPI_分散可以允许每个列组接收多个数字。请参见recvcount参数。这可用于向每个列组发送成对的数字。可以建立一些模式,将标志和值传输到每个列组。例如,如果第一个数字为正,则使用第二个数字作为新种子…如果第一个数字为负,则继续使用最后一个种子

或者,可以使用MPI_散布来分发一个标志,该标志将允许接收数据的特定列组
执行特定阻塞recv的随机数。这将有助于简化作业的清理,并避免让所有级别清理不匹配的MPI_Recv

一个小的修正:你应该检查出参数标志,而不是状态参数,以确定是否收到了请求。啊,是的,草率地写下答案。编辑。一个小的更正:你应该检查出参数标志,而不是状态参数,以确定是否收到请求。啊,是的,草率地写下答案。编辑。