我正在尝试使用派生数据类型MPI_ALLGATHERV
。实际上,我必须以下列形式传递小块3D数组:
SS(IIST:IIEND,JJST:JJEND,KKST:KKEND)
此处,IIST
,IIEND
,JJST
,JJEND
,KKST
,KKEND
是每个流程的本地索引。所以我尝试用以下形式定义派生数据类型:
INTEGER :: MPII,MPJJ,MPKK
CALL MPI_TYPE_CONTIGUOUS(IIEND-IIST+1,MPI_DOUBLE_PRECISION,MPII,IERR)
CALL MPI_TYPE_CONTIGUOUS(JJEND-JJST+1,MPII,MPJJ,IERR)
CALL MPI_TYPE_CONTIGUOUS(KKEND-KKST+1,MPJJ,MPKK,IERR)
CALL MPI_TYPE_COMMIT(MPKK,IERR)
现在,我正在定义一个位移数组,该数组对MPI_ALLGATHERV
中使用的每个进程都是可见的。进程总数为27,编号为0-26。
DO NT=0,26
DISPL(1)=0
IF (NT.GT.0) DISPL(NT+1)= DISPL(NT)+1
ENDDO
现在,我正在使用以下语法执行MPI_ALLGATHERV
:
CALL MPI_ALLGATHERV(SS(IIST:IIEND,JJST:JJEND,KKST:KKEND),SPANX*SPANY*SPANZ,MPI_DOUBLE_PRECISION,SS(1,1,1),1,DISPL,MPKK,MPI_COMM_WORLD,IERR)
这给了我错误。这个问题的任何指针将非常有帮助和赞赏。
答案 0 :(得分:0)
spanx = iiend-iist+1
spany = jjend-jjst+1
spanz = kkend-kkst+1
oldsize = (/spanx,spany,spanz/)
newsize = (/spanx,spany,spanz/)
starts = (/0,0,0/)
CALL MPI_TYPE_CREATE_SUBARRAY(3,OLDSIZE,NEWSIZE,STARTS,MPI_ORDER_FORTRAN,MPI_DOUBLE_PRECISION,ARR,IERR)
CALL MPI_TYPE_COMMIT(ARR,IERR)
DO NT=0,26
DISPL(1)=0
IF (NT.GT.0) DISPL(NT+1)= DISPL(NT)+1
SIZECC(NT)=1
ENDDO
CALL MPI_ALLGATHERV(SS(IIST:IIEND,JJST:JJEND,KKST:KKEND),SPANX*SPANY*SPANZ,MPI_DOUBLE_PRECISION,SS(1,1,1),SIZECC,DISPL,ARR,MPI_COMM_WORLD,IERR)
输出仍然不匹配。我认为Displacement数组有问题。