Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОСЫ / Parallelnoe_programmirovanie.doc
Скачиваний:
99
Добавлен:
15.02.2016
Размер:
274 Кб
Скачать
☆

7. Типы данных mpi. Понятие производных типов данных mpi. Конструкторы производных типов данных.

При выполнении операций передачи сообщений в функциях MPI необходимо указывать тип пересылаемых данных. MPI содержит большой набор базовых типов, во многом совпадающих с типами данных в алгоритмических языках C и Fortran. Аналогично именам функций, имена типов данных имеют префикс MPI_ , далее следует имя типа, например, MPI_INT, MPI_DOUBLE, MPI_CHAR и т.д. Все типы данных MPI определены на основе базовых типов соответствующего языка (С или Fortran), что обеспечивает их машино-независимость. Широко используемый в алгоритмических языках высокого уровня механизм преобразование типов в стандарте MPI не предусмотрен. Однако создать новый (производный) тип можно, используя ряд конструкторов. Наличие механизма создания производных типов позволяет повысить эффективность параллельных программ путем оптимизации работы с памятью при выполнении обменных операций.

Операции обмена MPI используют только непрерывный буфер, содержащий последовательности элементов одного типа. Однако часто возникает необходимость передавать сообщения, которые содержат значения различных типов или посылать несмежные данные. Один из способов передачи таких данных – это упаковать разные по типу данные в один буфер на стороне отправителя и распаковать обратно на стороне получателя сообщения. MPI содержит функции упаковки и распаковки данных: MPI_Pack и MPI_Unpack. Однако это не эффективно, поскольку требуется дополнительная операция копирования из памяти в память на передающем и принимающем процессах. Другой, более оптимальный способ - создание производных типов данных. Такой механизм, позволяет передавать данные различной структуры и размера, выполняя их чтение или запись непосредственно из указанных ячеек оперативной памяти, без предварительного копирования в непрерывную область. Аналогично тому, как создаются производные типы данных в Си, производные типы данных MPI, конструируются с использованием специальных конструкторов из базовых типов, либо из ранее созданных типов данных. Конструкторы типов создают шаблон, по которому данные будут читаться из памяти для выполнения передачи или записываться в память, при выполнении приема начиная с некоторого указанного адреса.

Описываемые значения не обязательно непрерывно располагаются в памяти. Задание типа данных в MPI выполняется созданием карты типа (type map) в виде последовательности базовых типов данных и смещения адреса относительно некоторого начального базового адреса, т.е.

Часть карты типа с указанием только типов значений называется сигнатурой типа:

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

double a; /* адрес 24 */

double b; /* адрес 40 */

int n; /* адрес 48 */

Тогда производный тип для описания данных такой структуры должен иметь карту типа следующего вида: { (MPI_DOUBLE,0), (MPI_DOUBLE,16), (MPI_INT,24) }

double b, начинается с адреса 40, смещение от 24 до 40 равно 16, между элементами a и b - 8

int c, начинается с адреса 48, смещение от 24 до 48 равно 24, между элементами b и c - 0 , т.к. адрес памяти после элемента b равен 40+8, где 8 = sizeof(double) .

Для типов данных в MPI определены следующие понятия:

- нижняя граница типа

- верхняя граница типа

- протяженность типа extent(TypeMap) = ub(TypeMap)-lb(TypeMap).

Нижняя граница – это минимальное смещение до первого байта в карте типа.

Верхняя граница – это максимальная величина сумм смещений и байтового размера типа. При этом величина смещения для верхней границы может быть округлена вверх с учетом требований выравнивания адресов (значение ∆).

Протяженность– это количество байт, которое необходимо выделить для одного элемента производного типа.

Размер типа данных - это число байтов, которые занимают в памяти данные, равно разности адресов последнего и первого байтов данных. Отсюда - различие в значениях протяженности и размера, которое зависит от величины округления при выравнивании адресов. Так, в рассматриваемом примере размер типа равен 28, а протяженность – 32 (предполагается, что тип int занимает 4 байта и установлено выравнивание адресов на 8 ).

В MPI предусмотрено несколько способов (конструкторов) создания производных типов:

  1. Непрерывный конструктор - позволяет определить непрерывный набор элементов существующего типа как новый производный тип. Тип базовых элементов для создания нового должен быть одинаковым.

  2. Векторный конструктор - обеспечивает создание нового типа данных как набора элементов существующего типа, между элементами которого существуют регулярные промежутки по памяти, при отсутствии промежутков, значение смещения равно 0. Для векторного конструктора размер промежутков задается в числе элементов исходного типа, в варианте H-векторного конструктора этот размер указывается в байтах. Тип базовых элементов должен быть одинаковым.

  3. Индексный конструктор - отличается от векторного тем, что промежутки между элементами исходного типа могут иметь нерегулярный характер (между базовыми элементами могут быть промежутки различной величины), поэтому числовые значения смещения каждого элемента нового типа данных задается массивом, размер которого равен количеству элементов, образующих новый тип. Тип базовых элементов для создания нового должен быть одинаковым.

  4. Структурный конструктор - обеспечивает общее описание производного типа через явное указание карты производного типа, с указанием количества элементов, смещения до начала каждого и типа каждого элемента. Тип базовых элементов для создания нового может быть разным. Этот конструктор лучше всего подходит для передачи структур в понимании языка Си, с различными по типу и размеру элементами.