- •(Вопросы 34-40) содержание
- •5.2. Введение в разработку параллельных программ с использованием mpi
- •5.3. Операции передачи данных между двумя процессами
- •5.1. Mpi: основные понятия и определения
- •5.1.1. Понятие параллельной программы
- •5.1.2. Операции передачи данных
- •5.1.3. Понятие коммуникаторов
- •5.1.4. Типы данных
- •5.1.5. Виртуальные топологии
- •5.2. Введение в разработку параллельных программ с использованием mpi
- •5.2.1. Основы mpi
- •5.2.1.1. Инициализация и завершение mpi-программ
- •5.2.1.2. Определение количества и ранга процессов
- •5.2.1.3. Передача сообщений
- •5.2.1.4. Прием сообщений
- •5.2.1.5. Первая параллельная программа с использованием mpi
- •5.2.2. Определение времени выполнение mpi-программы
- •5.2.3. Начальное знакомство с коллективными операциями передачи данных
- •5.2.3.1. Передача данных от одного процесса всем процессам программы
- •5.2.3.2. Передача данных от всех процессов одному процессу. Операция редукции
- •5.2.3.3. Синхронизация вычислений
- •5.2.3.4. Аварийное завершение параллельной программы
- •5.3. Операции передачи данных между двумя процессами
- •5.3.1. Режимы передачи данных
- •5.3.2. Организация неблокирующих обменов данными между процессами
- •5.3.3. Одновременное выполнение передачи и приема
- •5.4. Коллективные операции передачи данных
- •5.4.1. Обобщенная передача данных от одного процесса всем процессам
- •5.4.2. Обобщенная передача данных от всех процессов одному процессу
- •5.4.3. Общая передача данных от всех процессов всем процессам
- •5.4.4. Дополнительные операции редукции данных
- •5.4.5. Сводный перечень коллективных операций данных
- •5.5. Производные типы данных в mpi
- •5.5.1. Понятие производного типа данных
- •5.5.2. Способы конструирования производных типов данных
- •5.5.2.1. Непрерывный способ конструирования
- •5.5.2.2. Векторный способ конструирования
- •5.5.2.3. Индексный способ конструирования
- •5.5.2.4. Структурный способ конструирования
- •5.5.3. Объявление производных типов и их удаление
- •5.5.4. Формирование сообщений при помощи упаковки и распаковки данных
- •5.6. Управление группами процессов и коммуникаторами
- •5.6.1. Управление группами
- •5.6.2. Управление коммуникаторами
- •5.7. Виртуальные топологии
- •5.7.1. Декартовы топологии (решетки)
- •5.7.2. Топологии графа
- •5.8. Дополнительные сведения о mpi
- •5.8.1. Разработка параллельных программ с использованием mpi на алгоритмическом языке Fortran
- •5.8.2. Общая характеристика среды выполнения mpi-программ
- •5.8.3. Дополнительные возможности стандарта mpi-2
- •5.9. Краткий обзор лекции
- •6. Параллельные методы умножения матрицы на вектор
- •6.1. Принципы распараллеливания
- •6.2. Постановка задачи
- •6.3. Последовательный алгоритм
- •6.4. Разделение данных
- •6.5. Умножение матрицы на вектор при разделении данных по строкам
- •6.5.1. Выделение информационных зависимостей
- •6.5.2. Масштабирование и распределение подзадач по процессорам
- •6.5.3. Анализ эффективности
- •6.5.4. Программная реализация
- •6.5.5. Результаты вычислительных экспериментов
- •6.6. Умножение матрицы на вектор при разделении данных по столбцам
- •6.6.1. Определение подзадач и выделение информационных зависимостей
- •6.6.2. Масштабирование и распределение подзадач по процессорам
- •6.6.3. Анализ эффективности
- •6.6.4. Результаты вычислительных экспериментов
- •6.7. Умножение матрицы на вектор при блочном разделении данных
- •6.7.1. Определение подзадач
- •6.7.2. Выделение информационных зависимостей
- •6.7.3. Масштабирование и распределение подзадач по процессорам
- •6.7.4. Анализ эффективности
- •6.7.5. Результаты вычислительных экспериментов
- •6.8. Краткий обзор лекции
5.6. Управление группами процессов и коммуникаторами
Рассмотрим теперь возможности MPIпо управлению группамипроцессови коммуникаторами.
Для изложения последующего материала напомним ряд понятий и определений, приведенных в начале данной лекции.
Процессыпараллельной программыобъединяются вгруппы. В группу могут входить всепроцессыпараллельной программы; с другой стороны, в группе может находиться только часть имеющихсяпроцессов. Один и тот жепроцессможет принадлежать нескольким группам. Управление группамипроцессовпредпринимается для создания на их основе коммуникаторов.
Под коммуникатором в MPIпонимается специально создаваемый служебный объект, который объединяет в своем составе группупроцессови ряд дополнительных параметров (контекст), используемых при выполнении операций передачи данных. Парные операции передачи данных выполняются только дляпроцессов, принадлежащих одному и тому же коммуникатору. Коллективные операции применяются одновременно для всехпроцессовкоммуникатора. Создание коммуникаторов предпринимается для уменьшения области действия коллективных операций и для устранения взаимовлияния разных выполняемых частейпараллельной программы. Важно еще раз подчеркнуть – коммуникационные операции, выполняемые с использованием разных коммуникаторов, являются независимыми и не влияют друг на друга.
Все имеющиеся в параллельной программепроцессывходят в состав создаваемого по умолчанию коммуникатора с идентификаторомMPI_COMM_WORLD.
При необходимости передачи данных между процессамииз разных групп необходимо создавать определенные в стандартеMPI-2 глобальные коммуникаторы (intercommunicator). Взаимодействие междупроцессамиразных групп оказывается необходимым в достаточно редких ситуациях, в данном учебном материале не рассматривается и может служить темой для самостоятельного изучения – см., например, [[4],[40]–[42],[57]].
5.6.1. Управление группами
Группы процессовмогут быть созданы только из уже существующих групп. В качестве исходной группы может быть использована группа, связанная с предопределенным коммуникаторомMPI_COMM_WORLD. Также иногда может быть полезным коммуникаторMPI_COMM_SELF, определенный для каждогопроцессапараллельной программыи включающий только этотпроцесс.
Для получения группы, связанной с существующим коммуникатором, применяется функция:
int MPI_Comm_group(MPI_Comm comm, MPI_Group *group),
где
comm — коммуникатор;
group — группа, связанная с коммуникатором.
Далее, на основе существующих групп, могут быть созданы новые группы:
создание новой группы newgroup из существующей группы oldgroup, которая будет включать в себя n процессов — их ранги перечисляются в массиве ranks:
int MPI_Group_incl(MPI_Group oldgroup, int n, int *ranks,
MPI_Group *newgroup),
где
oldgroup — существующая группа;
n — число элементов в массиве ranks;
ranks — массив рангов процессов, которые будут включены в новую группу;
newgroup — созданная группа;
создание новой группы newgroup из группы oldgroup, которая будет включать в себя n процессов, чьи ранги не совпадают с рангами, перечисленными в массиве ranks:
int MPI_Group_excl(MPI_Group oldgroup, int n, int *ranks,
MPI_Group *newgroup),
где
oldgroup — существующая группа;
n — число элементов в массиве ranks;
ranks — массив рангов процессов, которые будут исключены из новой группы;
newgroup — созданная группа.
Для получения новых групп над имеющимися группами процессовмогут быть выполнены операции объединения, пересечения и разности:
создание новой группы newgroup как объединения групп group1 и group2:
int MPI_Group_union(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup),
где
group1 — первая группа;
group2 — вторая группа;
newgroup — объединение групп;
создание новой группы newgroup как пересечения групп group1 и group2:
int MPI_Group_intersection(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup),
где
group1 — первая группа;
group2 — вторая группа;
newgroup — пересечение групп;
создание новой группы newgroup как разности групп group1 и group2:
int MPI_Group_difference(MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup),
где
group1 — первая группа;
group2 — вторая группа;
newgroup — разность групп;
При конструировании групп может оказаться полезной специальная пустая группа MPI_COMM_EMPTY.
Ряд функций MPIобеспечивает получение информации о группепроцессов:
получение количества процессов в группе:
int MPI_Group_size(MPI_Group group, int *size),
где
group — группа;
size — число процессов в группе;
получение ранга текущего процесса в группе:
int MPI_Group_rank(MPI_Group group, int *rank),
где
group — группа;
size — ранг процесса в группе.
После завершения использования группа должна быть удалена:
int MPI_Group_free(MPI_Group *group),
где
group — группа, подлежащая удалению
(выполнение данной операции не затрагивает коммуникаторы, в которых используется удаляемая группа).