Parallel Virtual Machines

Содержание

Слайд 2

История создания

Проект PVM был начат в 1989 году в Oak Ridge National

История создания Проект PVM был начат в 1989 году в Oak Ridge
Laboratory Первый релиз – Март 1991.
Библиотека была полностью переписана в 1993 году. Версия 3.3, которая и будет рассматриваться далее.

Слайд 3

Парадигма PVM

pvmd

pvmd

pvmd

Парадигма PVM pvmd pvmd pvmd

Слайд 4

«Демон» pvmd

«Отвечает» за работу на вычислительном узле.
Используется для запуска, контроля и завершения

«Демон» pvmd «Отвечает» за работу на вычислительном узле. Используется для запуска, контроля и завершения заданий.
заданий.

Слайд 5

Работа пользователя в PVM

Запуск PVM.
Создание виртуальной машины.
Запуск процесса приложения, который порождает другие

Работа пользователя в PVM Запуск PVM. Создание виртуальной машины. Запуск процесса приложения, который порождает другие процессы.
процессы.

Слайд 6

Запуск приложения

pvmd3

pvmd3

pvmd3

app

app

Запуск приложения pvmd3 pvmd3 pvmd3 app app

Слайд 7

Консоль PVM

Консоль PVM предоставляет возможность контроля всех процессов виртуальной машины. Она используется
для

Консоль PVM Консоль PVM предоставляет возможность контроля всех процессов виртуальной машины. Она
конфигурирования параллельной машины;
запуска и завершения процессов виртуальной машины;
получения информации о запущенных процессах;
Консоль является отдельным процессом PVM, может быть запущена или завершена в любой момент.

Слайд 8

Управление виртуальной машиной с консоли

pvm> add hostname добавление узла в виртуальную машину
pvm>

Управление виртуальной машиной с консоли pvm> add hostname добавление узла в виртуальную
delete hostname удаление узла из виртуальной машины
pvm> conf печать конфигурации виртуальной машины
pvm> halt завершить работу всех демонов и закрыть PVM

Слайд 9

Работа с процессами

pvm> spawn task запуск процесса с именем task
pvm> kill tid

Работа с процессами pvm> spawn task запуск процесса с именем task pvm>
прерывание выполнения задания
pvm> ps печать списка запущенных процессов
pvm> reset завершение всех запущенных задач

Слайд 10

Другие команды консоли

pvm> spawn task запуск процесса с именем task
pvm> kill tid

Другие команды консоли pvm> spawn task запуск процесса с именем task pvm>
прерывание выполнения задания
pvm> ps печать списка запущенных процессов

Слайд 11

Способы запуска приложения

Из командной строки.
Из консоли pvm на локальной или удаленной машине.
Из

Способы запуска приложения Из командной строки. Из консоли pvm на локальной или
приложения с помощью функции pvm_spawn на локальной или удаленной машине.

Слайд 12

Управление виртуальной машиной из консоли

На машине должна быть установлена библиотека PVM.
Должны существовать

Управление виртуальной машиной из консоли На машине должна быть установлена библиотека PVM.
права для удаленного доступа.
pvm add hostname

Слайд 13

Управление виртуальной машиной из программы

int pvm_add_hosts(char** hosts, int nhosts, int* infos);
hosts –

Управление виртуальной машиной из программы int pvm_add_hosts(char** hosts, int nhosts, int* infos);
список имен добавляемых машин
nhosts – число добавляемых машин
infos – коды ошибок ( < 0 означает ошибку)
возвращает число корректно добавленных узлов
int pvm_del_hosts(char** hosts, int nhosts, int* infos);

Слайд 14

Запуск процесса из консоли

Предварительно скопировать в стандартный (или указанный для данной машины)

