Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемТарас Яшин
1 Parallel Virtual Machines
2 История создания Проект PVM был начат в 1989 году в Oak Ridge National Laboratory Первый релиз – Март Библиотека была полностью переписана в 1993 году. Версия 3.3, которая и будет рассматриваться далее.
3 Парадигма PVM pvmd3 pvm
4 Работа пользователя в PVM Запуск PVM. Создание виртуальной машины. Запуск процесса приложения, который порождает другие процессы.
5 Запуск приложения pvmd3 pvm app
6 Консоль PVM Консоль PVM предоставляет возможность контроля всех процессов виртуальной машины. Она используется для конфигурирования параллельной машины; запуска и завершения процессов виртуальной машины; получения информации о запущенных процессах; Консоль является отдельным процессом PVM, может быть запущена или завершена в любой момент.
7 Управление виртуальной машиной с консоли pvm> add hostname добавление узла в виртуальную машину pvm> delete hostname удаление узла из виртуальной машины pvm> conf печать конфигурации виртуальной машины pvm> halt завершить работу всех демонов и закрыть PVM
8 Работа с процессами pvm> spawn task запуск процесса с именем task pvm> kill tid прерывание выполнения задания pvm> ps печать списка запущенных процессов pvm> reset завершение всех запущенных задач
9 Другие команды консоли pvm> spawn task запуск процесса с именем task pvm> kill tid прерывание выполнения задания pvm> ps печать списка запущенных процессов
10 Способы запуска приложения Из командной строки. Из консоли pvm на локальной или удаленной машине. Из приложения с помощью функции pvm_spawn на локальной или удаленной машине.
11 Управление виртуальной машиной из программы int pvm_add_hosts(char** hosts, int nhosts, int* infos); hosts – список имен добавляемых машин nhosts – число добавляемых машин infos – коды ошибок ( < 0 означает ошибку) возвращает число корректно добавленных узлов int pvm_del_hosts(char** hosts, int nhosts, int* infos);
12 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) Запуск процесса
13 Различные примеры запуска процессов
14 Завершение задания Выход из параллельной машины: int pvm_exit(); стандартная последовательность вызова: pvm_exit(); exit(); Принудительное завершение процесса по идентификатору: int pvm_kill(int tid);
15 Пример (hello.c) main() { int cc, tid, msgtag; char buf[100]; printf("i'm t%x\n", pvm_mytid()); cc = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid);
16 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(); }
17 Пример (hello_other.c) #include "pvm3.h" main() { int ptid, msgtag; char buf[100]; ptid = pvm_parent();
18 strcpy(buf, "hello, world from "); gethostname(buf + strlen(buf), 64); msgtag = 1; pvm_initsend(PvmDataDefault); pvm_pkstr(buf); pvm_send(ptid, msgtag); pvm_exit(); }
19 int tid = pvm_mytid( void ) Возвращает номер задания. Если процесс не включен в PVM, то добавляет его (как и любой другой первый вызов PVM). int tid = pvm_parent( void ) Возвращает идентификатор процесса, запустившего данный или PvmNoParent, если такого нет.
20 Обмен сообщениями Посылка: 1.Инициализация буфера. 2.Упаковка в буфер данных. 3.Посылка данных. Прием: 1.Прием данных в буфер. 2.Распаковка данных из буфера.
21 Посылка сообщений. int bufid = pvm_initsend( int encoding ) Очищает буфер посылки сообщений и инициализирует кодировку. encoding: PvmDataDefault – кодировка XDR (самый общий случай) PvmDataRaw – кодировка отсутствует (однородная платформа) PvmDataInPlace – копирования не производится
22 Управление несколькими буферами PVM допускает существование нескольких буферов, из которых в данный момент может быть активен только один буфер для отправки и в точности один буфер для приема сообщений. Активный буфер можно менять.
23 Функции для управления несколькими буферами int pvm_mkbuf(int encoding) – создает буфер возвращает идентификатор созданного буфера int pvm_freebuf(int bufid) – освобождает буфер int pvm_getsbuf() – возвращает активный буфер для отправки сообщений int pvm_getrvuf() – возвращает активный буфер для приема сообщений int pvm_setsbuf(int bufid) – устанавливает активный буфер для отправки сообщений int pvm_setrbuf(int bufid) – устанавливает активный буфер для приема сообщений
24 Возможное применение нескольких буферов За счет переключения между буферами удается передавать сообщения без перекодировки: bufid = pvm_recv( src, tag ); oldid = pvm_setsbuf( bufid ); info = pvm_send( dst, tag ); info = pvm_freebuf( oldid );
25 Упаковка сообщений 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,... )
26 Посылка сообщений int info = pvm_send( int tid, int msgtag ) tid – идентификатор процесса приемника msgtag – тэг сообщения int info = pvm_mcast( int *tids, int ntask, int msgtag ) Посылка асинхронная.
27 Прием сообщений int bufid = pvm_recv( int tid, int msgtag ) tid – идентификатор процесса отправителя msgtag – тэг сообщения (Значение тэга или идентификатора сообщения, равное –1, воспринимается как шаблон.) Блокирующий прием сообщения. Очищает старый (если он не является активным для отправки сообщений) и создает новый активный буфер, который заполняет принятым сообщением и возвращает его.
28 Прием сообщений int bufid = pvm_trecv( int tid, int msgtag, struct timeval* timeout ) Прием по таймауту. tid – идентификатор процесса отправителя msgtag – тэг сообщения timeout – максимальное время блокировки возвращает 0, если сообщение не доставлено после прошествия периода времени int bufid = pvm_nrecv( int tid, int msgtag ) Неблокирующий прием – возвращает 0 в случае если сообщение не пришло неготовности отправителя
29 Распаковка int info = pvm_upkbyte( char *cp, int nitem, int stride ) int 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,... )
30 Нотификация о событии int pvm_notify(int what, int msgtag, int cnt, int* tids) what – тип события (PvmTaskExit, PvmHostDelete, PvmHostAdd) msgtag – тэг, который будет использован для нотификации cnt – число элементов в массиве tids tids – массив идентификаторов процессов, события которых подвергаются мониторингу (пуст, если PvmHostAdd) При возникновении запрашиваемого события процессу, вызывавшему pvm_notify, посылается сообщение с указанным тэгом
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.