next up previous contents
Next: Модель реализации буферного режима Up: Парные межпроцессные обмены Previous: Семантика парного обмена между   Contents

Распределение и использование буферов

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

Синтаксис функции MPI_BUFFER_ATTACH представлен ниже.

MPI_BUFFER_ATTACH (buffer, size)

IN buffer начальный адрес буфера (альтернатива)
IN size размер буфера, в байтах (целое)

int MPI_Buffer_attach (void* buffer, int size) MPI_BUFFER_ATTACH (BUFFER, SIZE, IERROR) <type> BUFFER(*) INTEGER SIZE, IERROR void MPI::Attach_buffer(void* buffer, int size)

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

Синтаксис функции MPI_BUFFER_DETACH представлен ниже.

MPI_BUFFER_DETACH(buffer_addr, size)

OUT buffer_addr Начальный адрес буфера (альтернатива)
OUT size Размер буфера, в байтах (целое)

int MPI_Buffer_detach(void* buffer_addr, int* size) MPI_BUFFER_DETACH(BUFFER_ADDR, SIZE, IERROR) <type> BUFFER_ADDR(*) INTEGER SIZE, IERROR int MPI :: Detach_buffer (void*& buffer)

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

Пример 3.10 Обращения к функциям подключения и отключения буферов.

#define BUFFSIZE 10000 int size char *buff; MPI_Buffer_attach(malloc(BUFFSIZE), BUFFSIZE); /* буфер на 10000 байтов может теперь быть использован MPI_Bsend */ MPI_Buffer_detach(&buff, &size); /* размер буфера уменьшен до нуля */ MPI_Buffer_attach(buff, size); /* буфер на 10000 байтов доступен снова */

Совет пользователям: Хотя для языка Си функции MPI_Buffer_attach и MPI_Buffer_detach имеют для первого аргумента тип void*, эти аргументы используются различно: при вызове MPI_Buffer_attach передается указатель (pointer) на буфер; а при вызове MPI_Buffer_detach - адрес указателя на буфер, так что этот вызов может возвращать значение указателя.[]

Объяснение: Оба аргумента определены типом void* (а не void* и void** соответственно), чтобы избежать сложностей приведения типов. Например, в последнем примере &buff, который имеет тип char**, может быть передан как аргумент MPI_Buffer_detach без приведения типов. Если формальный параметр имеет тип void**, тогда было бы нужно выполнить приведение типов перед и после вызова.[]

Утверждения, сделанные в этом разделе, описывают поведение MPI для буферизованного режима посылок. Если никакого буфера не подключено, то MPI ведет себя, как если бы с процессом был связан буфер нулевого размера.

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

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

Объяснение: Имеется широкий спектр возможных реализаций буферизуемых обменов: буферизация может быть реализована на стороне отправителя, на стороне получателя или на обеих сторонах; буферы могут быть предназначены одной приемо-передающей паре или разделяться всеми обменами; буферизация может быть сделана в реальной или виртуальной памяти; она может использовать специально выделенную память или память, разделяемую другими процессами; буферное пространство может быть выделено статически или изменяться динамически; и так далее. Поэтому не очевидна возможность обеспечить переносимый механизм для управления очередностью и буферизацией, который был бы совместим со всеми этими вариантами.[]



Subsections

Alex Otwagin 2002-12-10