我正在编写一个非常小的程序,以了解MPI(MPICH实现)和Fortran90。不幸的是,用“ -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.
--------------------------------------------------------------------------
谢谢您的帮助!
在您的情况下,两种不同的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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句