单台 PC 上的 MPI Fortran 代码错误

Posted

技术标签:

【中文标题】单台 PC 上的 MPI Fortran 代码错误【英文标题】:MPI Fortran code error on a single PC 【发布时间】:2012-10-09 23:21:07 【问题描述】:

最近我试图在单机(Ubuntu 12.04 - 64 位核心 i7 2670 QM)上编译和运行我的 mpi 代码,我使用以下配置安装了 mpich2 版本 1.2:

./configure --prefix=/opt/mpich2 --enable-f77 --enable-fc --enable-cxx --with-device=ch3:sock --with-pm=mpd CC=icc CXX=icpc F77=ifort FC=ifort 2>&1 | tee configure.log

安装没问题,我的mpd运行良好,我用示例测试了mpd,一切都很完美。

我使用 mpif77 编译我的代码,因为我不知道为什么在我编译 mpich2 时没有创建 mpif90。但即使使用 mpif77 我编译的代码也没有错误。

我用来编译代码的标志是:

对于编译器:

LN_FLAGS= -lm -larpack -lsparskit -lfftw3 -lrt -llapack -lblas

对于 MPI 链接器:

LN_FLAGS_MPI= $(LN_FLAGS) -I$(MPIHOME)/include -L$(MPIHOME) $(MPIHOME)/lib/libmpich.a -lfmpich -lopa -lmpe

所以问题是当我尝试在我的机器上运行代码时:

首先我调用 mpd 为:

mpd &

然后运行代码为:

mpirun -np 4 ./code_mpi

我尝试了很多变体:

mpiexec -np 4 ./code_mpi
mpirun -n 2 ./code_mpi
mpiexec -n 2 ./code_mpi

所有的结果都是同样的错误:

Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
[cli_2]: aborting job:
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
[cli_1]: aborting job:
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
rank 2 in job 1  ubuntu_38132   caused collective abort of all ranks
  exit status of rank 2: killed by signal 9 
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
[cli_3]: aborting job:
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
[cli_0]: aborting job:
Fatal error in MPI_Comm_rank: Invalid communicator, error stack:
MPI_Comm_rank(106): MPI_Comm_rank(MPI_COMM_NULL, rank=0x14b46a0) failed
MPI_Comm_rank(64).: Null communicator
rank 1 in job 1  ubuntu_38132   caused collective abort of all ranks
  exit status of rank 1: return code 1 

我花了将近 2 周的时间试图解决这个问题,因为我真的需要在我的个人电脑上运行这段代码才能在家工作。感谢所有可以帮助我的人!


这是我如何初始化 MPI 库

subroutine init()
integer                      :: provided
call mpi_init(mpi_err)
call mpi_comm_rank(mpi_comm_world,rank,mpi_err)
call mpi_comm_size(mpi_comm_world,an_proc,mpi_err)
call MPI_BARRIER(MPI_COMM_WORLD,mpi_err)
end subroutine init

【问题讨论】:

你不需要先启动mpd;你能成功编译/运行一个简单的 MPI "Hello world",例如slac.stanford.edu/comp/unix/farm/mpi.html 吗? 向我们展示初始化 MPI 库的这部分代码,例如包含对MPI_INITMPI_COMM_RANK 的调用的部分。 【参考方案1】:

问题是你的子程序不知道mpi_comm_world 是什么。此整数值在 mpif.h 标头(或 f90 的 mpi 模块)中设置。在编写代码时,mpi_comm_world 由编译器随机分配,与mpi 提供的实际mpi_comm_world 通信器句柄没有关联。

一般来说,最好在您的代码中使用implicit none,它会警告您这些类型的错误。请尝试以下操作:

subroutine init()
!use mpi   !This one is for f90
implicit none
include 'mpif.h'   !use this for f77
integer  :: provided,rank,an_proc,ierr
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,rank,ierr)
call mpi_comm_size(mpi_comm_world,an_proc,ierr)
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
end subroutine init

【讨论】:

真的很奇怪,因为当我在集群上运行时,我没有收到这个错误。我进行了更改,但错误仍在继续...

以上是关于单台 PC 上的 MPI Fortran 代码错误的主要内容,如果未能解决你的问题,请参考以下文章

MPI Fortran编译器优化错误[重复]

英特尔 Fortran 编译器找不到模块“mpi”

使用 MPI_Gather 在 Fortran 中发送二维数组

mpifort -DMPI 编译错误:派生类型“mpi_status”用作实际参数。适用于英特尔 Fortran,但不适用于 GNU Fortran

将 mpi 消息从 c++ 代码发送到 fortran 90 代码

通过 mpi_f08 模块和 gfortran 支持 MPI Fortran