如何解决将 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,gtype(11),ierr)
call MPI_TYPE_COMMIT(gtype(11),ierr)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。