1

私は MPI でプログラムを書き、各プロセッサを一種のリング方式で x 回回ります (たとえば、4 つのプロセッサの「リング」を 2 回回したい場合は、0、1、2 となります)。 、3、0、1....3)。

すべてが正常にコンパイルされましたが、Ubuntu VM でプログラムを実行すると、何も出力されませんでした。最初の出力さえ実行しません。誰が何が起こっているのか説明できますか?

これは私のコードです:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char **argv){
    int rank, size, tag, next, from, num;
    tag = 201;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    next = (rank + 1)/ size;
    from = (rank - 1)/size;
    if (rank == 0){
            printf("How many times around the ring? :: ");
        scanf ("%d", &num);
        MPI_Send(&num, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
    }
    do{
        MPI_Recv(&num, 1, MPI_INT, from, tag, MPI_COMM_WORLD, &status);
        printf("Process %d received %d from process %d\n", rank, num, status.MPI_SOURCE);
        if (rank == 0){
            num--;
            printf("Process 0 has decremented the number\n");
        }
        printf("Process %d sending %d to process %d\n", rank, num ,next);
        MPI_Send(&num, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
    }while (num > 0);
    printf("Process %d has exited", rank);
    if (rank == 0){
        MPI_Recv(&num, 1, MPI_INT, size - 1, tag, MPI_COMM_WORLD, &status);
        printf("Process 0 has received the last round, exiting");
    }
    MPI_Finalize();
    return 0;
}
4

2 に答える 2

3

隣人の割り当てに問題があります。next/from計算の後に次の行を挿入すると

printf("Rank %d: from = %d, next = %d\n", rank, from, next);

我々が得る:

$ mpirun -np 4 ./ring
Rank 0: from = 0, next = 0
Rank 1: from = 0, next = 0
Rank 2: from = 0, next = 0
Rank 3: from = 0, next = 1

あなたはもっと似たものが欲しい

next = (rank + 1) % size;
from = (rank - 1 + size) % size;

を与える

$ mpirun -np 4 ./ring
Rank 0: from = 3, next = 1
Rank 1: from = 0, next = 2
Rank 2: from = 1, next = 3
Rank 3: from = 2, next = 0

その後、コードは機能しているようです。

于 2013-01-07T17:21:07.883 に答える
0

コードが良いかどうかに関係なく、最初の printf が出力されるはずです。

"if(rank==)" ブロック内の printf でさえ、メッセージがまったく出力されない場合は、VM に問題がある可能性があります。その VM でアクティブ化されたネットワーク インターフェイスがあることを確認しますか?

答えが「はい」の場合、OpenMPI FAQ over tcp の質問をチェックして、MPI との互換性を確認すると役立つ場合があります。セクション 7 (どの TCP ネットワークを使用するかを Open MPI に伝えるにはどうすればよいですか? ) と 13 ( Open MPI は仮想 IP インターフェイスをサポートしますか? ) は、仮想マシンで MPI を実行する際に発生する可能性のある問題について興味深いと思われます。

于 2013-01-13T16:23:37.860 に答える