带有派生数据类型的MPI_ALLGATHERV

时间:2013-12-31 19:38:33

标签: fortran mpi

我正在尝试使用派生数据类型MPI_ALLGATHERV。实际上,我必须以下列形式传递小块3D数组:

  SS(IIST:IIEND,JJST:JJEND,KKST:KKEND)

此处,IISTIIENDJJSTJJENDKKSTKKEND是每个流程的本地索引。所以我尝试用以下形式定义派生数据类型:

  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)

这给了我错误。这个问题的任何指针将非常有帮助和赞赏。

1 个答案:

答案 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数组有问题。