c++ - MPI_Irecv 没有收到循环后发送的消息

标签 c++ mpi

我一直在并行执行哲学家就餐问题,但遇到了一个我无法解决的问题。基本上,我有一个 for 循环,其中一个进程检查是否有任何新消息,然后休眠半秒钟(它重复随机次数)。在该部分之后,它会尝试收集所有需要的 fork 以启动程序的“进食”部分。

问题是,出于某种原因,如果我从 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

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

最佳答案

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

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

关于c++ - MPI_Irecv 没有收到循环后发送的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15703305/

相关文章:

c++ - 是不是一个进程可以给自己发送数据?使用 MPICH2

c++ - C++中的堆栈和堆内存

c++ - fastCGI 环境变量 - 我可以从哪里获得(标准/官方)列表?

c - 错误 : making pointer from integer in C

fortran - MPI 顺序写入文件

c - 访问 MPI 拓扑中的邻居进程值

fortran - MPI_REDUCE精度问题

c++ - 被未定义的 C++ 移位运算符行为和包装混淆 "pattern space"

c++ - 使用规范化函数/opencv 和 c++ 获取内存分配错误

C++:通过构造函数中的返回构造