2013-04-09 67 views
5

Interesuje mnie, czy w OpenMPI istnieje polecenie lub technika, aby wywołać atomowe wywołanie do stdout (lub, o ile to możliwe, dowolnego strumienia)."Atomowe" wołanie do cout w MPI

Zauważyłem, że podczas wykonywania programów MPI wywołania zapisu do cout (lub innych strumieni) mogą stać się mylące, ponieważ każdy proces może pisać za każdym razem, gdy dotrze do pewnej sekcji kodu. Podczas raportowania wyników, do kilku wierszy może być zapisana linia, co wprowadza zamieszanie. Więc 2 różne procuje może zrobić coś takiego:

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

oraz:

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

Ale wynik może być:

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

Co szukam jest coś jak " blocking "lub atomic cout (jak również możliwe zapisywanie do innych strumieni, takich jak strumienie plików). Tak więc, gdy zacznę pisać do cout, blokuje się do końca instrukcji lub do momentu wydania endla lub wypuszczenia go do strumienia. Jeśli tak było, to bym być zagwarantowane, że 2 linie byłyby oddzielne (ale, oczywiście, ja wciąż nie wiem, która linia będzie na pierwszym miejscu):

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

Dwa różne PROCESY lub DWIE wątki? –

+0

Pytałem o 2 różne procesy. –

+0

Działa na tej samej maszynie lub na różnych maszynach? –

Odpowiedz

3

Praca ze standardem I/O strumienie (stdout i stdin w kategoriach języka C lub cout i cin w C++) nie są najlepszą częścią MPI (implementacji MPI OpenMPI). Istnieje kilka slajdów na ten temat: http://www.csee.wvu.edu/~donm/classes/cs591x/notes/io1.ppt i Slide 10 ma rozwiązanie. (lub chapter 8.1 książki "Programowanie równoległe z Mpi" PS Pacheco ")

Wykonaj wszystkie operacje wejścia/wyjścia z coutą w procesie o pozycji 0. Jeśli chcesz wyprowadzić dane z innych procesów, po prostu wyślij MPI wiadomość z tymi danymi do pozycji 0.