【问题标题】:MPI_Irecv doesn't receive message sent after loopMPI_Irecv 没有收到循环后发送的消息
【发布时间】:2014-08-04 06:48:43
【问题描述】:

我一直在对哲学家就餐问题进行并行实现,但遇到了一个我无法解决的问题。基本上,我有一个 for 循环,其中一个进程检查任何新消息,然后休眠半秒(它重复这个随机次数)。在这部分之后,它会尝试收集所有需要的叉子,以便开始程序的“吃”部分。

问题是,由于某种原因,如果我从 for 循环内部发送一条 MPI 消息,目标进程会正常接收它,但如果我在循环之后发送一条消息,它不会。让我展示一下它在代码中的样子,希望它能让事情变得更清楚:

for (int i = 0; i < think; i++) {
        Sleep(500);

        // Recieve messages
        MPI_Irecv(&rcv, 1, MPI_INT, MPI_ANY_SOURCE, NEED_FORK, MPI_COMM_WORLD, &req);
        MPI_Test(&req, &flag, &status);

        if(flag != 0) {
            // Do stuff
        }
        MPI_Send(&myid, 1, MPI_INT, target, NEED_FORK, MPI_COMM_WORLD); // He recieves this
    }
MPI_Send(&myid, 1, MPI_INT, target, NEED_FORK, MPI_COMM_WORLD); // He doesn't recieve this

问题在于,由于某种原因,目标进程没有收到在 for 循环完成后发送的任何消息,而它收到了在循环之前或期间发送的任何消息。我真的不知道该怎么做才能完成这项工作,非常感谢任何帮助......

【问题讨论】:

  • 我还没有找到答案,但我很确定我使用 MPI_Test 函数的方式有问题。由于某种原因,它似乎与 Sleep 功能不匹配......
  • 澄清一下:循环内部是一个 MPI_Irecv 和一个 MPI_Send。循环的每次迭代都会在 MPI_Send/MPI_Irecv 之间进行 1:1 匹配。但是,循环后的 MPI_Send 没有匹配的 MPI_Irecv。循环后 MPI_Send 的匹配 MPI_[I]recv 调用在哪里?

标签: c++ mpi


【解决方案1】:

这是我对类似问题的回答。甚至代码看起来也很相似。 Infinite loop using MPI_Irecv and MPI_Test

请仔细查看在循环内调用 MPI_Test 和 MPI_Irecv。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多