1

MPI_Type_vectorマトリックスのサブドメインを各プロセスに分散させるために使用したいと思います。たとえば、マトリックスは 5x5 で、2x2 サブドメインで分解されます。したがって、サブドメインの次元は次のとおりです。

 _____________________
 |         |         |
 |    0    |    1    |
 |  (2,2)  |  (3,2)  |
 |         |         |
 |_________|_________|   5
 |         |         |
 |    2    |    3    |
 |  (2,3)  |  (3,3)  |
 |         |         |
 |_________|_________|

           5

MPI_Type_vector各プロセスに独自のディメンションを定義しました。プロセス0と1で定義されたベクトルのサイズが異なると予想しました。しかし、それらのハンドルは同じです。そして、MPI はこれらの定義されたベクトルの 1 つだけを使用しているようです。

ありがとう!

リー

PS: データのパックとアンパックを手動で行うことでこの機能を実装しましたが、もっと便利なものを使用したいと思います。

4

2 に答える 2

2

MPI_Datatypeは渡すことができる単なるハンドルであり、作成した型に関する情報は直接含まれていません。そのハンドルの値を見ても、タイプについてはわかりません。私が見たほとんどの実装ではint、このハンドルに s を使用し、ユーザー定義のデータ型ごとに 1 ずつインクリメントします。したがって、2 つのベクトル データ型ハンドルが異なるコアで同じ値を持っていることに驚かないでください。両方ともそのコアで最初に宣言されたデータ型である場合です。

ドメイン分割に関する主な質問に戻ると、異なる宣言されたベクトル型を使用するコア間で通信がある場合、それは失敗します-送信コアと受信コアは同じ長さのベクトルを処理する必要があります. そのため、送信側コアは、受信側コアが受信する予定のデータ量に対応するタイプを使用する必要があります。

また、クリーンなドメイン分割に関しては、関数を使用することをお勧めします (ここMPI_Cartに Web 1.0 のチュートリアルがあります)。

于 2012-09-24T06:04:37.023 に答える
2

MPI ハンドルは、登録されているプロセスに対してローカルであり、不透明な型としてのみ扱われるべきです。ハンドルの実際の値に基づいて何かを決定するべきではなく、MPI が比較関数を使用してハンドルの背後にあるオブジェクトのみを比較する必要があります。を提供します (例: MPI_Comm_compare)。たとえば、Open MPI では、C バインディングMPI_Datatypeの構造体へのポインターであり、Fortran バインディングのポインター テーブル内のインデックスです。ompi_datatype_tINTEGER

サブドメインのサイズが等しい場合 (たとえば、すべてが2x2)、サイズ変更された MPI データ型を使った素敵なハックMPI_Scattervにより、 /を使用MPI_Gathervしてそれらを分散/収集できます。サブドメインのサイズが異なるため、単一の集合 MPI 呼び出しを使用してそれらを分散/収集したい場合MPI_Alltoallwは、慎重に提供された引数を使用する必要があります。これを使用して、収集操作を実装することもできます。

于 2012-09-24T10:58:07.957 に答える