Модель реализации использует функции упаковки и распаковки, описанные в
разделе 3.13, и функции неблокируемого обмена из раздела 3.7.
Мы полагаем, что поддерживается круговая очередь ждущих элементов сообщений
(pending message entries (PME)). Каждый входной элемент содержит запрос на
обработку, который идентифицирует ждущую неблокирующую передачу, указатель
на следующий элемент и упакованные данные сообщения. Элементы хранятся в
последовательных ячейках буфера. Свободное пространство доступно между
хвостом и головой очереди.
Вызов буферизованной посылки реализуется исполнением следующего алгоритма:
Пройти последовательно от головы к хвосту очередь PME, удаляя
все завершенные элементы обмена, вплоть до первого элемента с незавершенным
запросом; установить указатель очереди на этот элемент
Вычислить число байтов n, необходимое для элементов нового
сообщения. Верхняя граница для n может быть вычислена следующим
образом: вызов функции MPI_PACK_SIZE (count, datatype,
comm, size) с аргументами count, datatype и comm,
использованными в вызове MPI_BSEND, возвращает верхнюю границу по
сумме пространства, необходимого для буферизации данных сообщения (см.
раздел 3.13). Константа MPI_BSEND_OVERHEAD обеспечивает верхнюю
границу дополнительного пространства, необходимого для элемента (например,
для указателей или атрибутов сообщения).
Найти следующее смежное пустое пространство размером n
байтов в буфере (пространство за хвостом очереди или пространство в начале
буфера, если хвост очереди слишком близок к концу буфера). Если пространство
не найдено, то возникает ошибка переполнения буфера.
Присоединить к концу PME очереди в непрерывном пространстве
новый элемент, который содержит дескриптор запроса, следующий указатель и
упакованные данные сообщения; для упаковки данных используется
MPI_PACK.
Установить неблокирующую посылку (стандартный режим) для
упакованных данных.