Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ГОСЫ / Paral_programirovanie_otvety_3vopros

.pdf
Скачиваний:
182
Добавлен:
15.02.2016
Размер:
717.98 Кб
Скачать

{ (MPI_DOUBLE,0),

(MPI_DOUBLE,16), (смещение 16 определяется как разность значений адресов 40-24) (MPI_INT,24) }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

double a, начина-

 

double b, начинается с

 

int c, начинается с адреса 48,

 

 

ется с адреса 24

 

адреса 40, смещение от

 

смещение от 24 до 48 равно

 

 

смещение 0

 

24 до 40 равно 16, между

 

24, между элементами b и c -

 

 

 

 

элементами a и b - 8

 

0 , т.к. адрес памяти после

 

 

 

 

 

 

 

 

элемента b равен 40+8, где 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

= sizeof(double) .

 

 

 

 

 

 

 

 

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

понятий:

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

- протяженность типа

 

extent(TypeMap) = ub(TypeMap)-lb(TypeMap).

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

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

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

рассматриваемом примере размер типа равен 28, а протяженность – 32 (предполагается, что тип int занимает четыре байта).

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

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

51

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

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

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

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

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

Например:

Используя конструктор MPI_Type_indexed, создать тип данных, включающий только нижнюю треугольную часть матрицы+главную диагональ.

MPI_Type_indexed (count, array_of_blocklengths, array_of_displacements, oldtype, newtype), где

сount - число блоков,

array_of_blocklengths - число элементов в каждом блоке (массив длиной count),

array_of_displacements - смещение каждого блока (массив длиной count),

oldtype - старый тип данных, newtype - новый тип данных.

сount = 8; - 8 строк матрицы

array_of_blocklengths[8]={1,2,3,4,5,6,7,8}; - длина строк нижней треугольной матрицы

array_of_displacements [8]={0,8,16,24,32,40,48,56}; - смещение от начала матрицы до каждой следующей строки в элементах строк матрицы

oldtype = MPI_DOUBLE, newtype = &my_type – дескриптор нового типа данных

52

9. Управление группами процессов и коммуникаторами. Конструирование групп и коммуникаторов.

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

Группа. Группу определяет упорядоченный набор процессов. Каждый процесс при инициировании получает целочисленный номер, по которому он однозначно идентифицируется. Нумерация является непрерывной и начинается с нуля.

Группы процессов определяют область для парных и коллективных обменов. В MPI новые группы могут конструироваться на базе имеющихся и отдельно от коммуникаторов, но для выполнения операций обмена созданная группа должна быть объединена коммуникатором.

Коммуникаторы создают область для всех операций обмена в MPI. Коммуникаторы разделяются на два вида: интра-коммуникаторы (внутригрупповые коммуникаторы),

предназначенные для операций в пределах отдельной группы процессов, и интер-

коммуникаторы (межгрупповые коммуникаторы), предназначенные только для выполнения двухточечных обменов между процессами двух различных групп.

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

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

область коммуникации и обеспечивает машинно-независимую адресацию процессов их номерами. Начальный для всех процессов интра-коммуникатор - MPI_COMM_WORLD,

создается автоматически при обращении к функции MPI_INIT. Кроме того, существует коммуникатор MPI_COMM_SELF, который содержит только себя как процесс.

Предопределенная константа MPI_COMM_NULL определяет значение, используемое для неверных дескрипторов коммуникатора.

Все реализации MPI должны обеспечить наличие коммуникатора MPI_COMM_WORLD.

Он не может быть удален. Группа, соответствующая этому коммуникатору, не является предопределенной, поскольку определяется в момент запуска параллельной программы.

53

Операции управления группами являются локальными, их выполнение не требует межпроцессорных обменов.

MPI не имеет механизма для формирования группы с нуля – группа может формироваться только на основе другой, предварительно определенной группы. Базовая группа, на основе которой определены все другие группы, является группой, связанной с коммуникатором

MPI_COMM_WORLD.

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

MPI содержит 5 конструкторов групп, первые 3 аналогичны операциям над множествами:

Объединение (union) создает группу, которая содержит все элементы первой группы

(group1) и следующие за ними элементы второй группы (group2), не входящие в первую группу.

Пересечение (intersect) создает группу, которая содержит все элементы первой группы,

которые также находятся во второй группе, упорядоченные, как в первой группе.

Разность (difference) создает группу, которая содержит все элементы первой группы,

которые не находятся во второй группе.

Для этих операций порядок процессов в результирующей группе определен, прежде всего, в

соответствии с порядком в первой группе и затем, в случае необходимости, в соответствии с порядком во второй группе. Ни объединение, ни пересечение не коммутативны, но обе ассоциативны. Новая группа может быть пуста (эквивалентна MPI_GROUP_EMPTY).

Следующие 2 конструктора создают новую группу методом включения или исключения номеров процессов из базовой группы.

Функция MPI_GROUP_INCL создает новую группу, которая состоит из указанных n

процессов базовой группы с номерами rank[0],..., rank[n-1]; где процесс с номером i новой группы есть процесс с номером ranks[i] в базовой группе. Все элементы в массиве ranks

должны быть различными, иначе программа будет неверна. Если n = 0, то создаваемая группа имеет значение MPI_GROUP_EMPTY. Эта функция может, например,

использоваться, чтобы переупорядочить элементы группы.

54

Функция MPI_GROUP_EXCL создает новую группу, которая получена путем удаления из базовой группы процессов с номерами ranks[0] ,...ranks[n-1]. Упорядочивание процессов в новой группе идентично упорядочиванию процессов в базовой группе. Элементы массива номеров процессов ranks должны быть различными, в противном случае программа неверна. Если n = 0, то новая группа идентична базовой группе.

