« endl; pvm_exit() ;
}
return(0);
}
В листинге 6.3 обратите внимание на порождение четырех PVM-задач: pvm_spawn(«pvm_generic_combination» ,NULL, 0, н » ,4,TaskId) ;
Каждая порожденнал задача должна выполнять програ м му с именем pvm _generic_combination. Аргу м ент NULL в вызове функции pvm_spawn() означает, что через параметр argv[] не передаются никакие опции. Значение 0 в вызове функции pvm_spawn () свидетельствует, что нас не беспокоит, на каком ко м пьютере будет выполняться наша задача. Аргу м ент TaskId представляет м ассив, предназначенный для хранения четырех целочисленных значений, который при условии успешного выполнения функции pvm_spawn () будет содержать идентификаторы каждой порожденной PVM-задачи. В листингеб.З обратите также вни м ание на вызов функций colorCombinations () и numericCombinations (). Они «дают работу» PVM-задачам. Определение функции colorCombinations () представлено в листинге 6.4.
// Листинг 6.4. Определение функции colorCombinations()
void colorCombinations(int TaskId,int Choices) {
int MessageId =1; char *Buffer; int Size; int N;
string Source(«blue purple green red yellow orange
silver gray "); Source.append(«pink black white brown light_green
aqua beige cyan "); Source.append(«olive azure magenta plum orchid violet
maroon lavender»); Source. append (" \n**) ;
Buffer = new char[(Source.size() + 100)]; strcpy(Buffer,Source.c_str()); N = pvm_initsend(PvmDataDefault); pvm_pkint(&Choices,1,1); pvm_send(TaskId,MessageId); N = pvm_initsend(PvmDataDefault); pvm_pkbyte(Buffer,strlen(Buffer),1); pvm_send(TaskId,MessageId); delete Buffer;
}
В листингеб.З от м етьте два обращения к функции colorCombinations(). Каждое из них велит PVM-задаче перечислить различное количество сочетаний цветов: C(24,9) и C(24,12). Первал PVM-задача д олжна сгенерировать 1 307 504 цветовых сочетаний, а вторал — 2 704 156. Эту работу выполняет програм м а, заданнал в вызове функции pvm_spawn (). Каждый цвет представляется строкой. Следовательно, програ мм а pvm_generic_combination (с по м ощью функции colorCombinations()) генерирует сочетания цветов, используя в качестве входных данных набор строк. Но когда она орулует «рука м и» функции numericCombinations (), показанной в листинге 6.5, в качестве входных данных используется набор чисел с плавающей точкой. Код листинга 6.3 также содержит два вызова функции numericCombinations (). Первый генерирует C(7,4) сочетаний, а второй — C(7,3).
// Листинг 6.5. Использование PVM-задач для генерирования // сочетаний чисел
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) ;