如何在运行时将参数从输入文件传递到fortran 77 mpirun?

时间:2013-10-03 00:55:01

标签: fortran openmpi fortran77

我是MPI和Fortran 77菜鸟。我有一个fortran 77代码FKRPRO.f,我想使用OpenMPI进行并行化。该代码需要大量参数,这些参数在运行时从单独的文件中输入。编译和运行是这样的

gfortran -o FKRPRO FKRPRO.f
./FKRPRO < Modelfile.txt

代码中的等效行(不是我的代码)是

      PARAMETER(LIN=5)
      INTEGER ERROR
      LOGICAL PRNTA
      PRNTA=.FALSE.
      READ(LIN,'(L3)') PRNTA
      READ(LIN,21) M1,M2
   21 FORMAT(11I5)

等等。有人可以向我解释READ(LIN,'(L3)') PRNTA的含义。输入文件Modelfile.txt中的输入是这样的

.F.                                                                             
    0   64  
and so on..   

我在代码中放了必要的MPI语句。

      INCLUDE 'MPIF.H'
...
      CALL MPI_INIT(ERROR)
      CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,ERROR)
      CALL MPI_COMM_RANK(MPI_COMM_WORLD,PRANK,ERROR)
...
      CALL MPI_TYPE_FREE(NEWMATRIX,ERROR)
      CALL MPI_FINALIZE(ERROR)

所有进程都无法读取输入文件。我编译并运行了像这样的代码

mpif77 -o bc3 FKRPROG5.f
mpirun -np 4 bc3 < Modelfile.txt 

这不起作用。我收到以下错误。只有第一个进程或等级0才能读取该文件。

At line 50 of file FKRPROG5.f (unit = 5, file = 'stdin')
Fortran runtime error: End of file
At line 50 of file FKRPROG5.f (unit = 5, file = 'stdin')
Fortran runtime error: End of file
At line 50 of file FKRPROG5.f (unit = 5, file = 'stdin')
Fortran runtime error: End of file
mpirun has exited due to process rank 3 with PID 866 on
node Avinash-rMBP.local exiting improperly. There are two reasons this could occur:

1. this process did not call "init" before exiting, but others in
the job did. This can cause a job to hang indefinitely while it waits
for all processes to call "init". By rule, if one process calls "init",
then ALL processes must call "init" prior to termination.

2. this process called "init", but exited without calling "finalize".
By rule, all processes that call "init" MUST call "finalize" prior to
exiting or it will be considered an "abnormal termination"

This may have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).

第50行是READ(LIN,'(L3)') PRNTA。有人指出我出错的地方:( 那么,我怎样才能从这个输入文件读取所有进程&lt; Modelfile.txt ??感谢。

1 个答案:

答案 0 :(得分:5)

声明

READ(LIN,'(L3)') PRNTA

使程序从附加到具有标识LIN的通道的单元读取一个3字符序列,该序列表示逻辑值并将读取的值赋给变量PRNTA。根据您向我们展示的片段,该计划将会显示.F.并将PRNTA设置为.false.

LIN设置为常量值5,通常表示stdin。使用5来表示stdin不是法律标准,它更像是事实上的标准。

将参数文件读入MPI程序的简单方法是确保只有一个进程读取文件,然后将值发送给需要它们的其他进程。

您似乎编写了一个程序,其中所有进程都尝试读取相同的输入文件,但在运行时,您用于传递Modelfile.txt的重定向仅适用于一个进程(可能是排名为0的过程。其他进程根本没有得到输入文件并且正在抱怨,然后使程序崩溃。您显示的错误消息是典型的Fortran程序,它在尝试读取时根本找不到输入文件。

更好地编写代码:

call mpi_init ...
...
if (myrank==0) then
    open(...) inputfile
    read(...) parameters
    close(...)
end if
...
call mpi_bcast(parameters from 0 to all)
...

通常,不要指望MPI进程的运行时环境是顺序程序的运行时环境的相同副本。我认为您已经看到证据表明您的运行时仅将输入定向到程序运行时创建的第一个进程。由于mpirun未标准化(尽管mpiexec是),但我认为您不能依赖此运行时行为对所有MPI实现都相同。为了便于携带和兼容,最好在程序中明确地处理I / O,而不是使用重定向等o / s功能。

您可以,而不是让进程0读取参数并将它们分发给其他进程,编写代码使每个进程读取相同的文件。如果您以这种方式编写代码,请注意确保进程不会争夺对I / O通道的访问权限;尝试(几乎)同时读取单个输入通道的多个进程是减慢速度的可靠方法。