【问题标题】:MPI: Receiving an already-received message?MPI:收到一条已经收到的消息?
【发布时间】:2013-08-15 13:26:39
【问题描述】:

我正在编写一个使用 OpenMPI 的 C++ 程序。它以“轮次”执行,在每一轮中,进程 0 向其他进程发送数据块,它们对其进行处理并将结果发送回,当没有更多块要发送时,进程 0 发送“完成”消息给对方进程。 “完成”消息只是带有标签 3 的单整数消息。我的第一轮执行得很好。但是,当我进入第二轮时,在进程 0 有机会发送任何内容(更不用说完成消息)之前,进程 1-p“探测”并“接收”完成消息。

我现在已经检查了很多次我的代码,似乎这条消息的唯一来源是进程 0 在上一轮发送它的地方——但每个进程都已经收到了。我宁愿不发布我的代码,因为它非常大,但是有谁知道 MPI 消息是否可以像这样接收两次?

【问题讨论】:

    标签: c++ mpi openmpi


    【解决方案1】:

    我想我可能有答案......由于完成消息中的实际数据并不重要,我不认为让进程实际接收它。事实证明,在上一轮中,进程正在“探测”消息并发现标签为 3,然后跳出它们的循环。因此,在第二轮中,消息还在等待接收,所以当他们调用 MPI_Probe 时,他们发现与上一轮相同的消息。

    为了解决这个问题,我只是调用了 MPI_Recv。我查看了 MPI_Cancel ,但找不到足够的信息来查看它是否合适。抱歉误导了我的问题!

    【讨论】:

    • 另请注意:如果消息中的信息完全包含在其标签中(例如“完成”消息),则可以发送 count = 0 的消息。
    • @ricky116 在这种情况下我还需要收到吗?
    • 如果您发送ISend,则需要在目标节点上进行接收操作,所以是的,而您想要的信息将通过IProbe 完全可用,您仍然需要对零大小的消息执行Recv
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 2015-09-04
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多