2012-07-04 2 views
-1

Я пытаюсь передать два разных процесса с использованием MPI (MPMD-связи). Один из них использует GLUT для отображения некоторых данных, которые генерируются на основе данных, отправленных другим процессом.Glut + MPI_Send, фактически не блокирует

Моя проблема заключается в том, что на этапе инициализации «потребитель» (тот, кто использует GLUT) отправляет определенные данные конфигурации «продюсеру», но кажется, что вызовы MPI_Send не блокируются. Например, я отправляю 4 разных сообщения от потребителя производителю, каждый из которых имеет другой тег. Кажется, все работает нормально. Затем я комментирую первый MPI_Send, не изменяя код другого процесса (это означает, что ни один из них не должен превышать первые MPI_Send и MPI_Recv, соответственно). Проблема заключается в том, что отправитель отправляет все три сообщения, и кажется, что каждый MPI_Send возвращает MPI_SUCCESS, поскольку тесты, которые я выполняю после каждого сообщения печати MPI_Send, соответствуют правильной эволюции. Между тем, приемник не прогрессирует.

Я попытался воспроизвести это поведение в более простых приложениях, без GLUT, и они сработали. Но в то же время я не вижу причин, по которым GLUT вызывает эти проблемы. Есть ли у вас предложения?

Заранее спасибо.

ответ

1

Я только что узнал, что MPI_Send не гарантирует блокировку, как указано в 1, поэтому, чтобы получить желаемое поведение, я должен использовать MPI_Ssend.

+0

Вы ошибаетесь _synchronous behaviour_ с _blocking_. –

1

Вы неправильно поняли семантику блокирующего режима отправки MPI. Блокировка здесь означает, что рабочий блок до тех пор, пока данные сообщения и его огибающая не будут безопасно сохранены и буфер данных свободен для изменения. Напротив, неблокирует операции (MPI_I...) сразу же, но требует, чтобы вы не изменяли буфер данных во время выполнения операции.

MPI_Send - стандартная операция блокировки отправки. Он может быть реализован как синхронный блокировка отправки (MPI_Ssend), который не возвращается до тех пор, пока не будет запущена операция приема или не выполнена. буферизированный блокировка отправки (аналогично MPI_Bsend), которая копирует данные сообщений в небольшой внутренний буфер и возвращает обратно управление , Стандартом не определено, как точно реализуется стандартная отправка. Большинство реализаций содержат несколько коротких сообщений.

 Смежные вопросы

  • Нет связанных вопросов^_^