обратный датчик MPI

Есть ли способ проверить, ожидают ли некоторые процессы MPI_Recv?

У меня есть корневой процесс и несколько подчиненных процессов.

Ведомый псевдокод:

while (1) {
    do_some_stuff; // calls MPI_Test and clear unused buffers
    MPI_Recv(buf, ...);
    do_something_with_buf;
    MPI_Isend(buf2, ...); // possibly many sends depending on what was in buf
}

Если все подчиненные процессы зависают на MPI_Recv, то работа выполнена и мне нужно остановить цикл. Теперь мне нужен какой-то способ уведомить подчиненные процессы о том, что работа выполнена. Есть какой-либо способ сделать это? Я подумал, что может быть что-то вроде обратного зонда, чтобы проверить, ждет ли кто-нибудь сообщения, вместо того, чтобы проверять, есть ли сообщение для получения. Ничего полезного пока не нашел.

Изменить: еще одно объяснение.

У меня есть один корневой процесс, который читает огромный файл и отправляет прочитанные данные рабочим (остальным процессам). Каждый работник получает часть данных, поэтому они хорошо распределяются (у каждого работника хранится примерно одинаковое количество данных). Затем эти рабочие начинают общаться друг с другом, отправляя частичные вычисления. Когда рабочий процесс получает частичное вычисление, он может произвести много новых частичных результатов, некоторые из которых необходимо отправить другим работам. Работа сделана, когда всем работникам нечего делать и больше нет частичных результатов, ожидающих получения.


person Borys Popławski    schedule 13.06.2015    source источник
comment
когда работа будет завершена, корень может послать всем специальное стоп-сообщение, и если они будут завершены, он отправит готовое сообщение корневому и снова дождется ответа, когда корень получит, что все закончено, он отправит окончательное завершение всем, кто использует все может разорвать петлю.   -  person cruxion effux    schedule 13.06.2015
comment
Проблема в том, что отдельный процесс не знает, завершился ли он. Работа сделана, если всем подчиненным процессам больше нечего отправлять (т.е. они все зависают на recv). У меня была идея, но некоторые отправляют до и после recv, чтобы уведомить root о том, что процесс ожидает сообщения (и что он что-то получил), и если все процессы ждут, то отправить сообщение об остановке всем. Но этот подход делает много сообщений от и к root, что кажется очень неэффективным.   -  person Borys Popławski    schedule 13.06.2015
comment
Polawski Если ведомое устройство не знает, что оно закончилось, оно ничего не может сделать, чтобы предупредить корень и других. Правильно ? Так что единственный оставшийся вариант - отправить что-то с сервера и проверить? Но скажем, когда сервер отправит на проверку (или остановит), они могут быть не закончены, и, таким образом, остановка приведет к их смерти, не закончив работу? Так что я думаю, что в обоих направлениях мы заблокированы?   -  person cruxion effux    schedule 13.06.2015
comment
Да, ваш подход может вызывать связь, но это важно, если вам нужна синхронизация, предполагается, что подчиненные устройства или процессы в MPI работают отдельно, и нет общей памяти и других вещей, которые помогут нам узнать статус других процессов, и, таким образом, связь единственный способ .   -  person cruxion effux    schedule 13.06.2015
comment
Да, ведомые процессы не могут предупредить root о том, что они завершились, но root может их оповестить. Вот и вся проблема: как root узнает, что все сделано? Единственный ответ, который я нашел, - проверить, все ли процессы ожидают сообщений (в этом случае все отправленные данные были обработаны).   -  person Borys Popławski    schedule 13.06.2015


Ответы (1)


Вы должны быть в состоянии избежать ситуации, когда ожидается получение, но ничего не отправлено. Процессор-отправитель в ситуациях типа master-slave всегда должен отслеживать, сколько работы нужно отправить. Обычно эта стратегия главного ведомого будет работать, когда мастер отслеживает и убивает ведомых, когда общее количество достигнуто...

С точки зрения функций ближайшим эквивалентом проверки на стороне отправки может быть использование неблокирующей отправки MPI_isend, которая возвращает status, который может быть передан чему-то вроде MPI_test, который является неблокирующим и возвращает MPI_SUCCESS для сообщение успешно получено. Вы также можете использовать MPI_Wait со статусом, если хотите заблокировать код отправки до тех пор, пока сообщение не будет получено. Использование test/wait с уникальными тегами для каждой отправки в каждый процесс будет способом выполнить то, что вы хотите.

person Ed Smith    schedule 13.06.2015
comment
Дело в том, что я хочу знать, ждут ли некоторые рабочие сообщения, а не было ли сообщение получено (это я знаю и использую для освобождения буферов), и мне нужно проверить его в корневом процессе, который ничего не делает, кроме чтения данных и сбора результатов . Добавлено больше пояснений к исходному сообщению. - person Borys Popławski; 13.06.2015