【问题标题】:Fatal error in PMPI_Comm_rank: Invalid communicatorPMPI_Comm_rank 中的致命错误:无效的通信器
【发布时间】:2017-12-05 02:36:31
【问题描述】:
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_COMM_WORLD 替换MPI_COMM_RANKMPI_COMM_SIZE 中的comm。我这样做只是因为我发现原型说comm 应该是一个整数。进行此更改后,我使用mpifort test_mpi.f90 编译并创建a.out 文件。接下来我使用mpirun -n 4 ./a.out 执行它,它显示以下错误。

PMPI_Comm_rank 中的致命错误:无效的通信器,错误堆栈: PMPI_Comm_rank(110): MPI_Comm_rank(comm=0x0, rank=0x7ffd9b870564) PMPI_Comm_rank(68) 失败。:无效的通信器

我在SO上进行了一些搜索,发现有人说mpi.h is from one version while the binary library files are from another one。但我只安装一次 mpich 并且以前从未使用过 mpi。那么这里有什么问题呢?

【问题讨论】:

    标签: fortran mpi mpich


    【解决方案1】:

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

    你必须给它一个值。一开始,全局通讯器是MPI_COMM_WORLD

    comm = MPI_COMM_WORLD
    

    当然MPI_COMM_WORLD也是整数,它是一个整数常量。

    【讨论】:

    • 我可以将 comm 分配给除 MPI_COMM_WORLD 之外的其他值吗?
    • 没有。不是在您创建一个不同的沟通者之前,而是您必须首先了解如何以及为什么要这样做。首先学习基本的 MPI。
    • 如果可能,您宁愿使用 Fortran 2008 绑定,因为它们更不容易出错。例如,通信器的类型为TYPE(MPI_Comm)
    • 编译器(gfortran)支持不够。至少对我而言。
    • 您使用的是哪个 gfortran 和 MPI? iirc,gfortran 4.9.2 对 Open MPI 有足够的支持,但是对于 MPICH,只有 ifort 和 cray 编译器可以编译 Fortran 2008 绑定。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2012-10-13
    • 2019-06-09
    • 2018-06-20
    • 1970-01-01
    • 2018-01-23
    • 2017-02-22
    • 2018-02-17
    相关资源
    最近更新 更多