Здавалка
Главная | Обратная связь

Присоединение и отсоединение буфера



Максимальный размер пересылаемого сообщения в MPICH 1.2.7 равен 500 элементам типа double, т.е. 4000 байт. Однако мы можем переопределить буфер для буферизации сообщений. Т.к. буферизация производиться передающим процессом, то создавать буфер можно только на процессе-передатчике.

int MPI_Buffer_attach( void* buffer, int size) присоединяет буфер,

созданный в памяти, который будет использоваться для буферизации выходящих сообщений. Только один буфер может быть присоединен к процессу одновременно.

IN buffer адрес начала буфера
IN size размер буфера в байтах

int MPI_Buffer_detach( void* buffer, int* size) отсоединяет буфер.

Вызов возвращает адрес и размер отсоединенного буфера. Эта операция будет заблокирована до тех пор, пока все буферизованные сообщения не будут переданы. По возвращении из этой функции пользователь может использовать или освободить место, занимаемое буфером.

  1. Синхронный режим передачи

Функции передачи/приема MPI_Ssend(….)и MPI_Recv(…..), параметры те же. В этом режиме операция передачи может стартовать независимо от того, выставлена соответствующая операция приема или нет. Однако передача будет завершена, только если соответствующая операция приема выставлена, и начала получать сообщение.

  1. Режим по готовности

Функции передачи/приема MPI_Rsend(….)и MPI_Recv(…..), параметры те же. В этом режиме операция передачи может стартовать, только если выставлена соответствующая операция приема. В противном случае, произойдет ошибка. Завершение операции передачи не зависит от состояния соответствующей операции приема, и означает только, что буфер передатчика может быть использован.

Возможные варианты несоответствия размеров передаваемых и принимаемых сообщений.

1) Размер сообщения меньше равен, размеру приемного буфера – нет ошибки,в приемном буфереизменятся только элементы, соответствующие размеру пришедшего сообщения/размер типа данных в байтах (или count)

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

В качестве номера процесса-отправителя можно указать предопределенную константу MPI_ANY_SOURCE - признак того, что подходит сообщение от любого процесса. В качестве идентификатора принимаемого сообщения можно указать константу MPI_ANY_TAG - признак того, что подходит сообщение с любым идентификатором.

По практическому использованию режимов можно привести следующие рекомендации:

1. Режим передачи по готовности формально является наиболее быстрым, но используется достаточно редко, т.к. обычно сложно гарантировать готовность операции приема,

2. Стандартный и буферизованный режимы также выполняются достаточно быстро, но могут приводить к большим расходам ресурсов памяти,

3. Синхронный режим является наиболее медленным, т.к. требует подтверждения приема. В тоже время, этот режим наиболее надежен.

 

 

Лекция 3







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.