стандартный вывод в коде Fortran MPI

У меня есть параллельный код на фортране, в котором я хочу, чтобы только процесс с рангом = 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

Спасибо за любой совет!


person astrofrog    schedule 13.04.2011    source источник


Ответы (3)


В вашем решении есть два недостатка:

  1. Это «умное» решение на самом деле скрывает код, поскольку он лжет: stdout больше не stdout. Если кто-то прочитает код, он подумает, что все процессы пишут в stdout, хотя на самом деле это не так.
  2. Если вы хотите, чтобы все процессы записывали в стандартный вывод в какой-то момент, что вы тогда будете делать? Добавить больше трюков?

Если вы действительно хотите придерживаться этого трюка, пожалуйста, не используйте «stdout» в качестве переменной для номера устройства, но, например, «мастер» или что-то, что указывает на то, что вы на самом деле не пишете в стандартный вывод. Кроме того, вы должны знать, что число 6 не всегда является стандартным выводом. Fortran 2003 позволяет вам проверить номер модуля stdout, поэтому вы должны использовать его, если можете.

Я бы посоветовал остаться с операторами if(rank==0). Они четко указывают, что происходит в коде. Если вы используете много похожих операторов ввода/вывода, вы можете написать подпрограммы для записи только для ранга 0 или для всех процессов. Они могут иметь осмысленные имена, указывающие на предполагаемое использование.

person steabert    schedule 15.04.2011

mpirun поставляется с возможностью перенаправления stdout из каждого процесса в отдельные файлы. Например, -output-filename out приведет к результату out.1.0, out.1.1, ..., который вы затем сможете отслеживать любым удобным для вас способом (я использую tail -f). Я думаю, что рядом с if(rank.eq.0) это самое чистое решение.

person elorenz    schedule 28.06.2013

Меня не так беспокоят два недостатка, упомянутые Стеабертом. Мы можем решить это, введя другой файловый дескриптор, который четко указывает, что он является стандартным выводом только для главного процесса, например. stdout -> stdout0.

Но меня беспокоит вот что: /dev/null будет работать в UNIX-подобной среде. Будет ли он работать в среде Windows? Как насчет необычных систем BlueGene?

person Wirawan Purwanto    schedule 02.02.2012