ВУЗ:
Составители:
Рубрика:
- 32 -
•
status
- параметры обнаруженного сообщения (возвращаемое значение)
В структуре
status
(тип
MPI_Status
) содержится информация о сообщении –
его идентификатор (поле
MPI_TAG
), идентификатор процесса-отправителя
(поле
MPI_SOURCE
), фактическую длину сообщения можно узнать посредст-
вом вызовов
MPI_Status status;
int count;
MPI_Recv ( ... , MPI_INT, ... , &status );
MPI_Get_count (&status, MPI_INT, &count); /* тип элементов тот же, что у MPI_Recv
теперь в count содержится количество принятых элементов типа
MPI_INT */
Удобно сортировать сообщения с помощью механизма ‘джокеров’; в этом
случае вместо явного указания номера задачи-отправителя используется
‘джокер’
MPI_ANY_SOURCE
(‘принимай от кого угодно’) и
MPI_ANY_TAG
вместо идентификатора получаемого сообщения (‘принимай что угодно’).
Достоинство ‘джокеров’ в том, что приходящие сообщения извлекаются по
мере поступления, а не по мере вызова
MPI_Recv
с нужными идентификато-
рами задач и/или сообщений (что экономит память и увеличивает скорость
работы). Пользоваться ‘джокерами’ рекомендуется с осторожностью, т.к.
возможна ошибка в приеме сообщения ‘не тем’ или ‘не от того’.
При обмене данными в некоторых случаях возможны вызванные взаим-
ной блокировкой т.н. тупиковые ситуации (используются также
термины
‘deadlock’, ‘клинч’); в этом случае функции посылки и приема данных ме-
шают друг другу и обмен не может состояться. Ниже рассмотрена deadlock-
ситуация при использовании для пересылок разделяемой памяти.
Вариант 1.
Ветвь 1 :
Recv
( из ветви 2 )
Send
( в ветвь 2 )
Ветвь 2 :
Recv
( из ветви 1 )
Send
( в ветвь 1 )
Вариант 1 приведет к deadlock’у при любом используемом инструмента-
рии, т.к. функция приема не вернет управления до тех пор, пока не получит
данные; из-за этого функция передачи не может приступить к отправке дан-
ных, поэтому функция приема не вернет управление... и т.д. до бесконечно-
сти
.
Вариант 2.
Ветвь 1 :
Send
( в ветвь 2 )
Recv
( из ветви 2 )
Ветвь 2 :
Send
( в ветвь 1 )
Recv
( из ветви 1 )
- 32 - • status - параметры обнаруженного сообщения (возвращаемое значение) В структуре status (тип MPI_Status) содержится информация о сообщении – его идентификатор (поле MPI_TAG), идентификатор процесса-отправителя (поле MPI_SOURCE), фактическую длину сообщения можно узнать посредст- вом вызовов MPI_Status status; int count; MPI_Recv ( ... , MPI_INT, ... , &status ); MPI_Get_count (&status, MPI_INT, &count); /* тип элементов тот же, что у MPI_Recv теперь в count содержится количество принятых элементов типа MPI_INT */ Удобно сортировать сообщения с помощью механизма ‘джокеров’; в этом случае вместо явного указания номера задачи-отправителя используется ‘джокер’ MPI_ANY_SOURCE (‘принимай от кого угодно’) и MPI_ANY_TAG вместо идентификатора получаемого сообщения (‘принимай что угодно’). Достоинство ‘джокеров’ в том, что приходящие сообщения извлекаются по мере поступления, а не по мере вызова MPI_Recv с нужными идентификато- рами задач и/или сообщений (что экономит память и увеличивает скорость работы). Пользоваться ‘джокерами’ рекомендуется с осторожностью, т.к. возможна ошибка в приеме сообщения ‘не тем’ или ‘не от того’. При обмене данными в некоторых случаях возможны вызванные взаим- ной блокировкой т.н. тупиковые ситуации (используются также термины ‘deadlock’, ‘клинч’); в этом случае функции посылки и приема данных ме- шают друг другу и обмен не может состояться. Ниже рассмотрена deadlock- ситуация при использовании для пересылок разделяемой памяти. Вариант 1. Ветвь 1 : Ветвь 2 : Recv ( из ветви 2 ) Recv ( из ветви 1 ) Send ( в ветвь 2 ) Send ( в ветвь 1 ) Вариант 1 приведет к deadlock’у при любом используемом инструмента- рии, т.к. функция приема не вернет управления до тех пор, пока не получит данные; из-за этого функция передачи не может приступить к отправке дан- ных, поэтому функция приема не вернет управление... и т.д. до бесконечно- сти. Вариант 2. Ветвь 1 : Ветвь 2 : Send ( в ветвь 2 ) Send ( в ветвь 1 ) Recv ( из ветви 2 ) Recv ( из ветви 1 )
Страницы
- « первая
- ‹ предыдущая
- …
- 30
- 31
- 32
- 33
- 34
- …
- следующая ›
- последняя »