1

3D配列A[I][J] [K]があり、それをB [J][K][I]に並べ替えたいとします。

この問題は、ここで説明する2次元配列転置問題と似ていますが、異なり ます。MPI_Type_create_subarrayを使用して送信するときに、配列を転置できますか?

MPI標準は、ユーザー定義のデータ型を使用した多次元配列操作の例を提供しますが、この特定のケースは提供しません:http ://www.mpi-forum.org/docs/mpi-11-html/node61.html

4

1 に答える 1

1

これを行う方法はとを使用することですが、悪魔は詳細にありますMPI_TYPE_VECTORMPI_TYPE_CREATE_HVECTOR

/* data[I][J][K] is I by J by K (stored in array 'dim_sizes[] = {I, J, K}'
   and we want permuted[J][K][I] */

/* new innermost dimension is I items, strided across the old JK face*/
MPI_Type_vector(dim_sizes[0], 1, dim_sizes[1]*dim_sizes[2], 
    MPI_DOUBLE, &one_d);
MPI_Type_commit(&one_d);

/* new middle dimenson is K items, strided over the K row, which isn't
 * actually a stride in this case.  We use hvector here because we 
 * operate directly in terms of array items */
MPI_Type_create_hvector(dim_sizes[2], 1, sizeof(double), one_d, &two_d);
MPI_Type_commit(&two_d);

/* new outermost dimension is J items, strided over the old J row */
MPI_Type_create_hvector(dim_sizes[1], 1, dim_sizes[2]*sizeof(double), two_d,
    &transposed_type);
MPI_Type_commit(&transposed_type);

これで、送信/受信呼び出しにフィードtransposed_typeしたり、MPIファイルビューにすることができます。

于 2012-10-26T19:36:55.257 に答える