【发布时间】:2018-08-07 13:41:02
【问题描述】:
到目前为止,我一直在使用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,但我没有发现任何关于从标准输入读取的信息。
【问题讨论】:
-
您使用哪种 MPI 实现?单个进程只获得
mpirun的标准输入(有时是可控的)是很常见的。 -
打开 MPI v2.0.1
-
不鼓励将
mpirun与重定向一起使用,并且仅应在没有其他选择时使用(例如,如果输入文件仅在调用mpirun的节点上可用)。原因是它涉及次优的带外流量。此用例也经过了轻微测试,并且报告了一些错误。另外,请注意Open MPI 2.0.x系列不再受支持,您应该升级到3.0.x或至少2.1.x系列。