Fortran MPI_分散中的致命错误:无效的通信器

Fortran MPI_分散中的致命错误:无效的通信器,fortran,mpi,fortran90,Fortran,Mpi,Fortran90,我正在尝试使用MPI散射将DO循环与矩阵加法并行,我得到了以下错误。我已初始化所有MPI变量,完成 call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) 在课程开始时,MPI_Finalizer在课程结束时。但我仍然在尝试进行MPI分散时遇到了错误 Fatal error in MPI_S

我正在尝试使用MPI散射将DO循环与矩阵加法并行,我得到了以下错误。我已初始化所有MPI变量,完成

  call MPI_INIT( ierr )
  call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
  call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) 
在课程开始时,MPI_Finalizer在课程结束时。但我仍然在尝试进行MPI分散时遇到了错误

Fatal error in MPI_Scatter: Invalid communicator, error stack:
MPI_Scatter(766): MPI_Scatter(sbuf=0x6ab2a0, scount=0, INVALID DATATYPE,         
rbuf=0x7fff39a99398, rcount=0, INVALID DATATYPE, root=0, comm=0x43380000) failed
MPI_Scatter(641): Invalid communicator
我在代码中的任何地方都使用默认的通信器MPI_COMM_WORLD。我试图通过将矩阵的一部分发送到多个进程来并行化矩阵更新操作。输入矩阵为x,输出矩阵为y。X是实*8数据类型的矩阵,有N行和N列。也

nx = N/numberofprocesses
我的MPI_分散代码如下所示

if (processid.eq.0) then
 call MPI_Scatter(x, nx, MPI_DOUBLE_PRECISION,MPI_IN_PLACE, nx, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr) 
else 
call MPI_Scatter(x, nx, MPI_DOUBLE_PRECISION, x, nx, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr) 
end if
我的收集代码是

if (processid.eq.0) then
   call MPI_Gather(MPI_IN_PLACE, nx, MPI_DOUBLE_PRECISION, y, nx, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr)
else
   call MPI_Gather(y, nx, MPI_DOUBLE_PRECISION, y, nx, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr)
end if

错误的原因是什么?

您能给我们看一下相应的代码,包括MPI\U散点吗?可能无效的数据类型是一个线索。。。您是否检查了sendtype和recvtype的数据类型?另外,scount=0和rcount=0看起来很奇怪,但是如果没有实际的代码,很难判断……如果myid.eq.0然后调用MPI_Scatterx,nx,MPI_DOUBLE_PRECISION,MPI_IN_PLACE,nx,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr,否则调用MPI_Scatterx,nx,MPI_DOUBLE_PRECISION,x,MPI_DOUBLE_PRECISION,0,MPI_commi_WORLD,ierr end-if。我也认为这是问题所在。我试图通过MPI散射发送的是一个矩阵。所以我不知道如何才能做到这一点。如果发送类型是矩阵的一部分,我可以提到什么样的数据类型呢?那么,x看起来像什么,nx是什么?您必须记住,nx是发送到每个进程的双精度数。您确定您的nx实际上不是0,或者不是错误的数据类型/种类吗?