目前我一直在使用OPEN(fid, FILE='IN', ...)
, 看起来所有的MPI进程都可以无干扰地读取相同的文件IN
.
此外,为了让输入文件可以从多个文件中选择,我只需将IN
文件做成指向所需输入文件的符号链接。这意味着当我想要更改输入文件时,我必须在运行程序之前运行ln -sf desired-input IN
(mpirun -n $np ./program
)。
我希望能够以mpirun -n $np ./program < input-file
的方式运行程序。为了实现这一点,我删除了OPEN
语句和相应的CLOSE
语句,并将所有的READ(fid,*)
语句改为READ(INPUT_UNIT,*)
(我正在使用ISO_FORTRAN_ENV
模块)。
但是,在所有编辑完成后,我意识到只有一个进程(总是0
)从中读取,因为所有其他进程立即到达了EOF
。以下是使用OpenMPI 2.0.1的MWE。
! cat main.f90
program main
use, intrinsic :: iso_fortran_env
use mpi
implicit none
integer :: myid, x, ierr, stat
x = 12
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world, myid, ierr)
read(input_unit,*, iostat=stat) x
if (is_iostat_end(stat)) write(output_unit,*) myid, "I'm out"
if (.not. is_iostat_end(stat)) write(output_unit,*) myid, "I'm in", myid, x
call mpi_finalize(ierr)
end program main
这段代码可以使用mpifort -o main main.f90
进行编译,使用mpirun -np 4 ./main
运行,最终输出如下:
1 I'm out
2 I'm out
3 I'm out
17 this is my input from keyboard
0 I'm in 0 17
我知道MPI有适当的例程来执行并行I/O,但是我没有找到关于从标准输入读取的内容。
mpirun
的标准输入(有时是可控的)。 - francescalusmpirun
,只有在没有其他选择时才应该使用(例如,如果输入文件仅在调用mpirun
的节点上可用)。原因是它涉及到次优的带外流量。这种用例也经过轻微测试,并报告了一些错误。此外,请注意Open MPI 2.0.x
系列已不再受支持,您应该升级到3.0.x
或至少2.1.x
系列。 - Gilles Gouaillardet