Fortran 90 和 MPI 错误
Posted
技术标签:
【中文标题】Fortran 90 和 MPI 错误【英文标题】:Fortran 90 and MPI error 【发布时间】:2014-02-24 12:29:26 【问题描述】:我正在编写一个非常小的程序来理解 MPI(MPICH 实现)和 Fortran 90。不幸的是,当使用“-np 2”执行代码时,代码运行不正常。
这是代码:
PROGRAM main
USE MPI
IMPLICIT none
INTEGER :: ierr, npe, mynpe
INTEGER :: istatus(MPI_STATUS_SIZE)
REAL :: aa
CALL MPI_INIT(ierr)
CALL MPI_Comm_size(MPI_COMM_WORLD, npe, ierr)
CALL MPI_Comm_rank(MPI_COMM_WORLD, mynpe, ierr)
IF (mynpe == 0) THEN
READ(*,*) aa
CALL MPI_Send(aa, 1, MPI_REAL, 1, 99, MPI_COMM_WORLD, ierr)
ELSE IF (mynpe == 1) THEN
CALL MPI_Recv(aa, 1, MPI_REAL, 0, 99, MPI_COMM_WORLD, istatus, ierr)
WRITE(*,*) "Ho ricevuto il numero ", aa
END IF
CALL MPI_FINALIZE(ierr)
END PROGRAM
我正在用mpif90 mpi_2.f90 -o output
编译它,当我用mpirun -np 2 output
执行它时,我收到以下错误:
At line 14 of file mpi_2.f90 (unit = 5, file = 'stdin')
Fortran runtime error: End of file
shell 仍在等待输入,如果我插入一个数字(例如 11),我会得到以下输出:
11
Fatal error in MPI_Send: Invalid rank, error stack:
MPI_Send(173): MPI_Send(buf=0xbff4783c, count=1, MPI_REAL, dest=1, tag=99, MPI_COMM_WORLD) failed
MPI_Send(98).: Invalid rank has value 1 but must be nonnegative and less than 1
--------------------------------------------------------------------------
mpirun noticed that the job aborted, but has no info as to the process
that caused that situation.
--------------------------------------------------------------------------
感谢大家的帮助!
【问题讨论】:
您的程序在我的电脑上运行良好。你能运行which mpirun
和which mpif90
看看这些程序是在哪里找到的吗?
我认为一些 MPI 库将标准输入连接到 /dev/null,因此您无法从进程中的标准输入读取。
【参考方案1】:
在您的情况下,两种不同的 MPI 实现混合在一起。运行时 MPI 环境来自用于编译程序的不同实现,因此两个进程都表现为 MPI 单例,即它们中的每一个都形成一个单独的MPI_COMM_WORLD
通信器并在其中成为等级0
。结果,条件的第一个分支在两个进程中都执行。另一方面,mpirun
仅在所有其他进程关闭或连接到/dev/null
时才将输入重定向到第一个进程。 MPI_SEND
失败的原因相同 - 在每个 MPI 进程的单例宇宙中,没有等级 1
。
这种行为的最常见原因是mpirun
和mpif90
来自不同的 MPI 库。在您的情况下,您将 MPICH 与 Open MPI 混合在一起。确实,以下错误信息:
MPI_Send(173): MPI_Send(buf=0xbff4783c, count=1, MPI_REAL, dest=1, tag=99, MPI_COMM_WORLD) failed
MPI_Send(98).: Invalid rank has value 1 but must be nonnegative and less than 1
是 MPICH 的错误格式。因此mpif90
来自MPICH。
但是下一条错误信息:
--------------------------------------------------------------------------
mpirun noticed that the job aborted, but has no info as to the process
that caused that situation.
--------------------------------------------------------------------------
是 Open MPI 的 OpenRTE 框架使用的错误格式。因此mpirun
来自 Open MPI 而不是来自 MPICH。
如果您安装了 MPICH 的开发包,它提供了mpicc
、mpif90
等,但随后您安装了 Open MPI 的运行时包,则可能会发生这种情况。确保您只安装了来自一种 MPI 的软件包。如果您从源代码编译 MPICH,请确保其二进制文件的路径是 $PATH
的第一个元素。
【讨论】:
天哪,我希望我能吻你!我是 Fortran 和 MPI 的完全菜鸟,所以我使用此链接开始:mit-crpg.github.io/openmc/usersguide/install.html。问题是我都安装了它们。我删除了 MPICH,一切正常!想想如果没有你的提示,我会遇到多少错误!以上是关于Fortran 90 和 MPI 错误的主要内容,如果未能解决你的问题,请参考以下文章
将 mpi 消息从 c++ 代码发送到 fortran 90 代码