Fortran MPI代码中的标准输出

| 我有一个并行的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
感谢您的任何建议!     
已邀请:
您的解决方案有两个缺点: 这个“聪明”的解决方案实际上使代码模糊不清,因为它位于:stdout不再是stdout。如果有人阅读了代码,他/她将认为所有进程都在向stdout写入内容,而实际上并非如此。 如果您希望所有进程在某个时候写入标准输出,那您将怎么办?添加更多技巧? 如果您真的想坚持使用这种技巧,请不要将\“ stdout \”用作单位编号的变量,但例如\“ master \”或表明您实际上没有写到stdout的任何内容。此外,您应该注意数字
6
并非总是stdout。 Fortran 2003允许您检查stdout的单元号,因此,如果可以的话,应该使用它。 我的建议是保留
if(rank==0)
陈述。它们清楚地指示代码中发生了什么。如果您使用许多类似的I / O语句,则可以编写子例程以仅针对等级0或所有进程进行写入。这些名称可以具有表示预期用途的有意义的名称。     
mpirun带有将每个进程的stdout重定向到单独文件的选项。例如,ѭ5将导致out.1.0,out.1.1,...,然后您可以使用任意方式对其进行监视(我使用
tail -f
)。我认为,在ѭ7旁边,这是最干净的解决方案。     
我不太关心steabert提到的两个缺点。我们可以通过引入另一个文件描述符来解决这个问题,该文件描述符清楚地表明它仅在主进程上是stdout,例如
stdout
->
stdout0
。 但我的担心在这里:/ dev / null将在类似UNIX的环境中工作。可以在Windows环境下使用吗?时髦的BlueGene系统怎么样?     

要回复问题请先登录注册