Кафедра ЮНЕСКО по НИТ1 Производные типы данных Параллельное программирование
Кафедра ЮНЕСКО по НИТ 2 Ограничение стандартных типов Коммуникационные операции позволяют посылать и получать последовательность элементов одного типа, занимающих смежные области памяти. При разработке параллельных программ иногда возникает потребность передавать данные разных типов (структуры) или данные, расположенные в несмежных областях памяти (части массивов, не образующих непрерывную последовательность элементов) В MPI предоставляются два механизма эффективной пересылки данных: создание производных типов; пересылка упакованных данных.
Кафедра ЮНЕСКО по НИТ 3 Производные типы данных Производные типы данных MPI не являются в полном смысле типами данных Они не могут использоваться ни в каких других операциях, кроме коммуникационных Производный тип MPI представляет собой скрытый объект, который специфицирует две вещи: последовательность базовых типов последовательность смещений
Кафедра ЮНЕСКО по НИТ 4 Сценарий определения и использования производных типов 1. Производный тип строится из предопределенных типов MPI и ранее определенных типов с помощью специальных функций- конструкторов: MPI_Type_contiguous, MPI_Type_vector, MPI_Type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct. 1. Новый производный тип регистрируется вызовом функции MPI_Type_commit. Только после регистрации новый тип можно использовать. 2. Когда производный тип становится ненужным, он уничтожается функцией MPI_Type_free.
Кафедра ЮНЕСКО по НИТ 5 Характеристика любого типа данных в MPI протяженность Протяженность типа определяет, сколько байт переменная данного типа занимает в памяти. Эта величина может быть вычислена как: адрес последней ячейки данных – адрес первой ячейки данных + длина последней ячейки данных. размер Размер типа определяет количество реально передаваемых байт. Эта величина равна сумме длин всех базовых элементов определяемого типа.
Кафедра ЮНЕСКО по НИТ 6 Функция MPI_Type_extent определяет протяженность элемента некоторого типа datatype тип данных int MPI_Type_extent (MPI_Datatype datatype, MPI_Aint *extent) Входные параметры: Выходные параметры: extent протяженность элемента заданного типа
Кафедра ЮНЕСКО по НИТ 7 Функция MPI_Type_size определяет «чистый» размер элемента некоторого типа datatype тип данных int MPI_Type_size (MPI_Datatype datatype, int *size) Входные параметры: Выходные параметры: size размер элемента заданного типа
Кафедра ЮНЕСКО по НИТ 8 Самый простой конструктор типов MPI_Type_contiguous count число элементов базового типа oldtype базовый тип данных int MPI_Type_contiguous (int count, MPI_Datatype oldtype, MPI_Datatype *newtype) Входные параметры: Выходные параметры: newtype новый производный тип данных Создает новый тип, элементы которого состоят из указанного числа элементов базового типа, занимающих смежные области памяти.
Кафедра ЮНЕСКО по НИТ 9 Функция MPI_Type_commit регистрирует созданный производный тип datatype тип данных int MPI_Type_commit (MPI_Datatype *datatype) Входные параметры: Выходные параметры: datatype тип данных Только после регистрации новый тип можно использовать в коммуникационных операциях.
Кафедра ЮНЕСКО по НИТ 10 Функция MPI_Type_free уничтожает описатель производного типа datatype тип данных int MPI_Type_free (MPI_Datatype *datatype) Входные параметры: Выходные параметры: datatype тип данных Созданный производный тип данных обязательно должен быть уничтожен до конца работы параллельной программы
Кафедра ЮНЕСКО по НИТ 11 Функция MPI_Get_elements возвращает число элементов простого типа (базового типа), содержащихся в сообщении status статус сообщения datatype тип элементов сообщения int MPI_Get_elements (MPI_Status *status, MPI_Datatype datatype, int *count) Входные параметры: Выходные параметры: count число элементов простого (базового) типа, содержащихся в сообщении
Кафедра ЮНЕСКО по НИТ 12 Задание 1 На нулевом процессоре задать массив из 10 элементов. Создать новый тип данных и передать исходный массив на первый процессор как один элемент.
Кафедра ЮНЕСКО по НИТ 13 Конструктор типов MPI_Type_vector count число блоков blocklength число элементов базового типа в каждом блоке stride шаг между началами соседних блоков, измеренный числом элементов базового типа oldtype базовый тип данных int MPI_Type_vector (int count, int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype) Входные параметры: Выходные параметры: newtype новый производный тип данных Создает новый тип, элементы которого представляют собой несколько равноудаленных друг от друга блоков из одинакового числа смежных элементов базового типа.
Кафедра ЮНЕСКО по НИТ 14 Конструктор типов MPI_Type_vector
Кафедра ЮНЕСКО по НИТ 15 Конструктор типов MPI_Type_hvector count число блоков blocklength число элементов базового типа в каждом блоке stride шаг между началами соседних блоков в байтах oldtype базовый тип данных int MPI_Type_hvector (int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype, MPI_Datatype *newtype) Входные параметры: Выходные параметры: newtype новый производный тип данных Конструктор типа MPI_Type_hvector расширяет возможности конструктора MPI_Type_vector, позволяя задавать произвольный шаг между началами блоков в байтах.
Кафедра ЮНЕСКО по НИТ 16 Конструктор типов MPI_Type_hvector
Кафедра ЮНЕСКО по НИТ 17 Конструктор типов MPI_Type_indexed count число блоков array_of_b.. массив, содержащий число элементов базового типа в каждом блоке array_of_di. массив смещений каждого блока от начала размещения элемента нового типа (элемент) oldtype базовый тип данных int MPI_Type_indexed (int count, int *array_of_blocklength, int *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype) Входные параметры: Выходные параметры: newtype новый производный тип данных Создает новый тип, элементы которого состоят из произвольных по длине блоков с произвольным смещением блоков от начала размещения элемента.
Кафедра ЮНЕСКО по НИТ 18 Конструктор типов MPI_Type_indexed
Кафедра ЮНЕСКО по НИТ 19 Конструктор типов MPI_Type_hindexed count число блоков array_of_b.. массив, содержащий число элементов базового типа в каждом блоке array_of_di. массив смещений каждого блока от начала размещения элемента нового типа (в байтах) oldtype базовый тип данных int MPI_Type_hindexed (int count, int *array_of_blocklength, MPI_Aint *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype) Входные параметры: Выходные параметры: newtype новый производный тип данных Создает новый тип, элементы которого состоят из произвольных по длине блоков с произвольным смещением блоков от начала размещения элемента.
Кафедра ЮНЕСКО по НИТ 20 Конструктор типов MPI_Type_hindexed
Кафедра ЮНЕСКО по НИТ 21 Конструктор типов MPI_Type_struct count число блоков array_of_b.. массив, содержащий число элементов базового типа в каждом блоке array_of_di. массив смещений каждого блока от начала размещения элемента нового типа в байтах array_of_ty. массив, содержащий тип элементов в каждом блоке int MPI_Type_struct (int count, int *array_of_blocklength, MPI_Aint *array_of_displacements, MPI_Datatype *array_of_types, MPI_Datatype *newtype) Входные параметры: Выходные параметры: newtype новый производный тип данных
Кафедра ЮНЕСКО по НИТ 22 Конструктор типов MPI_Type_struct
Кафедра ЮНЕСКО по НИТ 23 Задание rank = 0rank = 1 send