6

C での MPI プログラムに関する問題はほとんどありません。MPI_Send を使用してスレーブからマスターに (MPI_Send、MPI_Irecv、および MPI_Test を使用して) 2 つのメッセージを送信したいのですが、最初のメッセージしか機能しません。その後、無限ループが発生し、常にスレーブからメッセージを受け取ります-1 (status.MPI_Sourceによる)。

したがって、これらすべてのメッセージを不明なプロセス (-1) から受け取る理由がわかりません...

私のコード:

#include <stdio.h>
#include <mpi.h>
#include <sys/time.h>

int main(int argc, char *argv[])
{

int rank, size;
MPI_Status status;

/* Init */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

if (rank != 0) { // Slaves
    int buf;

    if (rank == 1) {
        buf = 1;
        MPI_Send(&buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); 
    }
    if (rank == 2) {
        buf = 2;
        MPI_Send(&buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); 
    }

}
else { // Master
    int sum = 0;
    int flag, res;
    MPI_Request request;
    MPI_Status status;

    MPI_Irecv(&res, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &request);

    while (1) { 
        flag = 0;

        MPI_Test(&request, &flag, &status);

        if (flag != 0) { 
            printf("recv : %d, slave : %d\n", res, status.MPI_SOURCE);
            if (status.MPI_SOURCE != -1) 
                sum += res;
        }
        else
            printf("fail!\n");

        if (sum == 3)
            break;
    }

    printf("sum : %d\n", sum);
}

MPI_Finalize();
return 0;

}

ありがとう。

ps : 私の英語でごめんなさい

4

2 に答える 2

4

問題は、マスターが1つの受信を投稿するだけであるということです。後続のメッセージを受信できるように、成功しMPI_Irecvて返されたポイント(ブロック内)で、呼び出しをループ内に移動する必要があります。MPI_Testif (status.MPI_SOURCE != -1)

于 2013-02-26T17:53:20.913 に答える