2

type: のいくつかの要素 typedef struct { float w; int a, b; } edge; を異なるプロセスに転送する必要があるため、次のような MPI 派生型を作成しています。

unsigned int typecount;
MPI_Datatype PEDGE, types[2] = { MPI_FLOAT, MPI_INT };
MPI_Aint offsets[2], extent;
int blocklen[2] = { 1, 2 };

typecount     = 2;
offsets[0]    = 0;
MPI_Type_extent(MPI_FLOAT, &extent);
offsets[1]    = (1*extent);
MPI_Type_struct (typecount, blocklen, offsets, types, &PEDGE);
MPI_Type_commit(&PEDGE);

を実行するsizeof(edge)と 12 バイトが取得されますが、実行すると 8 バイトしか取得されませんsizeof(PEDGE)...なぜですか? これとは別に、PEDGE 型のいくつかの要素を型の配列に送信するコードedgeが失敗します。おそらく、この不一致が原因です。

4

1 に答える 1

3

ここでの問題は、 のMPI_DatatypeようなオブジェクトPEDGE自体が新しいデータ型ではなく、MPI がデータ型として解釈できる実装固有のエンティティへの不透明なハンドルにすぎないことです。そのためsizeof()、正確なサイズを返すことはできません。MPI_Type_size()代わりに使用してください。

送信の失敗に関しては、コードを見ないと何とも言えませんが、データ型の定義は正しいようです。

于 2012-11-02T21:24:22.513 に答える