MPI_Send と MPI_Recv のバッファ サイズが理解できないことに気付きました。ドキュメントにはcount
、これらの関数の引数がタイプの要素の数を記述すると書かれています:datatype
int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest,
int tag, MPI_Comm comm);
count [in] 送信バッファ内の要素数 (非負の整数)
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Status *status);
count [in] 受信バッファ内の要素の最大数 (整数)
2 つのプロセスがあるとします。最初の (ルート) プロセスは、n 個の整数の配列を割り当て、それにデータを入力します。
int* temp = (int*) malloc(n * sizeof(int));
for (int i = 0; i < n; i++) temp[i] = ...;
次に、ランク = 1 の 2 番目のプロセスに送信します。
MPI_Send(temp, n, MPI_INT, 1, 0, MPI_COMM_WORLD);
2 番目のプロセスは、このn 個の整数の配列を受け取ります。
MPI_Recv(temp, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_INGNORE);
しかし、MPI_Recv の後、temp
配列が切り捨てられたように見えました。count
引数を からn
に変更するn * sizeof(int)
と、正しい配列が返されました。ただしn * sizeof(int)
、ドキュメントに記載されている要素ではなく、バッファサイズをバイト単位で説明します。それは一般的な行動ですか、それとも単純な誤解ですか? PS 私は MPI 実装として MPICH2 x86 を使用し、Windows 7 では 32 ビット VS08 を使用しています。