MPI-printf

alexkravchuk

Понадобилось сделать примеры для иллюстрации механизмов синхронизации в MPI (реализация LAM столкнулся с такой проблемой:
допустим, есть 2 процесса, нам нужно, чтобы процесс с id=1 печатал что-то перед тем, как напечатает процесс с id=2. Однако возникают проблемы, пример вроде
if(my_id==1)
{
printf("first message\n");
fflush(NULL);
MPI_Send(&data,1,MPI_INT,2,1000,MPI_COMM_WORLD);
}
if(my_id==2)
{
MPI_Recv(&data,1,MPI_INT,1,1000,MPI_COMM_WORLD);
printf("second message\n");
fflush(NULL);
}

работает иногда некорректно, хотя по логике верен (работает некорректно, но только если запускать на раздельных узлах). Причина, по всей видимости, в том, что fflush не даёт гарантию, что сообщение будет напечатано, оно только пересылает это сообщение на узел, отвечающим за вывод (предположение). Есть ли какой-нибудь простой способ с этим бороться, какая-нибудь опция компилятора? Какой-то идеи, как реализовать какой-нибудь свой вывод, аналогичный printf (но с гарантированной синхронизацией) пока не придумывается...

yolki

где-то краем уха слышал, что печатать должен только один процесс. необязательно первый. некоторый для этого специальный запускают - типа "reader/writer" и т.п.

Olenenok

у меня работало с fflush (stdout);

tamusyav

fflush(NULL);
Мне почему-то кажется, что эта инструкция ничего не делает...

Olenenok

man fflush
она очищает все буферы

rjirf

Во первых для простой синхронизации есть MPI_Barrier
Во вторых (если уж используется MPI_Send, MPI_Recv) просто пошли основному процессу сообщение которое должно напечататься первым, пусть он его первым и напечатает

oleg_n

я полагаю, что fflush никуда ничего не отсылает
оно лишь сбрасывает буфер
после чего сообщение оказывается где-нибудь нутрах реализации mpi
но всё ещё на том узле, который сгенерировал сообщение
потом эта реализация mpi в какой-то момент может решить, что пора переслать эту информацию на нулевой узел
(решить она это может только через несколько секунд или минут после генерации сообщения)
только потом сообщение напечатается
в контексте высокопроизводительных параллельных вычислений другая схема работы mpi видится мне не логичной
Оставить комментарий
Имя или ник:
Комментарий: