- •Разработка
- •План
- •Литература
- •Интерфейсы разработки параллельных программ
- •Стандарт MPI
- •Основные понятия
- •Запуск MPI машины
- •Запуск программ
- •Структура MPI программы
- •Основной коммуникационный домен
- •Пример MPI программы
- •Создание новых коммуникационных доменов
- •Копирование доменов
- •Разбиение существующего домена на части
- •Пример расщепления
- •Компиляция и выполнения
- •Создание коммуникатора на базе группы
- •Создание группы на базе коммуникатора
- •Операции с группами
- •Создание нового коммуникатора на базе
- •Пример работы с группами
- •Компиляция и выполнение
- •Получение имени машины, где работает процесс
- •Операции передачи данных
- •Операции точка-точка (блокирующие)
- •Результат операции (статус)
- •Коллективные (распределенные) операции
- •Пример выполнения
- •Типы данных
- •Встроенные типы данных
- •Создание новых типов данных
- •Функции создания новых типов данных
- •Пример создания типа структуры
- •Упаковка данных (сериализация)
- •Распаковка данных
- •Пример упаковки- распаковки
- •Асинхронные операции
- •Функции асинхронной передачи-приема
- •Проверка состояния
- •Пример асинхронной операции
- •Расширенные возможности MPI-2
- •Параллельная машина
- •Запуск параллельной машины
- •Функции управления процессами
- •Функции управления процессами
- •Управление виртуальной машиной
- •Пример
- •Пример выполнения и компиляции
- •Прием и отправка сообщений
- •Инициализация буфера упаковки
- •Упаковка и распаковка сообщений
- •Отправка-прием
- •Пример программы
- •Пример выполнения
- •Вопросы ?
Встроенные типы данных
C |
Fortran |
MPI_CHAR |
MPI_CHARACTER |
MPI_SHORT |
MPI_INTEGER |
MPI_INT |
MPI_REAL |
MPI_LONG |
MPI_DOUBLE_PRECISION |
MPI_UNSIGNED_CHAR |
|
MPI_UNSIGNED_SHORT |
MPI_COMPLEX |
MPI_UNSIGNED_LONG |
MPI_DOUBLE_COMPLEX |
MPI_UNSIGNED |
MPI_LOGICAL |
MPI_FLOAT |
MPI_BYTE |
MPI_DOUBLE |
MPI_PACKED |
MPI_LONG_DOUBLE |
|
MPI_BYTE |
|
MPI_PACKED |
|
Создание новых типов данных
Для сложных структур данных можно создать свой тип
Это упрощает сериализацию
Новый тип создается на основе уже существующих
Функции создания новых типов данных
/* количество полей */ /* массив с длинами полей */
/* (на тот случай, если это массивы) */ MPI_Aint *pos, /* массив со смещениями полей */
/* от начала структуры, в байтах */ MPI_Datatype *types, /* массив с описателями типов
полей */
MPI_Datatype *newtype ); /* ссылка на создаваемый тип */
Пример создания типа структуры
#include <stddef.h> /* подключаем макрос 'offsetof()' */ typedef struct {
int i; double d[3]; long l[8]; char c;
} AnyStruct;
AnyStruct st;
MPI_Datatype anyStructType;
int len[5] = { 1, 3, 8, 1, 1 };
MPI_Aint pos[5] = {
offsetof(AnyStruct,i), offsetof(AnyStruct,d), offsetof(AnyStruct,l), offsetof(AnyStruct,c), sizeof(AnyStruct)
};
MPI_Datatype typ[5] = { MPI_INT,MPI_DOUBLE,MPI_LONG,MPI_CHAR,MPI_UB }; MPI_Type_struct( 5, len, pos, typ, &anyStructType );
MPI_Type_commit( &anyStructType ); /* подготовка закончена */ MPI_Send( st, 1, anyStructType, ... );
Упаковка данных (сериализация)
Упаковка – запись разнотипных структур данных в один массив
int MPI_Pack(void *buf, int count, MPI_Datatype dtype, void *packbuf, int packsize, int *packpos, MPI_Comm comm)
INPUT PARAMETERS
buf - input buffer start (choice)
count - number of input data items (integer) dtype - datatype of each input data item (handle)
packsize - output buffer size, in bytes (integer)
comm - communicator for packed message (handle)
INPUT/OUTPUT PARAMETER
|
packpos |
- current position in buffer, in bytes (integer) |
OUTPUT PARAMETER
packbuf - output buffer start (choice)
Распаковка данных
int MPI_Unpack(void *packbuf, int packsize, int *packpos,
void *buf, int count, MPI_Datatype dtype, MPI_Comm comm)
INPUT PARAMETERS
|
packbuf |
- input buffer start (choice) |
|
packsize |
- size of input buffer, in bytes (integer) |
count - number of items to be unpacked (integer)
dtype - datatype of each output data item (handle)
comm - communicator for packed message (handle)
INPUT/OUTPUT PARAMETERS
packpos - current position in bytes (integer)
OUTPUT PARAMETER
buf - output buffer start (choice)
Пример упаковки- распаковки
#define msgTag 10 struct {
int i; float f[4]; char c[8];
} s;
Передача
int bufPos = 0;
char tempBuf[ sizeof(s) ];
MPI_Pack(&s.i, 1, MPI_INT, tempBuf, sizeof(tempBuf), &bufPos, MPI_COMM_WORLD );
MPI_Pack( s.f, 4, MPI_FLOAT, tempBuf, sizeof(tempBuf), &bufPos, MPI_COMM_WORLD );
MPI_Pack( s.c, 8, MPI_CHAR, tempBuf, sizeof(tempBuf), &bufPos, MPI_COMM_WORLD ); MPI_Send( tempBuf, bufPos, MPI_BYTE, targetRank, msgTag, MPI_COMM_WORLD );
Прием
int bufPos = 0;
char tempBuf[ sizeof(s) ];
MPI_Recv( tempBuf, sizeof(tempBuf), MPI_BYTE, sourceRank, msgTag, MPI_COMM_WORLD, &status ); MPI_Unpack( tempBuf, sizeof(tempBuf), &bufPos,&s.i, 1, MPI_INT, MPI_COMM_WORLD);
MPI_Unpack( tempBuf, sizeof(tempBuf), &bufPos, s.f, 4, MPI_FLOAT,MPI_COMM_WORLD);
MPI_Unpack( tempBuf, sizeof(tempBuf), &bufPos, s.c, 8, MPI_CHAR, MPI_COMM_WORLD);
Асинхронные операции
Функция приема-передачи не блокируется
Прием-передачу можно выполнять параллельно с обработкой данных
К передаваемым данным нельзя обращаться в процессе передачи-приема
Необходимо специально проверять завершение операции
Функции асинхронной передачи-приема
MPI_Isend (&buf,count,datatype,dest,tag,comm,&request)
MPI_Irecv (&buf,count,datatype,source,tag,comm,&request)
Все параметры аналогичные
Добавляется еще один
Статус выполнения запроса request
Проверка состояния
Проверка
MPI_Test(MPI_Request *req, int *flag, MPI_Status *stat)
Статус может быть MPI_STATUS_IGNORE
Ожидание завершения
MPI_Wait(MPI_Request *preq, MPI_Status *stat)
Ожидание завершения нескольких запросов
int MPI_Waitall(int count, MPI_Request *reqs, MPI_Status *stats)