Пересылка разнотипных данных
Под сообщением в MPI понимается массив однотипных данных, расположенных в последовательных ячейках памяти. Часто в программах требуются пересылки более сложных объектов данных, состоящих из разнотипных элементов или расположенных не в последовательных ячейках памяти. В этом случае можно либо посылать данные небольшими порциями расположенных подряд элементов одного типа, либо использовать копирование данных перед отсылкой в некоторый промежуточный буфер. Оба варианта являются достаточно неудобными и требуют дополнительных затрат как времени, так и оперативной памяти.
Для пересылки разнотипных данных в MPI предусмотрены два специальных способа:
Производные типы данных
Производные типы данных создаются во время выполнения программы с помощью процедур-конструкторов на основе существующих к моменту вызова конструктора типов данных.
Создание типа данных состоит из двух этапов:
- Конструирование типа.
- Регистрация типа.
После регистрации производный тип данных можно использовать наряду с предопределенными типами в операциях пересылки, в том числе и в коллективных операциях. После завершения работы с производным типом данных его рекомендуется аннулировать. При этом все произведенные на его основе новые типы данных остаются и могут использоваться дальше.
Производный тип данных характеризуется последовательностью базовых типов данных и набором целочисленных значений смещения элементов типа относительно начала буфера обмена. Смещения могут быть как положительными, так и отрицательными, не обязаны различаться, не требуется их упорядоченность. Таким образом, последовательность элементов данных в производном типе может отличаться от последовательности исходного типа, а один элемент данных может встречаться в конструируемом типе многократно.
MPI_TYPE_CONTIGUOUS(COUNT, TYPE, NEWTYPE, IERR) INTEGER COUNT, TYPE, NEWTYPE, IERR
Создание нового типа данных NEWTYPE, состоящего из COUNT последовательно расположенных элементов базового типа данных TYPE. Фактически создаваемый тип данных представляет массив данных базового типа как отдельный объект.
В следующем примере создается новый тип данных newtype, который в дальнейшем (после регистрации типа) может использоваться для пересылки пяти расположенных подряд целых чисел.
call MPI_TYPE_CONTIGUOUS(5, MPI_INTEGER, newtype, ierr) MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR
Создание нового типа данных NEWTYPE, состоящего из COUNT блоков по BLOCKLEN элементов базового типа данных TYPE. Следующий блок начинается через STRIDE элементов базового типа данных после начала предыдущего блока.
В следующем примере создается новый тип данных newtype, который после регистрации может быть использован для пересылки как единого целого шести элементов данных, которые можно представить следующим образом (тип элемента данных, количество элементов данных от начала буфера посылки):
{(MPI_REAL, 0), (MPI_REAL, 1), (MPI_REAL, 2), (MPI_REAL, 5), (MPI_REAL, 6), (MPI_REAL, 7)} count = 2 blocklen = 3 stride = 5 call MPI_TYPE_VECTOR(count, blocklen, stride, & MPI_REAL, newtype, ierr) MPI_TYPE_HVECTOR(COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR) INTEGER COUNT, BLOCKLEN, STRIDE, TYPE, NEWTYPE, IERR