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)
谢谢你的帮助!
在您的情况下,两种不同的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
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.