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

问题描述 投票:2回答:1

到目前为止,我一直在使用OPEN(fid, FILE='IN', ...),似乎所有MPI进程都读取相同的文件IN而不会相互干扰。

此外,为了允许输入文件在几个中选择,我简单地使IN文件成为指向所需输入的符号链接。这意味着当我想要更改输入文件时,我必须在运行程序之前运行ln -sf desidered-input INmpirun -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,但我没有发现从标准输入读取。

io fortran mpi stdin
1个回答
3
投票

你看到了expected behaviour with OpenMPI。默认情况下,mpirun

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.