Меня интересует, есть ли команда или методика в 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
Работа со стандартными потоками ввода / вывода (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.
Других решений пока нет …