Для выполнения операций обмена процессы группы должны быть объединены коммуникатором. Создание коммуникатора – локальная операция над группой процессов,

дескриптор которой подается конструктору коммуникатора в качестве входного параметра.

Функция MPI_COMM_CREATE(comm, group, newcomm) создает новый коммуникатор newcomm с коммуникационной группой, определенной аргументом group и новым контекстом. Функция возвращает MPI_COMM_NULL для процессов, не входящих в group.

Запрос неверен, если не все аргументы в group имеют одинаковое значение или если group

не является подмножеством группы, связанной с comm. Функция должна быть выполнен всеми процессами базовой группы, связанной с коммуникатором comm, даже если они не принадлежат новой группе.

55

10. Особенности реализации взаимодействия параллельных процессов с использованием топологических функций MPI.

Топология – это логическая организация процессов в группе (внутри коммуникатора).

Такая логическая организация процессов имеет еще одно название - “виртуальная топология”.

Следует различать виртуальную и физическую топологию процессов. Виртуальная топология должна применяться к физическим процессам для организации логической структуры процессов с целью увеличения производительности обменов на вычислительной системе. Описание виртуальной топологии зависит от конкретного приложения и является машинно-независимой.

Механизм виртуальных топологий MPI включает конструирование декартовой топологии и топологии графа. Часто процессы описываются в двух- и трехмерных топологических средах,

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

предусматривает передачу сообщений между любой парой процессов в группе, однако канал связи в конструкторе графовой топологии может быть не указан. Тем не менее, отсутствие канала связи в графе процессов не запрещает соответствующим процессам обмениваться сообщениями. Возможным следствием отсутствия канала связи в конструкторе топологии графа может быть то, что при размещении процессов по процессорам данная связь не будет учитываться что возможно, приведет к снижению эффективность вычислений.

Графовое представление топологии пригодно для всех приложений. Однако во многих приложениях графовая структура является регулярной и довольно простой, поэтому использование всех деталей графового представления будет неудобным и малоэффективным в использовании. В большинстве случаев параллельные приложения использует декартову топологию двумерных массивов или массивов большей размерности. Декартова топология,

определяется числом размерностей и количеством процессов по каждой координате. Кроме того, отображение решеток виртуальной декартовой топологии на физическую топологию процессов обычно более простая задача, чем отображение сложных графов.

56

Координаты в декартовой системе нумеруются от 0. Например, соотношение между

номером процесса в группе и координатами в решетке (2х

2) для четырех процессов будет следующим:

 

 

coord (0,0): rank 0

 

 

 

 

сoord (0,1): rank 1

(0,0) процесс 0

 

(0,1)

процесс 1

 

 

 

 

сoord (1,0): rank 2

 

 

 

 

(1,0) процесс 2

 

(1,1)

процесс 3

сoord (1,1): rank 3

 

 

 

 

 

Функции MPI_GRAPH_CREATE и MPI_CART_CREATE используются для создания универсальной (графовой) и декартовой топологий соответственно. Эти функции являются коллективными, поэтому должны быть вызваны всеми процессами в группе. Конструкторы топологий, используя в качестве входных параметров базовый коммуникатор группы и массивы, описывающие структуру топологий, создают новый контекст коммуникатора с учетом виртуальной топологии процессов, присваивая созданный контекст новому дескриптору коммуникатора.

Функция MPI_CART_CREATE может использоваться для описания декартовой системы произвольной размерности. Периодичность структуры процессов устанавливается по каждой координате. Периодичность задает непрерывное соединение процессов по заданной координате, например для двумерной декартовой топологии периодичность по координате Х образует цилиндр, периодичность по координатам X и Y образует тор.

Пример двумерной декартовой топологии процессов - периодичность по координате Х.

При создании декартовой структуры виртуальной топологии, если полная размерность декартовой решетки меньше, чем размер группы процессов, то некоторые процессы возвращаются с результатом MPI_COMM_NULL. Вызов MPI_CART_CREATE будет неверным, если он задает решетку большего размера, чем размер группы.

При создании графовой виртуальной топологии, структуру графа в конструкторе

MPI_GRAPH_CREATE определяют три параметра: nnodes, index и edges, где nnodes – это целая величина, определяющая число вершин графа от 0 до nnodes-1. i-ый элемент массива index хранит суммарное число соседей первых i вершин графа. Номера вершин-соседей 0, 1,

57

..., nnodes-1 хранятся в последовательности значений массива edges. Общее число элементов в index есть nnodes, а общее число элементов в edges равно числу ребер графа.

Например, для создания графовой виртуальной топологии для физической топологии из 5

процессов типа звезда значения параметров должно быть следующим:

nnodes= 5 index[5] = {4, 5, 6, 7, 8} edges[8] = {1, 2, 3, 4, 0, 0, 0, 0}

В массиве index – 4 –это число соседей (выходящих связей) для процесса 0, для процесса 1

число соседей (выходящих связей) равно 1, полученной разностью 5-4, для процесса 2 число соседей равно 1, где 1=6-5 и т.д.

В массиве edges первые 4 значения описывают номера процессов, с которыми связан процесс

0 – это 1, 2, 3, 4. Процесс с номером 1 имеет одну связь с процессом 0, процесс с номером 2

имеет одну связь с процессом 0 и т.д.

Если количество узлов графа nnodes меньше, чем размер группы коммуникатора, то некоторые процессы возвращают значение MPI_COMM_NULL по аналогии с

MPI_CART_SPLIT и MPI_COMM_SPLIT. Вызов будет неверным, если он определяет граф большего размера, чем размер группы исходного коммуникатора.

58