Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec22_mpi_pvm.ppt
Скачиваний:
17
Добавлен:
20.03.2015
Размер:
268.8 Кб
Скачать

Прием и отправка сообщений

Инициализация буфера упаковки

Упаковка

Отправка

Инициализация буфера упаковки

Данные пакуются в специальный буфер

В системе может быть несколько буферов

Один – существует по умолчанию

Буфер инициализируется с помощью функции 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

Вопросы ?

Соседние файлы в папке Лекции