Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Хьюз Камерон. Параллельное и распределенное программирование на С++ - royallib.ru.doc
Скачиваний:
117
Добавлен:
11.03.2016
Размер:
1.97 Mб
Скачать

Классические модели параллелизма, поддерживаемые системой pvm

Система PVM поддерживает модели MIMD (Multiple-Instruction, Multiple-Data— множество потоков команд, множество потоков данных) и SPMD (Single-Program, Multiple-Data — одна программа, множество потоков данных) параллелизма. В действительности SPMD — это вариант модели SIMD (Single-Instruction, Multiple-Data — один поток команд, множество потоков данных). Эти модели разбивают программы на потоки команд и данных. В модели MIMD программа состоит из нескольких параллельно выполняющихся потоков команд, причем каждому из них соответствует собственный локальный поток данных. По сути, каждый процессор здесь имеет собственную память. В PVM-среде модель MIMD считается моделью с распределенной памятью (в отличие от модели с общей памятью). В моделях с общей памятью все процессоры «видят» одни и те же ячейки памяти. В модели с распределенной памятью связь между хранимыми в ней значениями обеспечивается посредством механизма передачи сообщений. Однако модель SPMD подразумевает наличие одной программы (одного набора команд), которая параллельно выполняется на нескольких компьютерах, причем эти одинаковые на всех машинах программы обрабатывают различные потоки данных. PVM-среда поддерживает как MIMD-, так и SIMD-модели или их сочетание. Четыре классические модели параллелизма показаны на рис. 6.1.

Обратите внимание на то, что модели SISD и MISD (см. рис.6.1) неприменимы к системе PVM. Модель SISD описывает однопроцессорную машину, а для модели MISD вооб щ е трудно найти практическое применение. Две остальные модели, которые можно использовать с системой PVM, определяют, как С++-программа взаимодействует с компьютерами. Разработчик ПО представляет один логический виртуальный компьютер как среду для выполнения нескольких различных параллельных задач, каждая из которых получает доступ к собственным данным, либо одной задачи, выполняющейся в виде набора параллельных клонов, получаю щ их доступ к различным областям данных. Таким образом, с PVM-задачами мы будет связывать только модели, предполагаю щ ие наличие множества потоков команд и одной програм м ы.

Библиотека PVM для языка С++

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

• Управление процессами.

• Упаковка сооб щ ений и их отправка.

• Распаковка сооб щ ений и их прием.

• Обмен задач сигналами.

• Управление буферо м сооб щ ений.

• Функции обработки инфор м ации и служебные процедуры.

• Групповые операции.

Эти библиотечные функции легко интегрировать в С++ среду. Префикс pvm_ в имени каждой функции позволяет не забыть о ее принадлежности соответствующему пространству имен. Для использования PVM-функций необходимо включить в программу заголовочный файл pvm3 . h и скомпоновать ее с библиотекой libpvm. В программах 6.1 и 6.2 демонстрируется, как работает простая PVM-программа. Инструкции по компиляции и выполнению программы 6.1 приведены в разделе «Профиль програ мм ы 6.1».

// Программа 6.1

#include «pvm3.h» #include <iostream> #include <string.h>

