对主从使用 mpi_cart_create

use mpi_cart_create with master and slave

我想创建一个没有 0 处理器的拓扑。我的想法是将处理器 0 作为主处理器并创建拓扑作为从处理器。经过一定的计算 sin 拓扑后,我将向 master 发送数据。这是我的代码:

      include "mpif.h"

      integer   maxn

      integer   myid,Root,numprocs,numtasks,taskid
      integer   comm2d, ierr
      integer   dims(2)
      logical   periods(2)
      data periods/2*.false./
    Root = 0
      CALL MPI_INIT( ierr )
      CALL MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr )
      CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr )
      numtasks = numprocs-1
      if(myid .eq. Root) then
      print *, 'Hello I am master'
      endif
c  Get a new communicator for a decomposition of the domain.  
c  Let MPI find a "good" decomposition
      dims(1) = 0
      dims(2) = 0
      CALL MPI_DIMS_CREATE(numtasks,2,dims,ierr)
      CALL MPI_CART_CREATE(MPI_COMM_WORLD,2,dims,periods,.true.,
     *                    comm2d,ierr)
c   Get my position in this communicator
      CALL MPI_COMM_RANK( comm2d, taskid, ierr )        
c
    print *, 'task ID= ',taskid
    if (myid .eq. master) then
        print *,dims(1),dims(2)
    endif
      CALL MPI_Comm_free( comm2d, ierr )

30    CALL MPI_FINALIZE(ierr)

      STOP
      END

但是,当我 运行 上面的代码;我收到以下错误。

Fatal error in PMPI_Comm_rank: Invalid communicator, error stack: PMPI_Comm_rank(121): MPI_Comm_rank(MPI_COMM_NULL, rank=0x7fff08bf960c) failed PMPI_Comm_rank(73).: Null communicator

如何消除错误?我做错了什么。

您使用 numprocs 个进程启动 MPI 作业。然后您创建一个具有 numtasks = numprocs-1 个进程的笛卡尔拓扑。因此,其中一个进程最终不是笛卡尔通信子的一部分,而是在 comm2d 中接收 MPI_COMM_NULL。使用空通信器调用 MPI_COMM_RANK 是错误的。解决方案是修复您的代码以首先检查 comm2d:

的值
 CALL MPI_CART_CREATE(MPI_COMM_WORLD,2,dims,periods,.true.,
*                     comm2d,ierr)
 IF (comm2d.NE.MPI_COMM_NULL) THEN
   ...
 ENDIF