【问题标题】:MPI_ALLGATHERV with derived data types具有派生数据类型的 MPI_ALLGATHERV
【发布时间】:2014-01-04 05:16:43
【问题描述】:

我正在尝试使用派生数据类型来使用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)

这给了我错误。此问题中的任何指示都将非常有帮助和赞赏。

【问题讨论】:

标签: fortran mpi


【解决方案1】:
  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)

输出仍然不匹配。我认为置换数组有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2019-10-19
    • 2014-07-25
    • 2023-04-11
    相关资源
    最近更新 更多