4

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 を使用しています。

4

1 に答える 1

2


https://www.open-mpi.org/doc/v1.8/man3/MPI_Recv.3.phpによると、
count 引数はバッファ内の要素数を保持します。

count
受け取る要素の最大数 (整数)。

バイト数は、要素数 (count) と各要素のサイズ (MPI_Datatype 型の定数で指定) を掛けて計算する必要があります。

于 2017-09-07T08:39:42.677 に答える