私のコードでは、新しいMPIユーザー定義データ型を定義します。 MPI_Barrier関数がMPI_Commitに従わなければならないのか、新しいデータ型の最初の使用が現れて、すべてのプロセスが新しいデータ型の定義を認識して同意するようにする必要があるのだろうかと思いました。MPI_Type_commitは、MPI_COMM_WORLD内のすべてのプロセスで暗黙的にバリアを呼び出しますか?
ありがとうございました。
私のコードでは、新しいMPIユーザー定義データ型を定義します。 MPI_Barrier関数がMPI_Commitに従わなければならないのか、新しいデータ型の最初の使用が現れて、すべてのプロセスが新しいデータ型の定義を認識して同意するようにする必要があるのだろうかと思いました。MPI_Type_commitは、MPI_COMM_WORLD内のすべてのプロセスで暗黙的にバリアを呼び出しますか?
ありがとうございました。
いいえ - MPI_Typeコマンドには通信がありません。これらは完全にローカルです。特に、プロセスは、が必ずしも新しいタイプの定義に同意しなければならない。
ランク1がランク0に新しいデータ型を送信した場合、そのデータ型のレイアウトではなく、データ量が一致する必要があります。たとえば、ランク1がローカル配列をすべてランク0にランクインしているとしたら、NX * NYのfloat型のMPI_Type_contiguousを送信するように選択することができます。しかし、ランク0はこれを大規模なグローバル配列に受け取っている可能性があります。グローバルタイプのサブアレイタイプに受け取ることを選択することができます。たとえそれらのデータ型が同じ名前であっても、データの総量が同じであれば、メモリ内の異なる最終レイアウトを記述することができます。
MPIデータ型は、それを作成するプロセスのプライベートビジネスです。それらは一致する必要はありません。実際には、受信プロセスが送信プロセスと異なるタイプマップを使用することは可能です(もちろん、メモリ破損に至らない限り)。したがって、Define
またはCommit
を使用する場合は、何も同期化はありません。
+1:ちょうど私にそれを打つ! :) –
@Jonathan Dursi あなたはどちらも私から100万の感謝に値する!!! –