1

我正在尝试使用 MPI Scatter 将 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_Finalise(ierr)。但是我仍然在尝试执行 MPI Scatter 时遇到错误

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 是一个 REAL*8 数据类型的矩阵,具有 N 行和 N 列。还

nx = N/numberofprocesses

我的 MPI_Scatter 代码如下

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

错误的原因是什么?

4

0 回答 0