【问题标题】:Sending data to randomly selected hosts by using MPI使用 MPI 向随机选择的主机发送数据
【发布时间】:2013-08-13 21:42:41
【问题描述】:

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

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

我该怎么做?至少,哪些函数可以用于此目的。

感谢阅读

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案1】:

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

    【讨论】:

    • 一个小修正:您应该检查 OUT 参数 flag 而不是 status 参数以确定是否收到请求。
    • 啊,是的,草草写了答案。已编辑。
    【解决方案2】:

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

    或者,您可以使用MPI_Iprobe 而不提前发布消息,如果由于某种原因您无法确定消息的大小/形状,直到消息发送给您之后。通常MPI_Irecv+MPI_Test 优于MPI_Iprobe。此外,如果您正在编写多线程代码,那么 MPI_Iprobe 可能完全无法使用。

    【讨论】:

      【解决方案3】:

      如果随机数的潜在刷新将“定期”对所有等级进行......那么集体操作可能是一个不错的选择。

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

      或者,MPI_Scatter 可用于分发一个标志,该标志将允许接收随机数的特定等级执行特定的阻塞接收。这将有助于简化作业的清理,并避免让所有等级清理不匹配的 MPI_Recv。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多