1

私は食事の哲学者の問題を並行して実装してきましたが、解決できない問題に直面しました。基本的に、プロセスが新しいメッセージをチェックしてから0.5秒間スリープする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 ループの終了後に送信されたメッセージを受信せず、ループの前またはループ中に送信されたメッセージを受信することです。これを機能させるために何をすべきか本当にわかりません。助けていただければ幸いです...

4

1 に答える 1

0

これが同様の質問に対する私の答えです。コードも似ています。 MPI_Irecv と MPI_Test を使用した無限ループ

ループ内での MPI_Test と MPI_Irecv の呼び出しをよく見てください。

于 2013-07-09T15:30:19.390 に答える