Fortran 使用主控和从控mpi_cart_创建
我想创建一个没有0处理器的拓扑。我的想法是将处理器0作为主处理器,并将拓扑创建为从处理器。经过一定的计算后,我会将数据发送到主机。这是我的密码:Fortran 使用主控和从控mpi_cart_创建,fortran,mpi,topology,Fortran,Mpi,Topology,我想创建一个没有0处理器的拓扑。我的想法是将处理器0作为主处理器,并将拓扑创建为从处理器。经过一定的计算后,我会将数据发送到主机。这是我的密码: include "mpif.h" integer maxn integer myid,Root,numprocs,numtasks,taskid integer comm2d, ierr integer dims(2) logical periods(2)
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
但是,当我运行上述代码时;我得到以下错误
PMPI_Comm_列中的致命错误:无效的通信器,错误堆栈:
PMPI_Comm_rank(121):MPI_Comm_rank(MPI_Comm_NULL,rank=0x7fff08bf960c)
PMPI通信列组(73)失败:空通信器
如何消除错误?我做错了什么 您可以使用
numprocs
进程开始MPI作业。然后使用numtasks=numprocs-1
进程创建笛卡尔拓扑。因此,其中一个进程最终不是笛卡尔通信器的一部分,并在comm2d
中接收MPI\u COMM\u NULL
。使用空通信器调用MPI\u COMM\u RANK
是一个错误。解决方案是修复代码,首先检查comm2d的值:
CALL MPI_CART_CREATE(MPI_COMM_WORLD,2,dims,periods,.true.,
* comm2d,ierr)
IF (comm2d.NE.MPI_COMM_NULL) THEN
...
ENDIF
您可以使用numprocs
进程启动MPI作业。然后使用numtasks=numprocs-1
进程创建笛卡尔拓扑。因此,其中一个进程最终不是笛卡尔通信器的一部分,并在comm2d
中接收MPI\u COMM\u NULL
。使用空通信器调用MPI\u COMM\u RANK
是一个错误。解决方案是修复代码,首先检查comm2d的值:
CALL MPI_CART_CREATE(MPI_COMM_WORLD,2,dims,periods,.true.,
* comm2d,ierr)
IF (comm2d.NE.MPI_COMM_NULL) THEN
...
ENDIF
我想,我现在已经编辑过了。有什么理由在2016年使用Fortran 77标准开发新代码吗?@Gilles并不完全学习MPI它是从教程中挑选出来的。不要要求我们调试缺少隐式none
的Fortran代码。也不要在这样的代码上浪费自己的时间。你从中挑选的教程一定非常陈旧和过时。强烈反对使用MPI的mpif.h
Fortran接口。甚至use-mpi
界面也变得不优雅了。学习现代Fortran并坚持使用提供使用MPI\u f08
接口的MPI实现。我想,我现在已经编辑了它。有什么理由在2016年使用Fortran77标准开发新代码吗?@Gilles不完全学习MPI它是从教程中挑选出来的。不要要求我们调试缺少隐式无的Fortran代码。也不要在这样的代码上浪费自己的时间。你从中挑选的教程一定非常陈旧和过时。强烈反对使用MPI的mpif.h
Fortran接口。甚至use-mpi
界面也变得不优雅了。学习现代Fortran并坚持使用提供使用MPI\u f08
接口的MPI实现。感谢您的回答,我将在明天给出反馈。是的,它现在正在工作。购物车处理器的等级从0到numtask。我如何处理在这里运行计算并将数据发送到等级为零的从属服务器。因为秩0重复两次;这又让我产生了一个疑问。笛卡尔式通信器中的等级0在MPI\u COMM\u WORLD中的等级不同。主进程无论如何不能在comm2d
中发送消息,因为它不是通讯器的成员。感谢您的回答,我将在明天反馈。是的,它正在工作。购物车处理器的等级从0到numtask。我如何处理在这里运行计算并将数据发送到等级为零的从属服务器。因为秩0重复两次;这又让我产生了一个疑问。笛卡尔式通信器中的等级0在MPI\u COMM\u WORLD中的等级不同。由于主进程不是通信器的成员,因此它无论如何不能在comm2d
中发送消息。