Параллельное и распределенное программирование на С++ - Хьюз Камерон
Шрифт:
Интервал:
Закладка:
Для описания синхронизации данных используются некоторые типы алгоритмов модели PRAM. Стратегию доступа EREW (исключающее чтение и исключающая запись) можно реализовать с помощью мьютексного семафора. Мьютексный семафор защищает критический раздел, обеспечивал последовательный вход в него. Эта стратегия разрешает либо доступ для чтения, либо доступ для записи. Стандарт POSIX определяет мьютексный семафор типа pthread_mutex_t , который можно использовать для реализации стратегии доступа EREW. Чтобы реализовать стратегию доступа CREW (параллельное чтение и исключающая запись), можно использовать блокировки чтения-записи. Стратегия доступа CREW описывает возможность удовлетворения множества запросов на чтение, но при монопольной записи данных. Стандарт POSIX определяет объект блокировки для обеспечения чтения-записи типа pthread_rwlock_t , а объектно-ориентированный подход к синхронизации данных позволяет встроить механизм синхронизации в объект данных.
Объединение возможностей параллельного программирования и C++ средств на основе PVM
Мы разделили нашу проблему на две части: сгенерированную программу и процесс обучения. Эти две части остаются тесно связанными. Нельзя ожидать, что сгенерированная машина окажется удачной с первой же попытки. Необходимо поэкспериментировать с обучением одной такой машины и посмотреть, как пойдет этот процесс обучения... Алан Тьюринг (Alan Turing), Может ли машина думать?
Система програм м ного обеспечения PVM (Parallel Virtual Machine — параллельная виртуальная м ашина) предоставляет разработчику ПО средства для написания и выполнения программ, использующих параллелизм. Система PVM позволяет разработчику представить коллекцию сетевых компьютеров в виде единой логической машины с возможностями параллелизма. Компьютеры этой коллекции могут иметь одинаковые или различные архитектуры. В PVM-систему связываются даже компьютеры, которые попадают в категорию MPP (Massively Parallel Processor — процессор с массовым параллелизмом). Несмотря на то что PVM-программы могут разрабатываться для одного компьютера, реальные преимущества этой системы проявляются при связывании двух и более компьютеров.
6.1. Классические модели параллелизма, поддерживаемые системой PVM
Система PVM в качестве средства связи между параллельно выполняющимися задачами поддерживает модель передачи сообщений. Приложение взаимодействует с PVM посредством библиотеки, которая состоит из API-интерфейсов, предназначенных для управления процессами, отправки и получения сообщений, сигнализации процессов и т.д. С++-программа взаимодействует с PVM-библиотекой точно так же, как с любыми другими библиотеками функций. С++-программе для получения доступа к функциям РVM-библиотеки не нужно создавать специальную форму или архитектуру,в то врем я как программам, написанным на других я зыках, необходимо вызывать определенные функции для инициализации среды. Это означает, что С++-программист может сочетать PVM-возможности с другими стилями С++-программирования (например, объектно-ориентированным, параметризованным, агентно-ориентированным и структурированным программированием). Благодаря использованию таких библиотек, как PVM, MPI или Linda, С++-разработчик может реализовать различные модели параллелизма, тогда как другие языки ограничены примитивами параллелизма, которые встроены в сами языки. Библиотека PVM предлагает, пожалуй, самый простой способ расширения средств языка С++ за счет возможностей параллельного программирования.
Классические модели параллелизма, поддерживаемые системой 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) ;