从所有MPI流程的标准输入读取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从所有MPI流程的标准输入读取相关的知识,希望对你有一定的参考价值。
到目前为止,我一直在使用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,但我没有发现从标准输入读取。
你看到了expected behaviour with OpenMPI。默认情况下,mpirun
在除MPI_COMM_WORLD排名0进程之外的所有进程上将UNIX标准输入定向到/ dev / null。 MPI_COMM_WORLD等级0进程从mpirun继承标准输入。
选项--stdin
可用于将标准输入定向到另一个过程,但不能指向所有过程。
还可以注意到,标准输入的重定向行为在MPI实现中并不一致(MPI标准未指定该概念)。例如,使用英特尔MPI,-s
有mpirun
选项。 mpirun -np 4 -s all ./main
确实允许所有进程访问mpirun
的标准输入。也没有保证没有重定向的进程会失败而不是等待阅读。
以上是关于从所有MPI流程的标准输入读取的主要内容,如果未能解决你的问题,请参考以下文章