Fortran 90和MPI错误

Sto*_*eak 2 mpi fortran90 mpich

我正在编写一个非常小的程序来理解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
Run Code Online (Sandbox Code Playgroud)

我正在编译它,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
Run Code Online (Sandbox Code Playgroud)

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.
--------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Hri*_*iev 6

在您的情况下,两种不同的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
Run Code Online (Sandbox Code Playgroud)

是MPICH的错误格式.因此mpif90来自MPICH.

但是下一条错误消息:

--------------------------------------------------------------------------
mpirun noticed that the job aborted, but has no info as to the process
that caused that situation.
--------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

是Open MPI的OpenRTE框架使用的错误格式.因此mpirun来自Open MPI而不是来自MPICH.

这可能发生,如果您已经安装了开发包MPICH,所以它提供mpicc,mpif90等,但你已经安装了Open MPI的运行时包.确保只安装了一种MPI的软件包.如果您已从源代码编译MPICH,请确保其二进制文件的路径是第一个元素$PATH.