2012-10-10 20 views
6

Ho un progetto che richiede il numero "n" di processi per funzionare finché il problema non viene risolto. Ogni processo slave esegue lo stesso codice. Quando si verifica una determinata condizione, il processo deve notificare tutti gli altri processi in modo non bloccante. Anche gli altri processi devono ricevere questo messaggio in modo non bloccante.MPI - Broadcast/Raccoglitore asincrono

C'è un modo per fare senza inserire un ciclo separato?

risposta

4

È da un po 'che non uso MPI. Ma le funzioni I non sono bloccanti. Forse qualcosa di simile:

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ì, è esattamente quello che ho finito per fare. Non considero questo veramente asincrono dal momento che deve ancora scorrere e inviare tutti i messaggi, ma è abbastanza buono per quello che sto facendo. Grazie. – xxf8xx

+0

Sto riscontrando un problema simile: trasmissione di dati in modo asincrono (non è importante che i dati di tutti i core siano aggiornati). Un problema che ho con l'implementazione proposta è che utilizza molta larghezza di banda: ogni messaggio viene inviato p-1 volte. Non è il loro modo (con maschere di bit o qualcosa del genere), per inviare un messaggio il più economico possibile sulla rete (ad esempio se si usa uno switch, l'interruttore può eseguire il lavoro di duplicazione). Sto usando MPJ Express. –