«Атомный» призыв к Cout в MPI

Меня интересует, есть ли команда или методика в OpenMPI для атомарного вызова для записи в стандартный вывод (или, в этом отношении, в любой поток).

Что я заметил, так это то, что во время выполнения программ MPI вызовы для записи в cout (или другие потоки) могут сбивать с толку, поскольку каждый процесс может писать всякий раз, когда попадает в определенный раздел кода. При сообщении результатов, строка может быть записана несколькими процессами, что приводит к путанице. Таким образом, 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 (а также, возможно, записи в другие потоки, такие как файловые потоки). Поэтому, когда я начинаю писать a в cout, он блокируется до конца оператора или до тех пор, пока не будет выдан endl или сброс в поток. Если бы это было так, я бы гарантировал, что 2 строки будут отдельными (но, конечно, я все еще не знаю, какая строка будет первой):

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

5

Решение

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

Выполните все свои операции ввода-вывода с cout в процессе с рангом 0. Если вы хотите вывести некоторые данные из других процессов, просто отправьте сообщение MPI с этими данными на ранг 0.

3

Другие решения

Других решений пока нет …

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×