Ответ 1
Вы правильно поняли. В стандарте MPI не указывается, как собирать stdout из разных узлов для печати в процессе создания. Часто бывает, что при выполнении несколькими процессами печати выходные данные будут объединены неопределенным способом. fflush
не помогает.
Если вы хотите, чтобы результат упорядочивался определенным образом, самый переносимый метод должен был отправить данные в главный процесс для печати.
Например, в псевдокоде:
if (rank == 0) {
print_col(0);
for (i = 1; i < comm_size; i++) {
MPI_Recv(buffer, .... i, ...);
print_col(i);
}
} else {
MPI_Send(data, ..., 0, ...);
}
Другим методом, который может иногда работать, является использование барриков для блокировки шагов, чтобы каждый процесс печатал по очереди. Это, конечно, зависит от реализации MPI и того, как она обрабатывает stdout.
for(i = 0; i < comm_size; i++) {
MPI_Barrier(MPI_COMM_WORLD);
if (i == rank) {
printf(...);
}
}
Конечно, в производственном коде, где данные слишком велики, чтобы печатать разумно в любом случае, данные в конечном итоге объединяются, когда каждый процесс записывается в отдельный файл и объединяется отдельно или с помощью MPI I/O (определенные в стандартах MPI2) для координации параллельной записи.