- •Разработка
- •План
- •Литература
- •Интерфейсы разработки параллельных программ
- •Стандарт MPI
- •Основные понятия
- •Запуск MPI машины
- •Запуск программ
- •Структура MPI программы
- •Основной коммуникационный домен
- •Пример MPI программы
- •Создание новых коммуникационных доменов
- •Копирование доменов
- •Разбиение существующего домена на части
- •Пример расщепления
- •Компиляция и выполнения
- •Создание коммуникатора на базе группы
- •Создание группы на базе коммуникатора
- •Операции с группами
- •Создание нового коммуникатора на базе
- •Пример работы с группами
- •Компиляция и выполнение
- •Получение имени машины, где работает процесс
- •Операции передачи данных
- •Операции точка-точка (блокирующие)
- •Результат операции (статус)
- •Коллективные (распределенные) операции
- •Пример выполнения
- •Типы данных
- •Встроенные типы данных
- •Создание новых типов данных
- •Функции создания новых типов данных
- •Пример создания типа структуры
- •Упаковка данных (сериализация)
- •Распаковка данных
- •Пример упаковки- распаковки
- •Асинхронные операции
- •Функции асинхронной передачи-приема
- •Проверка состояния
- •Пример асинхронной операции
- •Расширенные возможности MPI-2
- •Параллельная машина
- •Запуск параллельной машины
- •Функции управления процессами
- •Функции управления процессами
- •Управление виртуальной машиной
- •Пример
- •Пример выполнения и компиляции
- •Прием и отправка сообщений
- •Инициализация буфера упаковки
- •Упаковка и распаковка сообщений
- •Отправка-прием
- •Пример программы
- •Пример выполнения
- •Вопросы ?
Прием и отправка сообщений
Инициализация буфера упаковки
Упаковка
Отправка
Инициализация буфера упаковки
Данные пакуются в специальный буфер
В системе может быть несколько буферов
Один – существует по умолчанию
Буфер инициализируется с помощью функции int bufid = pvm_initsend( int encoding )
encoing – PvmDataDefault или 0 соответсвует XDR формату
Новый буфер можно создать и удалить
pvm_mkbuf(int encoding )
pvm_freebuf(int buf)
Для установки буфера по умолчанию
oldbuf = pvm_setrbuf( int bufid )
oldbuf = pvm_setsbuf( int bufid )
Упаковка и распаковка сообщений
Для сериализации существуют функции упаковки и распаковки разных типов данных
Данные пакуются в буфер, используемый по умолчанию
Упаковка
pvm_pkbyte( char *xp, int nitem, int stride )
pvm_pkdouble( double *dp, int nitem, int stride )
pvm_pkint( int *ip, int nitem, int stride )
pvm_pkstr( char *sp )
Распаковка
pvm_upkbyte( char *xp, int nitem, int stride)
pvm_upkdouble( double *dp, int nitem, int stride)
pvm_upkint( int *ip, int nitem, int stride)
pvm_upkstr( char *sp )
Аргументы
xp – указатель на буфер памяти откуда/куда будет выполняться операция
nitem – количество элементов массива одного типа для упаковки/распаковки
stride – через сколько элементов “перепрыгивать”
Отправка-прием
Данные отправляются и принимаются в буфер по умолчанию
Отправка
int pvm_send(int tid, in tag)
Прием
int pvm_recv(int tid, in tag)
Проверка на наличие сообщений в буфере
int pvm_nrecv(int tid, in tag)
Пример программы
#include <stdio.h> #include <pvm3.h>
int main (int argc, char* argv[]){
char* hosts[]={"node1", "node2", "node3"}; int tids[16];
int status[3];
char message[4096]; int ntasks, nhosts,i;
char* task="/net/node1/home/saa/src/parallel_and_distributed/pvm/msg"; char* arg[]={"child",NULL};
if(argc <2){ //parent
nhosts = pvm_addhosts(hosts,3,status); printf("added %d hosts\n",nhosts);
ntasks = pvm_spawn(task,arg,0,"",16,tids); printf("spawned %d tasks\n",ntasks);
for (i = 0; i<16;i++){ pvm_recv(tids[i],1); pvm_upkstr(message);
printf("child %d work at %s\n",i,message);
}
pvm_halt();
} else {
pvm_initsend(PvmDataDefault); gethostname(message,4096); pvm_pkstr(message); pvm_send(pvm_parent(),1); pvm_exit();
}
return 0;
}
Пример выполнения
[saa@cluster pvm]$ gcc ./msg.c -I$PVM_ROOT/include -L$PVM_ROOT/lib/$PVM_ARCH -lpvm3 -o msg /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]$ ./msg added 2 hosts
spawned 16 tasks
child 0 work at ss20-2.univ.kiev.ua child 1 work at ss20-2.univ.kiev.ua child 2 work at ss20-2.univ.kiev.ua child 3 work at ss20-2.univ.kiev.ua child 4 work at ss20-2.univ.kiev.ua child 5 work at ss20-2.univ.kiev.ua child 6 work at ss20-3.univ.kiev.ua child 7 work at ss20-3.univ.kiev.ua child 8 work at ss20-3.univ.kiev.ua child 9 work at ss20-3.univ.kiev.ua child 10 work at ss20-3.univ.kiev.ua child 11 work at cluster.univ.kiev.ua child 12 work at cluster.univ.kiev.ua child 13 work at cluster.univ.kiev.ua child 14 work at cluster.univ.kiev.ua child 15 work at cluster.univ.kiev.ua Terminated