2012-10-10 22 views
6

Tengo un proyecto que requiere 'n' cantidad de procesos para que funcione hasta que se solucione el problema. Cada proceso esclavo ejecuta el mismo código. Cuando surge una determinada condición, el proceso debe notificar a todos los otros procesos de forma no bloqueante. Los otros procesos también necesitan recibir este mensaje de forma no bloqueante.MPI - Transmisión asíncrona/Reúna

¿Hay alguna manera de hacerlo sin enhebrar un bucle separado?

Respuesta

4

Ha pasado un tiempo desde que utilicé MPI. Pero las funciones I no bloquean. Tal vez algo como esto:

int comm_size = comm.Get_size(); 
int comm_rank = comm.Get_rank(); 

int* data = new int[comm_size]; 

while (some_condition) 
{ 
    //During each iteration, check for messages from other nodes 
    for (int node = 0; node < comm_size; node++) 
    { 
     if (node != comm_rank) 
     { 
      if (comm.Iprobe(node, TAG_NUM)) 
      { 
       comm.Irecv(data[node], 1, MPI_INT, node, TAG_NUM); 
      } 
     } 
    } 

    if (some_other_condition) 
    { 
     //Send the message to every node 
     for (int node = 0; node < comm_size; node++) 
     { 
      if (node != comm_rank) 
      { 
       comm.Isend(data[node], 1, MPI_INT, node, TAG_NUM); 
      } 
     } 
    } 

    //do normal work here. 
} 

delete [] data; 
+0

Sí, eso es exactamente lo que terminé haciendo. No considero que esto sea realmente asíncrono, ya que todavía tiene que pasar y enviar todos los mensajes, pero es lo suficientemente bueno para lo que estoy haciendo. Gracias. – xxf8xx

+0

Tengo un problema similar: transmitir datos de forma asíncrona (no es tan importante que los datos en todos los núcleos estén actualizados). Un problema que tengo con la implementación propuesta es que usa mucho ancho de banda: cada mensaje se envía p-1 veces. ¿No es posible (con máscaras de bits o algo así) enviar un mensaje lo más barato posible a través de la red (por ejemplo, si uno está utilizando un interruptor, el interruptor puede hacer la duplicación). Estoy usando MPJ Express. –