Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 使用主控和从控mpi_cart_创建_Fortran_Mpi_Topology - Fatal编程技术网

Fortran 使用主控和从控mpi_cart_创建

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)

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

      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
中发送消息。