2

中間バッファを割り当てるのを避けるために、私の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で可能なようなものですか?

+0

データが不連続に不連続であるか、送信側のすべてのデータを記述するMPI派生データ型を作成しない理由がありますか?これにより、部分送信を処理する代わりに、一度にデータを送信することができます。 – NoseKnowsAll

+0

これは、連続していないdoubleの配列です。 – lvella

+1

不連続データのMPI派生データ型を作成することもできます。残念なことに、私の経験では、送信バッファに手動でデータをコピーするよりも、そのようなデータ型を作成することに利点はありません。複数のMPI_iSendがある場合は、複数のMPI_recvsも必要です。それでも、それらはすべて異なる開始点を持つ同じ大きな配列に受け取ることができます。 – haraldkl

答えて

0

すべてのチャンクが、通常の境界に整列している場合例えば、彼らがしている(...

を私は単純にコメントしたいのですが、私はスタックオーバーフローに新しいですができないよう、十分な評判を持っていませんMPI_Type_indexedを使用してください。ここで、変位とカウントはすべて基本タイプの倍数で測定されます(ここではMPI_DOUBLEです)。しかし、例えば、チャンクが個別にmallocされていて、アラインメントが保証されていない場合、より一般的なMPI_Type_create_structを使用する必要があります。これは、バイト単位の変位を指定します(また、必要ない)。

メモリを直線的にスキャンして後退しないように並べ替える必要があるかもしれないと心配しました(つまり、「単調に減少しない」)。しかし、これは、ポイントツーポイントsend/recvではなく、ファイルIOのタイプをMPI-IOで使用する場合、これは制約に過ぎないと思います。

関連する問題