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 mpirunwhich mpif90 看看这些程序是在哪里找到的吗? 我认为一些 MPI 库将标准输入连接到 /dev/null,因此您无法从进程中的标准输入读取。 【参考方案1】:

在您的情况下,两种不同的 MPI 实现混合在一起。运行时 MPI 环境来自用于编译程序的不同实现,因此两个进程都表现为 MPI 单例,即它们中的每一个都形成一个单独的MPI_COMM_WORLD 通信器并在其中成为等级0。结果,条件的第一个分支在两个进程中都执行。另一方面,mpirun 仅在所有其他进程关闭或连接到/dev/null 时才将输入重定向到第一个进程。 MPI_SEND 失败的原因相同 - 在每个 MPI 进程的单例宇宙中,没有等级 1

这种行为的最常见原因是mpirunmpif90 来自不同的 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 的开发包,它提供了mpiccmpif90 等,但随后您安装了 Open MPI 的运行时包,则可能会发生这种情况。确保您只安装了来自一种 MPI 的软件包。如果您从源代码编译 MPICH,请确保其二进制文件的路径是 $PATH 的第一个元素。

【讨论】:

天哪,我希望我能吻你!我是 Fortran 和 MPI 的完全菜鸟,所以我使用此链接开始:mit-crpg.github.io/openmc/usersguide/install.html。问题是我都安装了它们。我删除了 MPICH,一切正常!想想如果没有你的提示,我会遇到多少错误!

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

什么是fortran语言之fortran语言入门

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

在 FORTRAN 90 中使用 MPI_Type_Create_Subarray

MPI_SCATTER Fortran 矩阵(按行)

如何在由 MPI 并行化的 fortran 中调用子例程?

OpenACC + MPI Fortran 程序入门