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