- •Разработка
- •План
- •Литература
- •Интерфейсы разработки параллельных программ
- •Стандарт MPI
- •Основные понятия
- •Запуск MPI машины
- •Запуск программ
- •Структура MPI программы
- •Основной коммуникационный домен
- •Пример MPI программы
- •Создание новых коммуникационных доменов
- •Копирование доменов
- •Разбиение существующего домена на части
- •Пример расщепления
- •Компиляция и выполнения
- •Создание коммуникатора на базе группы
- •Создание группы на базе коммуникатора
- •Операции с группами
- •Создание нового коммуникатора на базе
- •Пример работы с группами
- •Компиляция и выполнение
- •Получение имени машины, где работает процесс
- •Операции передачи данных
- •Операции точка-точка (блокирующие)
- •Результат операции (статус)
- •Коллективные (распределенные) операции
- •Пример выполнения
- •Типы данных
- •Встроенные типы данных
- •Создание новых типов данных
- •Функции создания новых типов данных
- •Пример создания типа структуры
- •Упаковка данных (сериализация)
- •Распаковка данных
- •Пример упаковки- распаковки
- •Асинхронные операции
- •Функции асинхронной передачи-приема
- •Проверка состояния
- •Пример асинхронной операции
- •Расширенные возможности MPI-2
- •Параллельная машина
- •Запуск параллельной машины
- •Функции управления процессами
- •Функции управления процессами
- •Управление виртуальной машиной
- •Пример
- •Пример выполнения и компиляции
- •Прием и отправка сообщений
- •Инициализация буфера упаковки
- •Упаковка и распаковка сообщений
- •Отправка-прием
- •Пример программы
- •Пример выполнения
- •Вопросы ?
Пример MPI программы
int main(int argc, char* argv[]){
int my_number; //Мой номер процесса
int proc_num; //общее количество процессов
MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &proc_num); MPI_Comm_rank(MPI_COMM_WORLD, &my_number);
printf("I an process %d, sending data\n", my_number);
MPI_Finalize(); return 0;
}
Создание новых коммуникационных доменов
Иногда необходимо организовать обмен между процессами параллельно с обменом в основном коммуникационном домене
Чтобы теги сообщений повторялись
Чтобы выполнять коллективные операции обмена
Алгоритм Фокса
Это делается путем создания нового коммуникационного домена
Копированием существующего
Разделением существующего на поддомены
Отображение групп на коммуникационные домены
Копирование доменов
Создание копии существующего домена
Обмен в новом домене не перекрывается с обменом в старом
Все процессы старого коммуникатора должны вызвать эту функцию
MPI_Comm tempComm;
MPI_Comm_dup( MPI_COMM_WORLD, &tempComm );
/* ... передаем данные через tempComm ... */
MPI_Comm_free( &tempComm );
Разбиение существующего домена на части
Существующий коммуникатор можно разбить на части
Все процессы старого коммуникатора должны вызвать эту функцию
Все процессы с одинаковым «цветом» (задается) попадают в один коммуникатор
Номер процесса в новом коммуникаторе
задается
MPI_Comm_split( |
|
|
existingComm, |
/* расщепляемый описатель ( MPI_COMM_WORLD) */ |
|
indexOfNewSubComm, |
/* номер подгруппы, куда попадает вызывающий |
|
процесс */ |
|
|
rankInNewSubComm, |
|
/* желательный номер в новой подгруппе */ |
&newSubComm ); |
/* описатель области связи новой подгруппы */ |
Пример расщепления
#include "mpi.h"
int main(int argc, char* argv[]){ MPI_Comm subComm;
int size, rank, subrank, subsize; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank( MPI_COMM_WORLD, &rank );
//разбиваем набор процессов на 3 группы //нумерация процессов в каждой группе 0-2
MPI_Comm_split(MPI_COMM_WORLD, rank/3, rank%3, &subComm);
MPI_Comm_rank( subComm, &subrank ); MPI_Comm_size( subComm, &subsize ); printf("old size = %d new size %d ",size, subsize);
printf("old rank = %d new rank %d\n",rank, subrank); MPI_Comm_free(&subComm);
MPI_Finalize(); return 0;
}
Компиляция и выполнения
[saa@cluster mpi]$ mpicc ./comm_split.c -o comm_split [saa@cluster mpi]$ mpirun -np 10 -wd /net/s1/$PWD ./comm_split old size = 10 new size 1 old rank = 9 new rank 0
old size = 10 new size 3 old rank = 8 new rank 2 old size = 10 new size 3 old rank = 6 new rank 0 old size = 10 new size 3 old rank = 7 new rank 1 old size = 10 new size 3 old rank = 0 new rank 0 old size = 10 new size 3 old rank = 1 new rank 1 old size = 10 new size 3 old rank = 2 new rank 2 old size = 10 new size 3 old rank = 4 new rank 1 old size = 10 new size 3 old rank = 5 new rank 2 old size = 10 new size 3 old rank = 3 new rank 0
Создание коммуникатора на базе группы
Создается группа процессов на базе существующего коммуникатора
В/из группы добавляются/удаляются номера процессов
На базе группы создается новый коммуникатор
Все процессы с общим коммуникатором должны вызвать соответствующие функции
Создание группы на базе коммуникатора
Группа – набор номеров процессов
Может выполнить каждый процесс параллельной программы
В каждом процессе можно создавать свои группы
MPI_Group group; MPI_Comm_group(MPI_COMM_WORLD, &group);
Операции с группами
Удаление процессов из группы
Добавление процессов в группы
Объединение групп
Удаление групп
MPI_Group group, subgroup; int ranks[5], i;
for(i = 0; i<5; i++) ranks[i]=i; MPI_Group_excl(group,5,ranks,&subgroup);
Создание нового коммуникатора на базе
группыMPI Comm subComm;
MPI_Group subgroup;
MPI_Comm_create(MPI_COMM_WORLD, subgroup,&subComm);