到目前为止,我一直在使用OPEN(fid, FILE='IN', ...)
,似乎所有MPI进程都会读取相同的文件IN
而不会互相干扰。
此外,为了允许从多个输入文件中选择输入文件,我简单地使IN
文件成为指向所需输入的符号链接。这意味着当我想要更改输入文件时,我必须在运行程序(ln -sf desidered-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,但我没有发现从标准输入读取的内容。
答案 0 :(得分:3)
您正在看expected behaviour with OpenMPI。默认情况下,mpirun
将除了MPI_COMM_WORLD rank 0进程之外的所有进程的UNIX标准输入定向到/ dev / null。 MPI_COMM_WORLD等级0进程从mpirun继承标准输入。
选项--stdin
可用于将标准输入定向到另一个流程,但不能直接指向所有流程。
还可以注意到,标准输入的重定向行为在MPI实现中并不一致(该概念不是由MPI标准指定的)。例如,使用英特尔MPI,-s
有mpirun
选项。 mpirun -np 4 -s all ./main
允许所有进程访问mpirun
的标准输入。还没有保证没有重定向的进程会失败而不是等待阅读。