【发布时间】:2014-01-04 05:16:43
【问题描述】:
我正在尝试使用派生数据类型来使用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)
这给了我错误。此问题中的任何指示都将非常有帮助和赞赏。
【问题讨论】:
-
问题可能来自
recvcount这个参数。它应该是一个 27 个整数的数组,你写了SS(1,1,1),1,DISPL,mcs.anl.gov/research/projects/mpi/www/www3/MPI_Allgatherv.html -
谢谢弗朗西斯。现在错误消失了,但输出仍然不正确。
-
您的数组中是否有垃圾或数字放错了位置?我还发现了这个问题及其答案:stackoverflow.com/questions/17508647/… 和 mcs.anl.gov/research/projects/mpi/www/www3/…。这些代码和函数可能有助于获得正确的布局。
-
我会尝试并很快回到这里。