私はもともと MPI_Send を MPI_Irecv と組み合わせて使用していましたが、メッセージが受信されるまで MPI_Send がブロックされる可能性があることが最近わかりました。そのため、MPI_Isend に変更し、同じメッセージを N 個の異なるプロセッサに送信する必要があります。バッファが後で破棄されると仮定すると、ループ内に MPI_Isend と MPI_Wait を使用して for ループを作成する必要がありますか?それとも、ループの後に MPI_Waitall を使用して要求の配列を作成し、ループ内に MPI_Isend のみを作成する必要がありますか?
2 に答える
同じバッファを "n" 個のリモート ランクに分散するには、MPI_Bcast が "明白な" 選択です。MPI_Bcast を避ける「圧倒的な」理由がない限り、使用することをお勧めします。一般に、MPI_Bcast はすべての主要な MPI 実装によって最適化されています。
ブロッキングが問題になる場合、MPI 3.0 標準では、MPI_IBcast が他のノンブロッキング コレクティブと共に導入されました。ノンブロッキング集合の初期実装は「ナイーブ」であり、ノンブロッキング ポイントツーポイント ルーチンのラッパーとして構築されているようです (たとえば、MPI_IBcast は MPI_ISend および MPI_IRecv の呼び出しのラッパーとして実装されています)。実装は、MPI アプリケーション開発者コミュニティによる採用の速度にもよりますが、今後 1 ~ 2 年で品質が向上する可能性があります。
MPI_Send は、呼び出し元のアプリケーションが送信バッファーを安全に再利用できるようになるまで「ブロック」します。対応する MPI_[I]Recv の状態は保証されません。
ノンブロッキングが必要な場合は、ループで MPI_ISend を呼び出すことをお勧めします。または、これがプログラムの過程で繰り返されるメッセージ パターンである場合、MPI_Start または MPI_Startall で永続的な要求を使用することもできます。 永続的な通信要求。
同じメッセージなので、MPI_Bcastを使用できるはずです。プロセスのサブグループを定義するには、新しいコミュニケーターを作成するだけです。