我有一个并行的fortran代码,我只希望rank = 0进程能够写入stdout,但我不想乱丢代码:
if(rank==0) write(*,*) ...
所以我想知道做以下事情是不是一个好主意,或者是否有更好的方法?
program test
use mpi
implicit none
integer :: ierr
integer :: nproc
integer :: rank
integer :: stdout
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world, rank, ierr)
call mpi_comm_size(mpi_comm_world, nproc, ierr)
select case(rank)
case(0)
stdout = 6
case default
stdout = 7
open(unit=stdout, file='/dev/null')
end select
write(stdout,*) "Hello from rank=", rank
call mpi_finalize(ierr)
end program test
这给出了:
$ mpirun -n 10 ./a.out
Hello from rank= 0
感谢您的任何建议!
答案 0 :(得分:12)
您的解决方案有两个缺点:
如果你真的想坚持这个技巧,请不要使用“stdout”作为单位号的变量,但是“主人”或任何表明你实际上没有写到stdout的东西。此外,您应该知道数字6
并不总是标准输出。 Fortran 2003允许您检查标准输出的单位数,因此如果可以,您应该使用它。
我的建议是继续if(rank==0)
陈述。它们清楚地表明代码中发生了什么。如果使用大量类似的i / o语句,则可以编写子程序,仅用于写入0级或所有进程。这些可以具有有意义的名称,用于指示预期用途。
答案 1 :(得分:2)
mpirun附带了将每个进程的stdout重定向到单独文件的选项。例如,-output-filename out
将导致out.1.0,out.1.1,...然后您可以使用您喜欢的任何方式进行监控(我使用tail -f
)。在if(rank.eq.0)
旁边,这是我认为最干净的解决方案。
答案 2 :(得分:0)
我并不关心steabert提到的两个缺点。我们可以通过引入另一个文件描述符来解决这个问题,该描述符清楚地表明它仅在主进程上是stdout,例如stdout
- > stdout0
。
但我担心的是:/ dev / null将在类UNIX环境中工作。它适用于Windows环境吗?那个时髦的BlueGene系统怎么样?