Запуск процесса из консоли Предварительно скопировать в стандартный (или указанный для данной
каталог на нужной машине.
spawn app_name – обычный запуск (вывод сохраняется в директории tmp)
spawn -> app_name – запуск с перехватом вывода.

Слайд 15

int numt = pvm_spawn( char *task, char **argv, int flag, char *where,

int numt = pvm_spawn( char *task, char **argv, int flag, char *where,
int ntask, int *tids )
Запуск ntask процессов с именем task.
task – имя загрузочного модуля
argv – аргументы командной строки
flag – способ запуска
PvmTaskDefault (0) - PVM выбирает машину PvmTaskHost - where задает конкретную машину

tids – массив идентификаторов запущенных заданий (или кодов ошибок при частичном запуске).
numt – число реально запущенных заданий, значение меньше ноля означает ошибку; если numt < ntask, то запущено меньше заданий, чем ожидалось (ошибки в tids)

Запуск процесса

Слайд 16

Различные примеры запуска процессов

Различные примеры запуска процессов

Слайд 17

Завершение задания

Выход из параллельной машины:
int pvm_exit();
стандартная последовательность вызова:
pvm_exit();
exit();
Принудительное завершение процесса по

Завершение задания Выход из параллельной машины: int pvm_exit(); стандартная последовательность вызова: pvm_exit();
идентификатору:
int pvm_kill(int tid);

Слайд 18

Пример (hello.c)

main()
{
int cc, tid, msgtag;
char buf[100];
printf("i'm t%x\n", pvm_mytid());
cc

Пример (hello.c) main() { int cc, tid, msgtag; char buf[100]; printf("i'm t%x\n",
= pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid);

Слайд 19

if (cc == 1) {
msgtag = 1;
pvm_recv(tid, msgtag);
pvm_upkstr(buf);
printf("from

if (cc == 1) { msgtag = 1; pvm_recv(tid, msgtag); pvm_upkstr(buf); printf("from
t%x: %s\n", tid, buf);
} else
printf("can't start hello_other\n");
pvm_exit();
}

Слайд 20

Пример (hello_other.c)

#include "pvm3.h"
main()
{
int ptid, msgtag;
char buf[100];
ptid = pvm_parent();

Пример (hello_other.c) #include "pvm3.h" main() { int ptid, msgtag; char buf[100]; ptid = pvm_parent();

Слайд 21

strcpy(buf, "hello, world from ");
gethostname(buf + strlen(buf), 64);
msgtag =

strcpy(buf, "hello, world from "); gethostname(buf + strlen(buf), 64); msgtag = 1;
1;
pvm_initsend(PvmDataDefault);
pvm_pkstr(buf);
pvm_send(ptid, msgtag);
pvm_exit();
}

Слайд 22

int tid = pvm_mytid( void )
Возвращает номер задания. Если процесс не

int tid = pvm_mytid( void ) Возвращает номер задания. Если процесс не
включен в PVM, то добавляет его (как и любой другой первый вызов PVM).
int tid = pvm_parent( void )
Возвращает идентификатор процесса, запустившего данный или PvmNoParent, если такого нет.

Слайд 23

Обмен сообщениями

Посылка:
Инициализация буфера.
Упаковка в буфер данных.
Посылка данных.
Прием:
Прием данных в буфер.
Распаковка данных из

Обмен сообщениями Посылка: Инициализация буфера. Упаковка в буфер данных. Посылка данных. Прием:
буфера.

Слайд 24

Посылка сообщений.

int bufid = pvm_initsend( int encoding )
Очищает буфер посылки сообщений и

Посылка сообщений. int bufid = pvm_initsend( int encoding ) Очищает буфер посылки
инициализирует кодировку.
encoding:
PvmDataDefault – кодировка XDR (самый общий случай)
PvmDataRaw – кодировка отсутствует (однородная платформа)
PvmDataInPlace – копирования не производится (сохраняются
указатели и размеры данных пользователя)

Слайд 25

Управление несколькими буферами

PVM допускает существование нескольких буферов, из которых в данный момент

Управление несколькими буферами PVM допускает существование нескольких буферов, из которых в данный
может быть активен только один буфер для отправки и в точности один буфер для приема сообщений. Активный буфер можно менять.

Слайд 26

Функции для управления несколькими буферами

int pvm_mkbuf(int encoding) – создает буфер возвращает идентификатор

Функции для управления несколькими буферами int pvm_mkbuf(int encoding) – создает буфер возвращает
созданного буфера
int pvm_freebuf(int bufid) – освобождает буфер
int pvm_getsbuf() – возвращает активный буфер для отправки сообщений
int pvm_getrvuf() – возвращает активный буфер для приема сообщений
int pvm_setsbuf(int bufid) – устанавливает активный буфер для отправки сообщений (возвращает id предыдущего буфера)
int pvm_setrbuf(int bufid) – устанавливает активный буфер для приема сообщений (возвращает id предыдущего буфера)

Слайд 27

Возможное применение нескольких буферов

За счет переключения между буферами удается
передавать сообщения без

Возможное применение нескольких буферов За счет переключения между буферами удается передавать сообщения
перекодировки:
bufid = pvm_recv( src, tag );
oldid = pvm_setsbuf( bufid );
info = pvm_send( dst, tag );
info = pvm_freebuf( oldid );

Слайд 28

Упаковка сообщений

int info = pvm_pkbyte( char *cp, int nitem, int stride )

Упаковка сообщений int info = pvm_pkbyte( char *cp, int nitem, int stride
int info = pvm_pkcplx( float *xp, int nitem, int stride ) int info = pvm_pkdcplx( double *zp, int nitem, int stride ) int info = pvm_pkdouble( double *dp, int nitem, int stride ) int info = pvm_pkfloat( float *fp, int nitem, int stride ) int info = pvm_pkint( int *np, int nitem, int stride ) int info = pvm_pklong( long *np, int nitem, int stride ) int info = pvm_pkshort( short *np, int nitem, int stride ) int info = pvm_pkstr( char *cp ) int info = pvm_packf( const char *fmt, ... )

Слайд 29

Посылка сообщений

int info = pvm_send( int tid, int msgtag )
tid –

Посылка сообщений int info = pvm_send( int tid, int msgtag ) tid
идентификатор процесса приемника msgtag – тэг сообщения
int info = pvm_mcast( int *tids, int ntask, int msgtag )
Посылка асинхронная.

Слайд 30

Посылка сообщений

int info = pvm_psend( int tid, void* p, int msgtag,
int

Посылка сообщений int info = pvm_psend( int tid, void* p, int msgtag,
cnt, int typ)
tid – идентификатор процесса приемника; msgtag – тэг сообщения;
cnt – число посылаемых элементов данных; typ – тип элементов данных;

Слайд 31

Типы

PVM_STR
PVM_BYTE
PVM_SHORT
PVM_INT
PVM_LONG
PVM_ULONG

PVM_FLOAT
PVM_CPLX
PVM_DOUBLE
PVM_DCPLX
PVM_UINT
PVM_USHORT

Типы PVM_STR PVM_BYTE PVM_SHORT PVM_INT PVM_LONG PVM_ULONG PVM_FLOAT PVM_CPLX PVM_DOUBLE PVM_DCPLX PVM_UINT PVM_USHORT

Слайд 32

Прием сообщений

int bufid = pvm_recv( int tid, int msgtag )
tid –

Прием сообщений int bufid = pvm_recv( int tid, int msgtag ) tid
идентификатор процесса отправителя msgtag – тэг сообщения
(Значение тэга или идентификатора сообщения, равное –1,
воспринимается как шаблон.)
Блокирующий прием сообщения. Освобождает старый (если последний
не был сохранен с помощью pvm_setrbuf) и создает новый активный буфер, который заполняет принятым сообщением
и возвращает его.

Слайд 33

Прием сообщений

int bufid = pvm_trecv( int tid, int msgtag, struct timeval* timeout

Прием сообщений int bufid = pvm_trecv( int tid, int msgtag, struct timeval*
)
Прием по таймауту.
tid – идентификатор процесса отправителя msgtag – тэг сообщения timeout – максимальное время блокировки возвращает 0, если сообщение не доставлено после прошествия
периода времени
int bufid = pvm_nrecv( int tid, int msgtag )
Неблокирующий прием – возвращает 0 в случае
если сообщение не пришло неготовности отправителя

Слайд 34

Распаковка

int info = pvm_upkbyte( char *cp, int nitem, int stride ) int

Распаковка int info = pvm_upkbyte( char *cp, int nitem, int stride )
info = pvm_upkcplx( float *xp, int nitem, int stride ) int info = pvm_upkdcplx( double *zp, int nitem, int stride ) int info = pvm_upkdouble( double *dp, int nitem, int stride ) int info = pvm_upkfloat( float *fp, int nitem, int stride ) int info = pvm_upkint( int *np, int nitem, int stride ) int info = pvm_upklong( long *np, int nitem, int stride ) int info = pvm_upkshort( short *np, int nitem, int stride ) int info = pvm_upkstr( char *cp ) int info = pvm_unpackf( const char *fmt, ... )

Слайд 35

Прием + распаковка

int pvm_precv( int tid, int msgtag, void *p, int cnt,

Прием + распаковка int pvm_precv( int tid, int msgtag, void *p, int
int typ,
int * rtid, int* rcnt, int * rtag)
Комбинирует прием и распаковку сообщения, состоящего из
однородных элементов. Возвращает (через параметры rtid, rcnt, rtyp) информацию о числе элементов в принятом сообщении,
идентификаторе процесса-передатчика и тэге сообщения.

Слайд 36

Нотификация о событии

int pvm_notify(int what, int msgtag, int cnt, int* tids)
what –

Нотификация о событии int pvm_notify(int what, int msgtag, int cnt, int* tids)
тип события (PvmTaskExit, PvmHostDelete, PvmHostAdd)
msgtag – тэг, который будет использован для нотификации
cnt – число элементов в массиве tids
tids – массив идентификаторов процессов, события которых подвергаются мониторингу (пуст, если PvmHostAdd)

Слайд 37

Нотификация о событии

При возникновении запрашиваемого события процессу, вызывавшему pvm_notify, посылается сообщение с

Нотификация о событии При возникновении запрашиваемого события процессу, вызывавшему pvm_notify, посылается сообщение
указанным тэгом.
Сообщение содержит id процесса, для которого произошло событие (одно сообщение на событие):
PvmTaskExit – id процесса, завершившего работу;
PvmHostDelete – id удаленного pvmd;
PvmHostAdd – id добавленного pvmd (не более cnt сообщений).
Имя файла: Parallel-Virtual-Machines.pptx
Количество просмотров: 175
Количество скачиваний: 2