стандартный вывод в коде Fortran MPI - PullRequest
5 голосов
/ 13 апреля 2011

У меня есть параллельный код 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

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

Ответы [ 3 ]

12 голосов
/ 15 апреля 2011

У вашего решения есть два недостатка:

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

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

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

2 голосов
/ 29 июня 2013

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

0 голосов
/ 02 февраля 2012

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

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

...