int main(int argc,char *argv[]) {

int RetCode,MessageId;

int PTid, Tid;

char Message[100j;

float Result[l];

PTid = pvm_mytid();

RetCode = pvm_spawn(«program6-2»,NULL,0,''",l,&Tid);

if(RetCode == 1){

MessageId = 1;

strcpy(Message,«22»);

pvm_initsend(PvmDataDefault);

pvm_pkstr(Message);

pvm_send(Tid,MessageId);

pvm_recv(Tid,MessageId);

pvm_upkfloat(Result,1,1);

cout « Result[0] « endl;

pvm_exit();

return(0) ;

}

else{

cerr << «Задачу породить невозможно. " « endl;

pvm_exit();

return(1) ;

}

}

Профиль программы 6.1

Имя программы |program6 -1.cc

Описание |Использует функцию pvn_send{) для пересылки числа в другую PVM-задачу, которая выполняется параллельно с данной (программа6.2), и функцию pvm_recv() для получения числа от этой задачи.

Требуемая библиотека libpvm3

Требуемые заголовки <pvm3.h> <iostream> <string.h>

Инструкции по компиляции и компоновке программ

gcс++ -о program6-l -I $PVM_ROOT/include -L $PVM_ROOT/lib/ | SPVM_ARCH -1 pvm3

*Среда для тестирования

Solaris8,PVM 3.4.3, SuSE Linux 7.1, gcc 2.95.2.

Инструкции по выполнению ./program6-l

Примеча н ия Необходимо запустить на выполнение программу pvmd.

В програм м е 6.1 использовано восе м ь са м ых распространенных PVM-функций: pvm_mytid(), pvm_spawn(), pvm_initsend(), pvm_pkstr(), pvm_send (), pvm_recv (), pvm_upkfloat () и pvm_exit (). Функция pvm_mytid () возвращает идентификатор вызываю щ его процесса (задачи). PVM-систе м а связывает идентификатор задачи с кажды м процессо м, который ее создает. Идентификатор задачи ис пользуется для отправки сооб щ ений задача м, получения сооб щ ений от других задач, сигнализации, прерывания задач и т.п. Любая PVM-задача м ожет связываться с любой другой PVM-задачей до тех пор, пока не получит доступ к ее идентификатору. Функция pvm_spawn( ) предназначена для запуска нового PVM-процесса. В программе 6.1 функция pvm_spawn () используется для запуска на выполнение программы 6.2. Идентификатор новой задачи возвра щ ается в параметре &Tid вызова функции pvm_spawn (). В PVM-среде для передачи данных между задачами используются буфе ры сооб щ ений. Каждая задача может иметь один или несколько таких буферов. При этом только один из них считается активным. Перед отправкой каждого сооб щ ения вызывается функция pvm_initsend() , которая позволяет подготовить или инициа л изировать активный буфер сообщений. Функция pvm_pkstr () используется для упаковки строки, содержащейся в пара м етре Message. При упаковке строка шифруется для передачи другой за д аче (в другой процесс), выполняе м ой, воз м ожно, на друго м компьютере с другой архитектурой. PVM-среда обрабатывает элементы, связанные с преобразованием из одной архитектуры в другую. Среда PVM требует применять процедуру упаковки сооб щ ения до его отправки и проце д уру распаковки при его получении, чтобы с д елать сооб щ ение читабельным д ля получателя. О д нако из этого правила су щ ествует исключение, которое мы обсу д им ниже. Функции pvm_send() и pvm_recv() используются для отправки и приема сообщений соответственно. Параметр MessageId просто опре д еляет, с каким сооб щ ением работает отправитель. Обратите внимание на то, что в программе 6.1 функции pvm_send( ) и pvm_recv( ) со д ержат и д ентификатор за д ачи, получаю щ ей д анные, и и д ентификатор за д ачи, отправляю щ ей данные, соответственно. Функция pvm_upkfloat() извлекает полученное сооб щ ение из активного буфера сооб щ ений и распаковывает его, сохраняя в массиве типа float. Программа 6 порождает PVM-задачу для выполнения программы 6.2.

Обратите внимание на то, что обе программы 6.1 и 6.2 содержат обра щ ение к функ ции pvm_exit (). Эту функцию необходимо вызывать при завершении PVM обработки задачи. Несмотря на то что функция pvm_exit () не разрушает процесс и не прекращает его выполнение, она позволяет PVM-среде освободиться от задачи и отсоединить за дачу от PVM-среды. Обратите внимание на то, что программы 6.1 и 6.2 — вполне авто номные и независимые програ мм ные модули , которые содержат функцию main (). Де тали реализации програ мм ы 6.2 приведены в разделе «Профиль програ мм ы 6.2».

// Программа 6.2

#include «pvm3.h» #include «stdlib.h»

int main(int argc, char *argv[])

int MessageId, Ptid;

char Message[100];

float Num,Result,-Ptid = pvm_parent();

MessageId = 1;

pvm_recv(Ptid,MessageId) ;

pvm_upkstr(Message) ; Num = atof(Message); Result = Num / 7.0001r pvm_initsend(PvmDataDefault); pvm_pkfloat(&Result,1,1); pvm_send(Ptid,MessageId); pvm_exit(); return(0);

Профиль программы 6.2

Имя программы program6-2.cc

Описание Эта программа принимает число от родительского процесса и делит его на 7. Затем она отправляет результат своему родительскому процессу.

Требуемая библиотека libpvm3 . .

Требуемые заголовки < pvm3.h> <stdlib.h>

Инструкции по компиляции и компоновке программы

ф^У--о-^годгат6-2 -I $PVM_ROOT/include program6~2.cc -L : /^^_RCX)T/lib/PVM_ARCH -lpvm3

Среда для тестирования

|fiuJJE Onux 7.1 gnu С++ 2.95.2, Solaris 8 Workshop 6, PVM 3.4.3. У4нструкции по выполнению Эта программа порождается программой 6.1. |Примечания

Необходимо запустить на выпол н ение программу pvmd.

Компиляция и компоновка C++/PVM-npoгpaмм

Версия 3.4.x PVM-среды представлена в виде единой библиотеки libpvm3 . а. Чтобы скомпилировать PVM-программу, необходимо включить в ее код заголовочный файл pvm3.h и скомпоновать ее вместе с библиотекой libpvm3.а :

$ с++ -о mypvm_program -I $PVM_ROOT/include program.cc -L$PVM_ROOT/lib -lpvm3

Переменная среды $PVM_ROOT указывает на каталог, в котором инсталлирована библиотека PVM. При выполнении этой команды создается двоичный файл mypvm_program.

Для выполнения программ 6.1 и 6.2 сначала необходимо инсталлировать PVM-среду. Выполнить PVM-программу можно одним из трех основных способов: запустить автономный выполняемый (двоичный) файл, использовать PVM-консоль или среду XPVM.