中間バッファを割り当てるのを避けるために、私のMPI_Recv
が1つの大きな配列を受け取るのは私のアプリケーションで意味がありますが、送信側ではデータは連続していません。それを整理することができるようになるとすぐに、ネットワークインタフェースに利用可能なデータ。私にとって部分MPIメッセージを送信する
MPI_Request reqs[N];
for(/* each one of my N chunks */) {
partial_send(chunk, &reqs[chunk->idx]);
}
MPI_Waitall(N, reqs, MPI_STATUSES_IGNORE);
またはより良い、POSIXのwritev
機能で好きです:このような何か
/* Precalculate this. */
struct iovec iov[N];
for(/* each one of my N chunks */) {
iov[chunk->idx].iov_base = chunk->ptr;
iov[chunk->idx].iov_len = chunk->len;
}
/* Done every time I need to send. */
MPI_Request req;
chunked_send(iov, &req);
MPI_Wait(req, MPI_STATUS_IGNORE);
は、MPIで可能なようなものですか?
データが不連続に不連続であるか、送信側のすべてのデータを記述するMPI派生データ型を作成しない理由がありますか?これにより、部分送信を処理する代わりに、一度にデータを送信することができます。 – NoseKnowsAll
これは、連続していないdoubleの配列です。 – lvella
不連続データのMPI派生データ型を作成することもできます。残念なことに、私の経験では、送信バッファに手動でデータをコピーするよりも、そのようなデータ型を作成することに利点はありません。複数のMPI_iSendがある場合は、複数のMPI_recvsも必要です。それでも、それらはすべて異なる開始点を持つ同じ大きな配列に受け取ることができます。 – haraldkl