Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fileteruso en 25 Noviembre 2020, 20:16 pm



Título: ¿Broadcast en MPI espera confirmación de recepción?
Publicado por: fileteruso en 25 Noviembre 2020, 20:16 pm
Buenas,

me ha surgido una dudilla haciendo un ejercicio básico de MPI, ¿al hacer un broadcast se espera confirmación de recepción por parte del resto procesos?

Código
  1. #include "mpi.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main (int argc, char *argv[]){
  6. int numtasks, taskid, len, buffer, root, count;
  7. char hostname[MPI_MAX_PROCESSOR_NAME];
  8.  
  9. MPI_Init(&argc, &argv);
  10. MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
  11. MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
  12. MPI_Get_processor_name(hostname, &len);
  13.  
  14. printf ("Task %d on %s starting...\n", taskid, hostname);
  15. root = 0;
  16. count = taskid;
  17. if (taskid == root)
  18. buffer = 23;
  19. printf("Root: Number of MPI tasks is: %d\n", numtasks);
  20.  
  21. MPI_Bcast(&buffer, count, MPI_INT, root, MPI_COMM_WORLD);
  22.  
  23. printf("Buffer is %d from task %d\n", buffer, taskid);
  24.  
  25. MPI_Finalize();
  26.  
  27. }
  28.  

La duda me ha surgido porque hay un error en él, que es que el tamaño de lo que se envía es igual al identificador del proceso que lo está ejecutando, y este error produce un interbloqueo. No entiendo por qué pasa esto. El broadcast como tal solo lo va a ejecutar el proceso maestro, así que para el código de arriba el count sería como un 0, lo que estaría mal. La cosa es que si meto un 0 a mano funciona y no entiendo por qué.
Código:
MPI_Bcast(&buffer, 0, MPI_INT, root, MPI_COMM_WORLD);

Solo es en el caso de que count sea taskid, que como repito al ejecutar el maestro sería 0, cuando no funciona.

La única conclusión posible a la que he llegado es que el broadcast espera confirmación de recepción del envío por parte del resto de procesos y al no llegar a recibirlo se produce el interbloqueo, pero no lo sé.

¡Un saludito y gracias!