чисел

void numericCombinations(int TaskId,int Choices) {

int MessageId = 2; int N;

double ImportantNumbers[7] =

{3.00e+8,6.67e-ll,1.99e+30,

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

1.67e-27,6.023e+23,6.63e-34,

3.14159265359}; N = pvm_initsend(PvmDataDefault); pvm_pkint(&Choices,1,1) ; pvm_send (TaskId,MessageId) ; N = pvm_initsend(PvmDataDefault); pvm_pkdouble (ImportantNumbers, 5,1) ; pvm_send (TaskId,MessageId) ;

}

В функции numericCombinations () из листинга 6.4 PVM-задача использует м ассив чисел с плаваю щ ей точкой, а не м ассив байтов, представл я ю щ их строки. Поэто м у функция colorCombinations() отправл я ет свои данные PVM-задача м с по м о щ ью вызовов таких функций:

pvrt_pkbyte(Buffer,strlen(Buffer) ,1) ; pvm_send(TaskId,MessageId) ;

А функция numericCombination( ) отправляет свои данные PVM-задача м таки м образом:

pvm_pkdouble (ImportantNumbers, 5,1) ; pvn_send(TaskId,MessageId) ;

Функция colorCombinations() в листинге6.4 создает строку названий цветов, азатем копирует ее в м ассив Buffer типа char. Этот м ассив затем упаковывается и отправляется PVM-задаче с помо щ ью функций pvm_pkbyte () и pvm_send (). Функция numericCombinations() в листинге6.5 создает массив типа double и отсылает его PVM-задаче с помо щ ью функций pvm_pkdouble () и pvm_send( ). Одна функция отправляет символьный массив, а другая — массив типа double. В обоих случалх PVM-задачи выполняют одну и туже программу pvm_generic_combination. Именно здесь нас выручает преиму щ ество использования С++-шаблонов. Одинаковые задачи благодаря этому могут работать не только с различными данными, но и с различными типами данных без изменения самого кода. Использование шаблонов в С++ позволяет сделать модель SPMD более гибкой и эффективной. Программе pvm_generic_combination практически безразлично, с какими типами данных ей придется работать. Использование контейнерных С++-классов позволяет генерировать любые комбинации векторов (vector<T>) объектов. Программа pvm_generic_combination «не знает», что она будет работать с двумя типами данных. В листин г е 6.6 представлен раздел кода из программы pvm_generic_combination.

// Листинг 6.6. Использование тега MessageId для //   распознания типов данных

pvm_bufinfo (N, &NumBytes, &MessageId, &Ptid) ; if(MessageId == 1){

vector<string> Source;

Buf = new char[NumBytes];

pvm_upkbyte(Buf, NumBytes,1);

strstream Buffer;

Buffer « Buf « ends,-

while(Buffer.good())

{

Buffer » Color;

if(!Buffer.eof()){

Source.push_back(Color);

}

}

generateCombinations<string>(Source, Ptid,Value); delete Buf;

}

if(MessageId == 2){

vector<double> Source; double *ImportantNumber; NumBytes = NumBytes / sizeof(double); ImportantNumber = new double[NumBytes]; pvm_upkdouble(ImportantNumber, NumBytes,1); copy (ImportantNumber,ImportantNumber +(NumBytes + 1), inserter(Source, Source.begin())); generateCombinations<double>(Source, Ptid,Value); delete ImportantNumber;

}

Здесь используется тег MessageId, позволяю щ ий распознать, с каким типом данных м ы работае м. Но в С ++ воз м ожно более удачное решение. Если тег MessageId содержит число 1, значит, м ы работае м со строка м и. Следовательно, м ожно сделать сле-лую щ ее объявление: vector<string> Source;

Если тег MessageId содержит число 2, то м ы знае м, что должны работать с числа м и с плаваю щ ей точкой, и поэто м уделае м такое объявление: vector<double> Source;

Объявив, какого типа данные будет содержать вектор Source, остальную часть функции в програ мм е pvm_generic_combination можно легко обоб щ ить. В листин- r e 6.6 обратите вни м ание на то, что каждая инструкция if() вызывает функцию generateCombinations (), которая является шаблонной. Эта шаблоннал архитектура позво л яет достичь такой степени универсальности, которая распростра н яет сце н арии SPMD и MPMD на наши PVM-програ мм ы. Мы вер н е м ся к обсуждению нашей програм м ы pvm_generic_combination после расс м отрения базовых механизмов PVM-среды. Важно отметить, что контейнерные С++-классы, потоковые классы и шаблонные алгорит м ы значительно усиливают гибкость PVM-програ мм ирования, которую невозможно было бы так просто реализовать в других PVM-средах. Именно такая гибкость создает воз м ожности д л я построения высокоорганизованных и элегантных парал л е л ьных архитектур.

Реализация модели MPMD (MIMD) с помощью PVM-и С++-средств

В то время как м оде л ь SPMD испо л ьзует функцию pvm_spawn () д л я создания некоторого чис л а задач, выпо л няю щ их одну и ту же програ мм у, но на потенциально раз

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату