2

プログラム内のクラスを表す MPI 派生型を作成する必要があります。このクラスはかなり単純ですが、大規模です (約 75 のデータ メンバー**)。すべてのデータ メンバーは、単一の値、1D 配列、または 2D 配列です。以下に例を示します。

class RestartData {
  int dsr;
  double firea2sorgn;
  int ifwoody[NUM_PFT];
  double rootfrac[MAX_ROT_LAY][NUM_PFT];
  ....
  ....
}

MPI_Type_structを使うのが適切だと思います。(例: http://www.open-mpi.org/doc/v1.5/man3/MPI_Type_struct.3.php )

そして、私は多かれ少なかれこの質問の例に従います: struct serialization in C and transfer over MPIですが、2D 配列の処理方法がわかりません。MPI_Type_struct複数のを含むを作成できますかMPI_Type_vector? MPI_Type_struct2D 配列を含むを作成する例を見つけることができませんでした。私は正しいアプローチをしていますか?

前もって感謝します。


** 単一の大きなメッセージを渡すことで発生する可能性のある問題を理解していると思いますが、この場合、メッセージはまれに渡され、自然な同期ポイント (数値の処理が完了したときにスレーブがマスターにデータを送り返す) で渡されます。

4

2 に答える 2

3

MPI の派生型は、他の派生型から自由に構築でき、それを使用してさらに他の派生型を作成できます。

あなたの場合のようにメモリ内で連続している限り、2D配列は1D配列とそれほど違いはありません。rootfracメンバーに関しては、 type の要素を持つ連続したデータ型を作成するか、MAX_ROOT_LAY * NUM_PFTtype の要素をMPI_DOUBLE持つ連続したデータ型 ( と呼びましょうt_dbl_pft)を作成し、それを使用して type の要素を持つ別の連続したデータ型を作成することがNUM_PFTできます。もう 1 つのオプションは、データ型をまったく作成しないことです。これは、MPI 構造化型コンストラクターが構造体の各要素に対して個別のブロック長 (要素数) を取るためです。MPI_DOUBLEMAX_ROOT_LAYt_dbl_pft

たとえば、次の型は、表示したデータ メンバーを表しています。

#include <cstddef> // for offsetof

MPI_Type t_1d;
MPI_Type_contiguous(NUM_PFT, MPI_DOUBLE, &t_1d);
// No need to commit - this type is not used for communication

MPI_Type t_restart;
int counts[4] = { 1, 1, NUM_PFT, MAX_ROT_LAY };
MPI_Type types[4] = { MPI_INT, MPI_DOUBLE, MPI_INT, t_1d };
MPI_Aint displs[4] = {
   offsetof(RestartData, dsr),
   offsetof(RestartData, firea2sorgn),
   offsetof(RestartData, ifwoody),
   offsetof(RestartData, rootfrac),
};
MPI_Type_create_struct(4, counts, displs, types, &t_restart);
MPI_Type_commit(&t_restart);

// The 1D type is no longer needed
MPI_Type_free(&t_1d);

メンバー関数内で MPI データ型を作成するか、クラスRestartDataに関して型が作成されるルーチンを宣言してfriend、プライベートおよび保護されたデータ メンバーにアクセスできるようにする必要があることに注意してください。また、POD (plain old data) クラスでのみ機能することにも注意してくださいoffsetof。たとえば、複雑なコンストラクターやstd::string.

于 2013-09-25T09:06:44.920 に答える
2

最も簡単な方法は、オブジェクト全体を大きなバッファーとして扱うことです。

MPI_Datatype datatype;

MPI_Type_contiguous(sizeof(RestartData), MPI_BYTE, &datatype);
MPI_Type_commit(&datatype);

クラスの内部構造について MPI に伝えるメリットがわかりません。

あるいは、2D 配列は 1D 配列の配列です。したがって (私は想像します)、MPI_Type_contiguous配列の次元ごとに 1 つの呼び出しを使用して、配列のデータ型を構築できます。

于 2013-09-24T23:34:58.967 に答える