【问题标题】:standard output in Fortran MPI codeFortran MPI 代码中的标准输出
【发布时间】:2011-08-04 16:30:20
【问题描述】:

我有一个并行的 fortran 代码,我只希望 rank=0 进程能够写入标准输出,但我不想乱扔代码:

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

感谢您的建议!

【问题讨论】:

    标签: fortran mpi


    【解决方案1】:

    您的解决方案有两个缺点:

    1. 这个“聪明”的解决方案实际上掩盖了代码,因为它存在:stdout 不再是stdout。如果有人阅读代码,他/她会认为所有进程都在写入标准输出,而实际上并非如此。
    2. 如果您希望所有进程在某个时候都写入标准输出,那么您会怎么做?添加更多技巧?

    如果你真的想坚持这个技巧,请不要使用“stdout”作为单元号的变量,但是例如“master”或任何表明您实际上并未写入标准输出的内容。此外,您应该知道数字6 并不总是标准输出。 Fortran 2003 允许您检查标准输出的单元号,因此您应该尽可能使用它。

    我的建议是坚持使用if(rank==0) 语句。它们清楚地表明代码中发生了什么。如果您使用许多类似的 i/o 语句,您可以编写子例程,只为 rank 0 或所有进程编写。它们可以有有意义的名称来指示预期用途。

    【讨论】:

      【解决方案2】:

      mpirun 带有将标准输出从每个进程重定向到单独文件的选项。例如,-output-filename out 会产生 out.1.0, out.1.1, ... 然后您可以使用任何您喜欢的方式对其进行监控(我使用 tail -f)。在if(rank.eq.0) 旁边,这是我认为最干净的解决方案。

      【讨论】:

        【解决方案3】:

        我不太关心steabert 提到的两个缺点。我们可以通过引入另一个文件描述符来解决这个问题,该描述符清楚地表明它仅在主进程上是标准输出,例如stdout -> stdout0

        但我担心的是:/dev/null 将在类 UNIX 环境中工作。它可以在Windows环境下工作吗?时髦的 BlueGene 系统怎么样?

        【讨论】:

          猜你喜欢
          • 2011-01-16
          • 1970-01-01
          • 2012-01-20
          • 2014-03-02
          • 2012-01-24
          • 2018-05-05
          • 2012-10-09
          • 2013-02-12
          • 1970-01-01
          相关资源
          最近更新 更多