Параллельное и распределенное программирование на С++
Шрифт:
Обратите внимание на то, что модели SISD и MISD (см. рис.6.1) неприменимы к системе PVM. Модель SISD описывает однопроцессорную машину, а для модели MISD вооб щ е трудно найти практическое применение. Две остальные модели, которые можно использовать с системой 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. Идентификатор новой задачи
Обратите внимание на то, что обе программы 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