このエラーの最も一般的な理由は何ですか
MPI_ERR_BUFFER: invalid buffer pointer
MPI_Bsend() および MPI_Rcev() 呼び出しの結果はどれですか? 並列プロセスの数が少ない (<14) 場合、プログラムは正常に動作しますが、プロセスの数を増やすと、このエラーが発生します。
このエラーの最も一般的な理由は何ですか
MPI_ERR_BUFFER: invalid buffer pointer
MPI_Bsend() および MPI_Rcev() 呼び出しの結果はどれですか? 並列プロセスの数が少ない (<14) 場合、プログラムは正常に動作しますが、プロセスの数を増やすと、このエラーが発生します。
私の以前のコメントを拡張するには:
MPI でのバッファリングは、さまざまな状況で発生する可能性があります。メッセージは、ネットワーク遅延を隠すために MPI ライブラリによって内部的にバッファリングすることができます (通常、実装に依存するサイズまでの小さなメッセージに対してのみ行われます)。または、バッファリングされた送信操作のいずれかを使用して、ユーザーがバッファリングを強制することができMPI_Bsend()
ますMPI_Ibsend()
。ただし、ユーザーのバッファリングは内部のものとは異なります。
MPI_Bsend()
またはによって送信されたメッセージMPI_Ibsend()
は常にバッファリングされますが、これは内部的にバッファリングされたメッセージには当てはまりません。後者は、サイズと内部バッファ スペースの可用性に応じて、バッファリングするかしないかのいずれかになります。MPI_ERR_BUFFER
エラーが発生します。送信されたメッセージは、送信先プロセスによって確実に受信されるまで、バッファー スペースを使用します。MPI にはメッセージの受信を確認するための組み込みメカニズムが用意されていないため、別の方法を考案する必要があります。たとえば、送信先プロセスから送信元プロセスに確認メッセージを送り返すなどです。
そのため、転送中であると明示的に確認されなかったすべてのメッセージを考慮する必要があり、バッファに十分なメモリを割り当てる必要があります。通常、これは、転送しようとしているデータの総量に に等しいメッセージ エンベロープ オーバーヘッドを加えたものと少なくとも同じ大きさのバッファが必要であることを意味しますnumber_of_sends * MPI_BSEND_OVERHEAD
。これにより、大規模な MPI ジョブのメモリ負荷が大きくなる可能性があります。そのことを念頭に置いて、プロセス数が変更されたときにそれに応じてバッファ領域を調整する必要があります。
バッファ付き送信は便宜上提供されているだけであることに注意してください。メモリの複製と非ブロッキング送信操作の組み合わせとして簡単に実装できます。たとえば、バッファリングされた送信により、次のようなコードを書く必要がなくなります。
int data[];
int *shadow_data;
MPI_Request req;
...
<populate data>
...
shadow_data = (int *)malloc(sizeof(data));
memcpy(shadow_data, data, sizeof(data));
MPI_Isend(shadow_data, count, MPI_INT, destination, tag, MPI_COMM_WORLD, &req);
...
<reuse data as it is not used by MPI>
...
MPI_Wait(&req);
free(shadow_data);
メモリが不足している場合は、非ブロッキング送信のみを使用する必要があります。