Parallel Virtual Machines. История создания Проект PVM был начат в 1989 году в Oak Ridge National Laboratory Первый релиз – Март 1991. Библиотека была.

Презентация:



Advertisements
Похожие презентации
Parallel Virtual Machines. История создания Проект PVM был начат в 1989 году в Oak Ridge National Laboratory Первый релиз – Март Библиотека была.
Advertisements

Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 4 Томский политехнический университет.
Лекция 6 Множественное распараллеливание на Linux кластере с помощью библиотеки MPI 1. Компиляция и запуск программы на кластере. 2. SIMD модель параллельного.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Введение в параллельные вычисления. Технология программирования MPI (день второй) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
Кафедра ЮНЕСКО по НИТ1 Коммуникационные операции «точка-точка» параллельное программирование.
Основы информатики Лекция. Функции Заикин Олег Сергеевич
Кафедра ЮНЕСКО по НИТ1 Передача упакованных данных Параллельное программирование.
Стадник Е. Г. ФПМИ НГТУ Руководитель: Городничев М.А., м.н.с. ИВМ и МГ СО РАН.
Многопоточное программирование. Виды параллелизма. Общая память Распределенная память.
Параллельное программирование с использованием технологии MPI Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 7 Томский политехнический университет.
Лабораторная работа 4. Подпрограммы. Задание на лабораторную работу Написать программу, реализующую хранение информации, указанной в вариантах индивидуальных.
Корпоративные системы Лекция 3. Реализация архитектуры «Клиент- сервер» с использованием механизма сокетов.
Программируемый клиент ORACLE Технология Pro C/C++
Введение в параллельные вычисления. Технология программирования MPI (день четвертый) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
MPI за 90 минут Метод погружения Сергей Петрович Нечаев, Сибирский Суперкомпьютерный центр.
УКАЗАТЕЛИ. Переменная - это именованная область памяти с заданным типом. [=значение]; int a; //Переменная типа integer с именем a int b=2;// Переменная.
Транксрипт:

Parallel Virtual Machines

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

Парадигма PVM pvmd3 pvm

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

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

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

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

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

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

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

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

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) Запуск процесса

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

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

Пример (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);

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(); }

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

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

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

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

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

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

Функции для управления несколькими буферами 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) – устанавливает активный буфер для приема сообщений

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

Упаковка сообщений 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,... )

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

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

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

Распаковка 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,... )

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