私のコードでは、新しい MPI ユーザー定義データ型を定義しています。MPI_Barrier 関数は MPI_Commit に従う必要があるのか、それとも新しいデータ型の最初の使用が表示される場所に配置して、すべてのプロセスが新しいデータ型の定義を認識して同意する必要があるのか 疑問に思っていました。
ありがとう。
私のコードでは、新しい MPI ユーザー定義データ型を定義しています。MPI_Barrier 関数は MPI_Commit に従う必要があるのか、それとも新しいデータ型の最初の使用が表示される場所に配置して、すべてのプロセスが新しいデータ型の定義を認識して同意する必要があるのか 疑問に思っていました。
ありがとう。
いいえ - MPI_Type コマンド内での通信はありません。完全にローカルです。特に、プロセスは必ずしも新しい型の定義に同意する必要はありません。
ランク 1 が新しいデータ型をランク 0 に送信する場合、合意する必要があるのはデータの量だけであり、型のレイアウトではありません。たとえば、ランク 1 がすべての (たとえば 2 次元の) ローカル配列をランク 0 に送信していたとします。NX*NY 浮動小数点数の MPI_Type_contiguous を送信することを選択するだけかもしれません。しかし、ランク 0 はこれをより大きなグローバル配列に受け取っている可能性があります。グローバル型のサブアレイ型に受け取ることを選択する場合があります。これらのデータ型の名前が同じであっても、データの合計量が同じである限り、メモリ内で異なる最終的なレイアウトを記述することができます。
MPI データ型は、それを作成するプロセスのプライベート ビジネスです。それらは一致する必要はありません。実際、受信プロセスが送信プロセスのものとは異なる型マップを使用することは可能であり、完全に合法です (もちろん、メモリの破損につながらない限り)。Define
そのため、またはを使用する場合、同期はまったく行われませんCommit
。