使用mpi数据类型排列三维数组

使用mpi数据类型排列三维数组,mpi,Mpi,假设您有一个3d数组a[I][J][K],但您希望将其置换为B[J][K][I] 此问题与此处讨论的二维阵列转置问题类似,但不同: . MPI标准提供了使用用户定义的数据类型的多维数组操作示例,但不是这种特殊情况:实现这一点的方法是使用MPI\u TYPE\u VECTOR和MPI\u TYPE\u CREATE\u HVECTOR,但具体问题在于细节 /*数据[I][J][K]是I×J×K(存储在数组'dim_size[]={I,J,K}' 我们想要排列的[J][K][I]*/ /*新的最

假设您有一个3d数组a[I][J][K],但您希望将其置换为B[J][K][I]

此问题与此处讨论的二维阵列转置问题类似,但不同: .


MPI标准提供了使用用户定义的数据类型的多维数组操作示例,但不是这种特殊情况:

实现这一点的方法是使用
MPI\u TYPE\u VECTOR
MPI\u TYPE\u CREATE\u HVECTOR
,但具体问题在于细节

/*数据[I][J][K]是I×J×K(存储在数组'dim_size[]={I,J,K}'
我们想要排列的[J][K][I]*/
/*新的最里面的维度是I项,跨过旧的JK面*/
MPI_类型_向量(尺寸[0],1,尺寸[1]*尺寸[2],
MPI(双倍和一倍);
MPI_类型_提交(&one_d);
/*新的中间维度是K个项目,跨过K行,而不是
*在这种情况下实际上是一种跨越。我们在这里使用hvector是因为
*直接按数组项操作*/
MPI_类型_创建_hvector(尺寸[2]、1、尺寸(双精度)、一个d和两个d);
MPI_类型_提交(&two_d);
/*新的最外层尺寸是J项目,跨过旧的J行*/
MPI_类型_创建_hvector(尺寸[1]、1、尺寸[2]*尺寸(双精度)、双精度、,
&转置型);
MPI_类型_提交(&转置_类型);

现在,您可以将
transposed\u type
馈送到您的发送/接收呼叫,或将其设置为您的MPI文件视图。

方法是使用
MPI\u type\u VECTOR
MPI\u type\u CREATE\u HVECTOR
,但细节中有魔鬼

/*数据[I][J][K]是I×J×K(存储在数组'dim_size[]={I,J,K}'
我们想要排列的[J][K][I]*/
/*新的最里面的维度是I项,跨过旧的JK面*/
MPI_类型_向量(尺寸[0],1,尺寸[1]*尺寸[2],
MPI(双倍和一倍);
MPI_类型_提交(&one_d);
/*新的中间维度是K个项目,跨过K行,而不是
*在这种情况下实际上是一种跨越。我们在这里使用hvector是因为
*直接按数组项操作*/
MPI_类型_创建_hvector(尺寸[2]、1、尺寸(双精度)、一个d和两个d);
MPI_类型_提交(&two_d);
/*新的最外层尺寸是J项目,跨过旧的J行*/
MPI_类型_创建_hvector(尺寸[1]、1、尺寸[2]*尺寸(双精度)、双精度、,
&转置型);
MPI_类型_提交(&转置_类型);

现在,您可以将
transposed\u type
添加到发送/接收呼叫中,或者将其设置为您的MPI文件视图。

您必须为创建的每个数据类型调用
MPI\u type\u commit
MPI\u type\u hvector
长期以来一直被弃用-应该使用
MPI\u type\u create\u hvector
。我已经相应地编辑了您的答案。祝您好运关于类型_commit。我个人的偏好是提交最终类型,而不是组成类型,因为发送/接收或文件_set_view调用中永远不会使用one_d和two_d。还感谢您更新不推荐的类型_hvector调用。您完全正确-无需提交通信调用中未使用的类型,但是这样做是一个很好的编程实践,因为以后可能会决定使用一种中间类型。您必须为创建的每个数据类型调用
MPI\u Type\u commit
MPI\u Type\u hvector
长期以来一直被弃用-应该改用
MPI\u Type\u create\u hvector
。我已经相应地编辑了您的答案。继续od捕获类型_commit。我个人的偏好是提交最终类型,而不是组成类型,因为发送/接收或文件集视图调用中永远不会使用one_d和two_d。还感谢您更新不推荐的type_hvector调用。您完全正确-无需提交通信中未使用的类型调用,但这样做是一种很好的编程实践,因为以后可能会决定使用一种中间类型。