首页 > 解决方案 > 将 MPI_TYPE_CREATE_SUBARRAY 用于类似大小的子数组但起始位置不同

问题描述

我想将 3d 数据块从一个处理器传输到另一个处理器,但它们在两个过程中的位置不同。如果我使用 MPI_TYPE_CREATE_SUBARRAY 那么我是否需要为发送和接收定义两个单独的数据类型,或者它们是否有任何方法可以在这个派生数据类型中放置一些偏移量?令人困惑的是,子数组派生数据类型的范围是整个数组,因此可以通过传递子数组的起始地址而不是传递主数组的起始地址来在发送和接收中使用此数据类型。

目前我正在为每个起始位置定义单独的数据类型,但我猜这似乎不是正确的方法。

integer      :: sizes(1:3),subsizes(1:3),starts(1:3)
integer      :: sxL,exL,syL,eyL,szL,ezL,gc
integer      :: gtype(26)

sizes(1) = exL-sxL+2*gc+1
sizes(2) = eyL-syL+2*gc+1
sizes(3) = ezL-szL+2*gc+1

subsizes = gc

! Corner at i-1,j-1,k-1 (domain coordinates)
starts(1) = 0
starts(2) = 0
starts(3) = 0
call MPI_TYPE_CREATE_SUBARRAY(3,sizes,subsizes,starts,MPI_ORDER_FORTRAN,&
                            realtype,gtype(13),ierr)
call MPI_TYPE_COMMIT(gtype(13),ierr)
! Corner at i-1,j+1,k-1 (domain coordinates)
starts(1) = 0
starts(2) = eyL-syL+gc+1
starts(3) = 0
call MPI_TYPE_CREATE_SUBARRAY(3,sizes,subsizes,starts,MPI_ORDER_FORTRAN,&
                            realtype,gtype(11),ierr)
call MPI_TYPE_COMMIT(gtype(11),ierr)

标签: mpisub-array

解决方案


推荐阅读