2011-04-13 12 views
5

Tengo un código FORTRAN paralelo en el que quiero solamente el rango = 0 proceso sea capaz de escribir en la salida estándar, pero no quiero tener que ensucian el código con:salida estándar en el código Fortran MPI

if(rank==0) write(*,*) ... 

así que me preguntaba si sería una buena idea hacer algo como lo siguiente, ¿o si hay una manera mejor?

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 

Esto da:

$ mpirun -n 10 ./a.out 
Hello from rank=   0 

Gracias por cualquier consejo!

Respuesta

11

Hay dos desventajas para su solución:

  1. Esta solución "inteligente" en realidad se oscurece el código, ya que se encuentra: la salida estándar no es la salida estándar más. Si alguien lee el código, él/ella pensará que todos los procesos están escribiendo en stdout, mientras que en realidad no lo están.
  2. Si desea que todos los procesos escriban en stdout en algún momento, ¿qué hará entonces? Añadir más trucos?

Si realmente quiere seguir con este truco, no use "stdout" como una variable para el número de unidad, pero p. "maestro" o cualquier cosa que indique que no estás escribiendo en stdout. Además, debe tener en cuenta que el número 6 no siempre es estándar. Fortran 2003 le permite verificar el número de unidad de stdout, por lo que debe usarlo si puede.

Mi consejo sería quedarme con las declaraciones if(rank==0). Están indicando claramente lo que sucede en el código. Si usa muchas declaraciones de E/S similares, podría escribir subrutinas para escribir solo para el rango 0 o para todos los procesos. Estos pueden tener nombres significativos que indiquen el uso previsto.

0

No estoy tan preocupado por las dos desventajas mencionadas por steabert. Podemos resolverlo introduciendo otro descriptor de archivo que indique claramente que está estándar solo en el proceso maestro, p. stdout ->stdout0.

Pero mi preocupación está aquí: El/dev/null funcionará en un entorno tipo UNIX. ¿Funcionará en el entorno de Windows? ¿Qué hay de los funky sistemas BlueGene?

1

mpirun viene con la opción de redireccionar stdout de cada proceso en archivos separados. Por ejemplo, -output-filename out daría como resultado out.1.0, out.1.1, ... que luego puede supervisar usando cualquier forma que desee (yo uso tail -f). Junto a if(rank.eq.0) esta es la solución más limpia, creo.

Cuestiones relacionadas