使用所有MPI流程从标准输入读取

时间:2018-02-27 19:37:52

标签: io fortran mpi stdin

到目前为止,我一直在使用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,但我没有发现从标准输入读取的内容。

1 个答案:

答案 0 :(得分:3)

您正在看expected behaviour with OpenMPI。默认情况下,mpirun

  

将除了MPI_COMM_WORLD rank 0进程之外的所有进程的UNIX标准输入定向到/ dev / null。 MPI_COMM_WORLD等级0进程从mpirun继承标准输入。

选项--stdin可用于将标准输入定向到另一个流程,但不能直接指向所有流程。

还可以注意到,标准输入的重定向行为在MPI实现中并不一致(该概念不是由MPI标准指定的)。例如,使用英特尔MPI,-smpirun选项。 mpirun -np 4 -s all ./main允许所有进程访问mpirun的标准输入。还没有保证没有重定向的进程会失败而不是等待阅读。

相关问题