2010-11-01 3 views
1

Рассмотрим конфигурацию, чтобы бытьВ передачи сообщений (MPI) MPI_Send и ПРИЕМ "что ждет"

Первое:

Не буферном, блокирование (синхронно)

Как я понимаю MPI является API, поэтому, когда мы выполняем вызов функции блокировки , функция/программа отправителя блокируется?

ИЛИ

ли функция mpi_send API MPI блокируются, так что программа может продолжать свою работу до отправки сообщения?

Второе:

Подобное замешательство, делает mpi_recv блокированы или функцию, откуда она называлась блокируется?

Причина такой глупый вопрос:

Это параллельная обработка, так почему бы кто-то сделать что-то, что будет блокировать процесс, который хочет некоторую информацию?

Другая причина:

Вполне возможно, что когда mpi_send вызывается процессом, никакой другой процесс не может использовать функцию mpi_send, потому что это работает ?!

ответ

8

Во-первых: Да, вызывающая программа «заблокирована», потому что вызов MPI_Send не вернется, пока сообщение не будет отправлено.

Во-вторых: MPI_Recv также является «блокирующим» вызовом и не будет возвращаться до тех пор, пока сообщение не будет «получено».

Некоторая дополнительная информация:

MPI_Send является «блокирование» вызов, потому что вызов не возвращает управление вызывающему, пока сообщение не было отправлено. И определение «отправлено» заключается в том, что пользовательский буфер, содержащий сообщение, можно безопасно повторно использовать. Нет гарантии, что сообщение получено, или даже что вызов MPI_Recv достигнут в удаленном ранге. (Точное поведение зависит от реализации. Соединители стиля RDMA вызывают большинство проблем с поведением «внутри черного ящика».)

MPI_Isend - это «неблокирующий» вызов. Control вернется к вызывающей программе «мгновенно» ... но буфер не может быть повторно использован до тех пор, пока программа не вызовет MPI_Test или MPI_Wait, чтобы подтвердить, что сообщение было отправлено.

Назначение «блокирующих» вызовов - предоставить положительное подтверждение вызывающей программе, что буфер, содержащий сообщение, может повторно использоваться (в случае MPI_Send) или надежно читать и изменять (в случае MPI_Recv) , Если используется «неблокирующий» (например, MPI_Isend, MPI_Irecv) вызов, вызывающая программа может продолжать выполнять вычисления, но не может надежно (или юридически) изменять буфер сообщений до тех пор, пока не вызовет MPI_Wait или MPI_Test для завершения транзакции сообщения.

3

Ответ на ваш последний вопрос: нет. Некоторые процессы могут быть заблокированы в ожидании завершения отправки или получения при выполнении других процессов.Блокировка блокирует блокировку только для процесса, который их вызывает.

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