- •(Вопросы 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.2. Управление коммуникаторами
Отметим прежде всего, что в данном пункте рассматривается управление интракоммуникаторами, используемыми для операций передачи данных внутри одной группыпроцессов. Как отмечалось ранее, применениеинтеркоммуникаторовдля обменов между группамипроцессоввыходит за пределы данного учебного материала.
Для создания новых коммуникаторов существуют два основных способа:
дублирование уже существующего коммуникатора:
int MPI_Comm_dup(MPI_Comm oldcom, MPI_comm *newcom),
где
oldcom — существующий коммуникатор, копия которого создается;
newcom — новый коммуникатор;
создание нового коммуникатора из подмножества процессов существующего коммуникатора:
int MPI_comm_create(MPI_Comm oldcom, MPI_Group group,
MPI_Comm *newcom),
где
oldcom — существующий коммуникатор;
group — подмножество процессов коммуникатора oldcom;
newcom — новый коммуникатор.
Дублирование коммуникатора может применяться, например, для устранения возможности пересечения по тегам сообщений в разных частях параллельной программы(в том числе и при использовании функций разных программных библиотек).
Следует отметить также, что операция создания коммуникаторов является коллективной и, тем самым, должна выполняться всеми процессамиисходного коммуникатора.
Для пояснения рассмотренных функций можно привести пример создания коммуникатора, в котором содержатся все процессы, кромепроцесса, имеющего ранг0в коммуникатореMPI_COMM_WORLD(такой коммуникатор может быть полезен для поддержки схемы организации параллельных вычислений "менеджер – исполнители" – см.лекцию 4):
MPI_Group WorldGroup, WorkerGroup;
MPI_Comm Workers;
int ranks[1];
ranks[0] = 0;
// Получение группы процессов в MPI_COMM_WORLD
MPI_Comm_group(MPI_COMM_WORLD, &WorldGroup);
// Создание группы без процесса с рангом 0
MPI_Group_excl(WorldGroup, 1, ranks, &WorkerGroup);
// Создание коммуникатора по группе
MPI_Comm_create(MPI_COMM_WORLD, WorkerGroup, &Workers);
...
MPI_Group_free(&WorkerGroup);
MPI_Comm_free(&Workers);
Быстрый и полезный способ одновременного создания нескольких коммуникаторов обеспечивает функция:
int MPI_Comm_split(MPI_Comm oldcomm, int split, int key,
MPI_Comm *newcomm),
где
oldcomm — исходный коммуникатор;
split — номер коммуникатора, которому должен принадлежать процесс;
key — порядок ранга процесса в создаваемом коммуникаторе;
newcomm — создаваемый коммуникатор.
Создание коммуникаторов относится к коллективным операциям, и поэтому вызов функции MPI_Comm_splitдолжен быть выполнен в каждомпроцессекоммуникатораoldcomm. В результате выполнения функциипроцессыразделяются на непересекающиеся группы с одинаковыми значениями параметраsplit. На основе сформированных групп создается набор коммуникаторов. Для того чтобы указать, чтопроцессне должен входить ни в один из создаваемых коммуникаторов, необходимо воспользоваться константойMPI_UNDEFINEDв качестве значения параметраsplit. При создании коммуникаторов для ранговпроцессовв новом коммуникаторе выбирается такой порядок нумерации, чтобы он соответствовал порядку значений параметровkey(процессс большим значением параметраkeyполучает больший ранг,процессыс одинаковым значением параметраkeyсохраняют свою относительную нумерацию).
В качестве примера можно рассмотреть задачу представления набора процессовв виде двумерной решетки. Пустьp=q*qесть общее количествопроцессов; следующий далее фрагмент программы обеспечивает получение коммуникаторов для каждой строки создаваемой топологии:
MPI_Comm comm;
int rank, row;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
row = rank / q;
MPI_Comm_split(MPI_COMM_WORLD, row, rank, &comm);
При выполнении данного примера, например, при p=9,процессыс рангами (0, 1, 2) образуют первый коммуникатор,процессыс рангами (3, 4, 5) – второй и т. д.
После завершения использования коммуникатор должен быть удален, для чего используется функция:
int MPI_Comm_free(MPI_Comm *comm),
где
comm — коммуникатор, подлежащий удалению.