Al llamar a MPI_BCAST, ¿hay alguna sincronización implícita? Por ejemplo, si el proceso del remitente llegara al MPI_BCAST antes que a otros, ¿podría hacer el BCAST y luego continuar sin ningún agradecimiento? Algunas pruebas recientes con código como:Sincronización implícita con MPI_BCAST para el emisor y los receptores?
program test
include 'mpif.h'
integer ierr, tid, tmp
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, tid, ierr)
tmp = tid
if(tid.eq.0) then
call MPI_BCAST(tmp,1,MPI_INTEGER,MPI_ROOT,MPI_COMM_WORLD, ierr)
else
endif
write(*,*) tid,'done'
call MPI_FINALIZE(ierr)
end
muestra que con dos hilos que ambos llegan a la terminación, a pesar de sólo el remitente haciendo una llamada a MPI_BCAST.
Salida:
1 done 0
0 done 0
Podría ser esto un problema con la instalación MPI Estoy trabajando con (MPICH), o se trata de un comportamiento estándar de MPI?
Bien, he puesto el programa completo con el que estoy trabajando. Esperaría que bloqueara indefinidamente esperando que otros llamaran a MPI_BCAST si mpirun se inicia con más de 1 procesador, pero en mi máquina sale con ambos procesos haciendo la llamada para escribir, con el valor 0 en tmp – agrippa
No necesita bloque: la raíz no necesita ninguna respuesta de los otros rangos para continuar, por lo tanto, es posible que no los espere. En particular, en un protocolo de mensaje ansioso, la raíz enviará su mensaje inmediatamente y se ubicará en un búfer en (algunos de) los otros rangos hasta que llamen a 'MPI_Bcast'. –
@Jeremiah: no es cierto. El estándar MPI requiere que para cuando 'Bcast' regrese, el contenido del buffer de la raíz ha sido copiado a todos los procesos. @ user631027: en su programa, procese 0 bloques en 'Bcast', pero el proceso 1 llega inmediatamente a' Finalize', reduciendo el tamaño de MPI_COMM_WORLD a 1. Como tal, el proceso 0 ahora es libre de completar 'Bcast' ya que él es el único para transmitir a. Si el proceso 1 llamara a un 'Bcast' que no coincide con el del proceso 0, el programa se bloqueará. – suszterpatt