对主从使用 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
我想创建一个没有 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