2013-04-09 2 views
5

Меня интересует, есть ли в OpenMPI команда или техника, чтобы иметь атомный вызов для записи в stdout (или, если на то пошло, любой поток).«Атомный» вызов cout в MPI

Что я заметил, так это то, что во время выполнения программ MPI вызовы write to cout (или другие потоки) могут запутаться, так как каждый proc может писать каждый раз, когда попадает в определенный раздел кода. При представлении результатов строка может быть записана несколькими процедурами, что путает проблему. Таким образом, 2 различных прок может сделать что-то вроде этого:

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

и:

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

Но результат может быть:

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

Что я ищу что-то вроде " блокировка "или атомный cout (а также, возможно, запись в другие потоки, такие как потоки файлов). Поэтому, как только я начинаю писать cout, он блокируется до конца инструкции или до тех пор, пока не будет выпущен endl или flush в поток. Если бы это было так, я бы гарантирован, что 2 линия будет отдельной (но, конечно, я до сих пор не знаю, какая линия придет первым):

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

Два разных ПРОЦЕССА или ВТОРОЙ поток? –

+0

Я спрашивал о двух разных процессах. –

+0

Запуск на той же машине или на разных машинах? –

ответ

3

Работу со стандартом I/O потоки (stdout и stdin в терминах языка C или cout и cin на C++) - не лучшая часть MPI (OpenMPI реализует MPI). Есть несколько слайдов об этом: http://www.csee.wvu.edu/~donm/classes/cs591x/notes/io1.ppt и Slide 10 имеет решение. (или chapter 8.1 книги «Параллельное программирование с использованием MPI По PS Пачеко»)

Все ли ваши I/O с соиЬ в процессе с рангом 0. Если вы хотите вывести некоторые данные из других процессов, просто послать MPI Сообщение с этими данными для ранжирования 0.