Параллельное программирование в стандарте MPI. Баканов В.М - 32 стр.

UptoLike

Составители: 

- 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 )