Fortran PMPI_Comm_列中的致命错误:无效的通信器

Fortran PMPI_Comm_列中的致命错误:无效的通信器,fortran,mpi,mpich,Fortran,Mpi,Mpich,这是教科书上的一个例子。但最初的版本使用MPI\u COMM\u WORLD替换MPI\u COMM\u RANK和MPI\u COMM\u SIZE中的COMM。我这样做只是因为我发现原型说comm应该是一个整数。在做了此更改之后,我使用mpifort test\u mpi.f90编译并创建a.out文件。接下来我使用mpirun-n4./a.out执行它,它显示以下错误 PMPI_Comm_列中的致命错误:无效的通信器,错误堆栈: PMPI通信秩(110):MPI通信秩(通信=0x0,秩=0

这是教科书上的一个例子。但最初的版本使用
MPI\u COMM\u WORLD
替换
MPI\u COMM\u RANK
MPI\u COMM\u SIZE
中的
COMM
。我这样做只是因为我发现原型说
comm
应该是一个整数。在做了此更改之后,我使用
mpifort test\u mpi.f90
编译并创建
a.out
文件。接下来我使用
mpirun-n4./a.out
执行它,它显示以下错误

PMPI_Comm_列中的致命错误:无效的通信器,错误堆栈: PMPI通信秩(110):MPI通信秩(通信=0x0,秩=0x7ffd9b870564) PMPI通讯列组(68)失败:通讯器无效


我在SO上搜索了一下,发现有人这么说。但我只安装了一次mpich,以前从未使用过mpi。那么这里的问题是什么呢?

您的变量
comm
从未初始化过,并且具有未定义的值

你必须给它一个值。开始时,全局通信器是
MPI\u COMM\u WORLD

program main
  use mpi
  character * (MPI_MAX_PROCESSOR_NAME) processor_name 
  integer myid, numprocs, namelen, rc, ierr
  integer comm
  call MPI_INIT( ierr )
  call MPI_COMM_RANK( comm, myid, ierr )
  call MPI_COMM_SIZE( comm, numprocs, ierr )
  call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
  write(*,*) "Hello World! Process ",myid," of ", numprocs, " on ", processor_name
  call MPI_FINALIZE(rc)
end program main

当然,
MPI\u COMM\u WORLD
也是整数,它是一个整数常量。

我可以将COMM分配给除MPI\u COMM\u WORLD之外的其他值吗?不可以。在创建不同的通信器之前不可以,但您必须先了解如何以及为什么这样做。首先学习基本的MPI。如果可能的话,您更愿意使用Fortran 2008绑定,因为它们不太容易出错。例如,通信器具有类型
type(MPI\U Comm)
。编译器(gfortran)对它的支持不够。至少出于我的目的。您使用的是哪个gfortran和MPI?iirc,gfortran 4.9.2中对开放MPI有足够的支持,但对于MPICH,只有ifort和cray编译器可以编译Fortran 2008绑定。
comm = MPI_COMM_WORLD