2013-04-09 20 views
5

Mi interessa sapere se esiste un comando o una tecnica all'interno di OpenMPI per avere una chiamata atomica per scrivere su stdout (o, per altro, qualsiasi flusso).Una chiamata "atomica" al cout in MPI

Quello che ho notato è che durante l'esecuzione dei programmi MPI, le chiamate per scrivere su cout (o altri flussi) possono diventare confuse, poiché ogni proc può scrivere ogni volta che arriva a una determinata sezione di codice. Quando si riportano i risultati, una riga può essere scritta da diversi procs, confondendo il problema. Quindi 2 procs diversi potrebbe fare qualcosa di simile:

//Proc 10 - results calculated somewhere above 
// result1 = 10 
// result2 = 11 
cout << "My results are: " << result1 << " " << resul2 << endl; 

e:

//Proc 20 - results calculated somewhere above 
// result1 = 20 
// result2 = 21 
cout << "My results are: " << result1 << " " << resul2 << endl; 

Ma il risultato potrebbe essere:

My results are: 20 My results are: 10 11 21 

Quello che sto cercando è qualcosa di simile a una " blocco "o cout atomico (oltre che possibilmente scrivere in altri flussi, come i flussi di file). Quindi, una volta che comincio a scrivere un to cout, esso blocca fino alla fine dell'istruzione, o finché non viene emesso un endl o un flush allo stream. Se questo fosse il caso, mi piacerebbe essere garantito che le 2 linee sarebbero separati (ma, ovviamente, ancora non saprei quale linea sarebbe venuto prima):

My results are: 20 21 
My results are: 10 11 
+0

Due diversi PROCESSI o due thread? –

+0

Mi stavo chiedendo di 2 diversi processi. –

+0

In esecuzione sulla stessa macchina o su macchine diverse? –

risposta

3

Lavorare con I/O standard i flussi (stdout e stdin in termini di linguaggio C o cout e cin in C++) non sono la parte migliore di MPI (OpenMPI implements MPI). Ci sono alcune diapositive su questo: http://www.csee.wvu.edu/~donm/classes/cs591x/notes/io1.ppt e Slide 10 ha una soluzione. (o chapter 8.1 del libro "Programmazione parallelo con Mpi da PS Pacheco")

fare tutto il vostro I/O con cout nel processo con rango 0. Se si desidera attivare alcuni dati da altri processi, basta inviare MPI messaggio con questi dati al valore 0.