// Листинг 6.6. Использование тега MessageId для // распознания типов данных
pvm_bufinfo (N, &NumBytes, &MessageId, &Ptid) ; if(MessageId == 1){
vector 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(Source, Ptid,Value); delete Buf;
}
if(MessageId == 2){
vector 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(Source, Ptid,Value); delete ImportantNumber;
}
Здесь используется тег MessageId,позволяю щ ий распознать, с каким типом данных м ы работае м. Но в С++ воз м ожно более удачное решение. Если тег MessageIdсодержит число 1,значит, м ы работае м со строка м и. Следовательно, м ожно сделать сле-лую щ ее объявление: vector Source;
Если тег MessageIdсодержит число 2,то м ы знае м, что должны работать с числа м и с плаваю щ ей точкой, и поэто м уделае м такое объявление: vector 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() д л я создания некоторого чис л а задач, выпо л няю щ их одну и ту же програ мм у, но на потенциально раз л ичных наборах данных и л и ресурсов, м оде л ь MPMD испо л ьзует функцию pvm_spawn() д л я создания задач, которые выпо л няют раз л ичные програм м ы на раз л ичных наборах данных. Как с помо щ ью одной С++-программы реализовать модель MPMD (на основе PVM-функций), показано в л истинге 6.7.
6.2. Библиотека PVM для языка С++ 231
// Листинг 6.7. Использование PVM для реализации // MPMD-модели вычисления
int main(int argc, char *argv[]) {
int Taskl[20]; int Task2[50]; int Task3[30]; //...
pvm_spawn («pvm_generic_combination», NULL, 1,
«hostl»,20,Taskl); pvm_spawn («generate_plans», argv, 0, "", 50, Task2) ; pvm_spawn(«agent_filters»,argv++,l, «host 3»,30,&Task3) ; //.. .
}
При выполнении кода, представленного в листинге 6.7, создается 100 задач. Первые 20 задач генерируют сочетания. Слелующие 50 по мере создания сочетаний генерируют планы на их основе. Последние 30 задач отфильтровывают самые удачные планы из набора планов, сгенерированного предыдущи м и 50 задачами. Уже только это краткое описание позволяет ощутить отличие модели MPMD от модели SPMD, в которой все программы, порожденные функцией pvm_spawn(), были одинаковы. Здесь же за работу, назначаемую PVM-задача м, «отвечают» програ мм ы pvm_generic_combination, generate_plansи agent_filters.Все эти задачи выполняются параллельно и работают с собственны м и набора м и данных, нес м отря на то что одни наборы являются результато м преобразования дру г их. Про г ра мм а pvm_generic_combinationпреобразует свой входной набор данных в набор, который зате м может использовать программа generate_plans.Программа generate_plans,в свою очередь, преобразует входной набор данных в набор, который может затем использовать программа agent_filters.Очевидно, что эти задачи должны обмениваться сообщениями. Эти сообщения представляют собой входную иуправляющую информацию, которая передается между процесса м и. Необходи м о также отметить, что в листинге 6.7 функция pvm_spawn() используется для размещения 20 задач pvm_generic_combinationна компьютере с именем hostl.Задача generate_plansбыла размещена на 50 безымянных процессорах, но каждая из этих 50 задач получила при это м один и тот же аргу м ент ко м андной строки с по м ощью параметра argv.Задачи agent_filtersтакже были направлены на конкретный ко м пьютер (с именем host 3),и каждая задача получила один и тот же аргумент командной строки посредством параметра argv.Этот пример — лишь еще одно подтверждение гибкости и мо щ и библиотеки PVM. Некоторые варианты реализации модели MPMD с использованием среды PVM показаны на рис. 6.5.
Читать дальше