MPIのいくつかのランクを介して円で配列を送信しようとしていますが、セグメンテーション違反が発生しています。理由を教えてもらえますか?

ロス

CのMPIを使用して、あるプロセス(ランク)から「サークル」内の別のプロセスに配列を送信しようとしています。単一の整数を使用して正常に動作させることができますが、配列を送信しようとするとセグメンテーション違反が発生します。使って。

{
int rank;
int numRanks;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &numRanks);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

int arraysize = 100;

int *array;

if (rank == 0) {
    array = malloc(sizeof(int)*arrasize);
    for (int i = 0; i < arraysize; i++) {
        array[i] = 1;
    }
    double starttime = MPI_Wtime();
    MPI_Send(&array, arraysize, MPI_INT, (rank+1), 0, MPI_COMM_WORLD);
    MPI_Recv(&array, arraysize, MPI_INT, numRanks-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    double endtime = MPI_Wtime();
    printf("Rank %d got array from Rank %d in %lf", rank, numRanks-1, endtime-starttime);
} else if (rank == (numRanks-1)) {
    MPI_Recv(&array, arraysize, MPI_INT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Rank %d got array from Rank %d", rank, rank-1);
    MPI_Send(&array, arraysize, MPI_INT, 0, 0, MPI_COMM_WORLD);
} else {
    MPI_Recv(&array, arraysize, MPI_INT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Rank %d got array from Rank %d", rank, rank-1);
    MPI_Send(&array, arraysize, MPI_INT, (rank+1), 0, MPI_COMM_WORLD);
}

free(array);

MPI_Finalize();
return 0;

}

エラーメッセージは次のとおりです(簡単にするために、現在3つのランクのみを使用しています)。

Rank 1 got array from Rank 0
[winston:42137] *** Process received signal ***
[winston:42137] Signal: Segmentation fault (11)
[winston:42137] Signal code: Address not mapped (1)
[winston:42137] Failing at address: 0x7add28

次に、配列を送受信しようとする各ランクで同じものが多くなります

どなたでもご協力いただければ幸いです!!

レニュネユン

あなたは、array0番目以外のすべてのプロセスで有効なメモリアドレス(ランク)を指していません。これにより、を呼び出しMPI_Recv(&array, arraysize...ときにランダムな(つまり無効な)アドレスに何かを書き込もうとすると、プログラムがクラッシュします

(コメントで指摘されたGilles Gouaillardetに感謝します)そして、それ自体がいくつかを格納するために割り当てられたアドレスへのポインタであるため、MPI関数にarray(ではなく&array渡す必要があります int

したがって、解決策は次のようになります。

  1. array = malloc(sizeof(int)*arrasize);すべてのプロセスで実行します。
  2. MPI_Recv(&array(およびMPI_Send(&array)をMPI_Recv(array(およびMPI_Send(array。に変更ます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