
- •Разработка
- •План
- •Литература
- •Интерфейсы разработки параллельных программ
- •Стандарт MPI
- •Основные понятия
- •Запуск MPI машины
- •Запуск программ
- •Структура MPI программы
- •Основной коммуникационный домен
- •Пример MPI программы
- •Создание новых коммуникационных доменов
- •Копирование доменов
- •Разбиение существующего домена на части
- •Пример расщепления
- •Компиляция и выполнения
- •Создание коммуникатора на базе группы
- •Создание группы на базе коммуникатора
- •Операции с группами
- •Создание нового коммуникатора на базе
- •Пример работы с группами
- •Компиляция и выполнение
- •Получение имени машины, где работает процесс
- •Операции передачи данных
- •Операции точка-точка (блокирующие)
- •Результат операции (статус)
- •Коллективные (распределенные) операции
- •Пример выполнения
- •Типы данных
- •Встроенные типы данных
- •Создание новых типов данных
- •Функции создания новых типов данных
- •Пример создания типа структуры
- •Упаковка данных (сериализация)
- •Распаковка данных
- •Пример упаковки- распаковки
- •Асинхронные операции
- •Функции асинхронной передачи-приема
- •Проверка состояния
- •Пример асинхронной операции
- •Расширенные возможности MPI-2
- •Параллельная машина
- •Запуск параллельной машины
- •Функции управления процессами
- •Функции управления процессами
- •Управление виртуальной машиной
- •Пример
- •Пример выполнения и компиляции
- •Прием и отправка сообщений
- •Инициализация буфера упаковки
- •Упаковка и распаковка сообщений
- •Отправка-прием
- •Пример программы
- •Пример выполнения
- •Вопросы ?

Пример асинхронной операции
MPI_Request reqs[4];
MPI_Status stats[4];
MPI_Irecv(&buf[0], 1, MPI_INT, prev, tag1, MPI_COMM_WORLD, &reqs[0]); MPI_Irecv(&buf[1], 1, MPI_INT, next, tag2, MPI_COMM_WORLD, &reqs[1]); MPI_Isend(&rank, 1, MPI_INT, prev, tag2, MPI_COMM_WORLD, &reqs[2]); MPI_Isend(&rank, 1, MPI_INT, next, tag1, MPI_COMM_WORLD, &reqs[3]);
{ do some work }
MPI_Waitall(4, reqs, stats);

Расширенные возможности MPI-2
Параллельный ввод-вывод в разные части файла
Доступ к памяти на удаленной машине
Синхронизация
Создание и остановка процессов
Присоединение к работающей программе

PVM
Рассчитана на гетерогенные системы
Функции
Управление процессами
Упаковка – распаковка данных
Прием – передача сообщений
Управление буфером сообщений
Функции управления системой PVM

Параллельная машина
Создается путем запуска демонов на соответствующих хостах
Имеет общую среду управления
Все системные переменные указанные в системной переменной PVM_EXPORT экспортируются на все процессы задачи
export DISPLAY=myworkstation:0.0
export MYSTERYVAR=13
export PVM_EXPORT=“DISPLAY:MYSTERYVAR”
Машины можно добавлять через командную строку - pvm
По умолчанию все программы должны находится в каталогах
$PVM_ROOT
~pvm3/bin/$PVM_ARCH/

Запуск параллельной машины
Машина запускается командой
pvm
При этом запускается демон на локальной машине
Запуск программ на других машинах выполняется через команду $PVM_RSH
export PVM_RSH="/usr/bin/rsh“
На всех машинах должны быть установлены системные переменные
PVM_ARCH PVM_ROOT PVM_RSH XPVM_ROOT
export PVM_ARCH="LINUXI386“
export PVM_ROOT="/usr/share/pvm3“
export PVM_RSH="/usr/bin/rsh“
Это можно сделать в файле
~/.bashrc

Функции управления процессами
Создание процессов
int numt = pvm_spawn(
char *task, // имя программы
char **argv, |
// набор аргументов программы |
int flag, |
// особенность интерпретации |
// аргументов программы |
|
char *where, |
// масив имен машин |
int ntask, |
// количество заданий |
int *tids ) // возвращаются
// идентификаторы заданий

Функции управления процессами
int pvm_kill (int taskid) – завершение другого процесса
pvm_exit() – завершение своего процесса

Управление виртуальной машиной
Добавление физических машин
int info = pvm_addhosts( char **hosts, int nhost, int *infos )
Удаление физических машин
int info = pvm_delhosts( char **hosts, int nhost, int *infos )
Остановка виртуальной машины
pvm_halt()

Пример
#include <stdio.h> #include <pvm3.h>
int main (int argc, char* argv[]){
char* hosts[]={"node1", "node2", "node3"}; int tids[16];
int status[3];
int ntasks, nhosts;
char* task="/net/node1/home/saa/src/parallel_and_distributed/pvm/create"; char* arg[]={"child",NULL};
if(argc <2){
nhosts = pvm_addhosts(hosts,3,status); printf("added %d hosts\n",nhosts);
ntasks = pvm_spawn(task,arg,0,NULL,16,tids); printf("spawned %d tasks\n",ntasks); pvm_halt();
}
return 0;
}

Пример выполнения и компиляции
[saa@cluster pvm]$ gcc ./create.c -I$PVM_ROOT/include -L$PVM_ROOT/lib/$PVM_ARCH
-lpvm3 -o create
/usr/share/pvm3/lib/LINUXI386/libpvm3.a(lpvmgen.o)(.text+0x292): In function `pvmlogperror':
: warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
/usr/share/pvm3/lib/LINUXI386/libpvm3.a(lpvmgen.o)(.text+0x289): In function `pvmlogperror':
: warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead [saa@cluster pvm]$ pvm
pvm> quit
Console: exit handler called pvmd still running. [saa@cluster pvm]$ ./create added 2 hosts
spawned 16 tasks Terminated