Рис. 6.4. Некоторые возможные конфигурации для порождения PVM-задач |
При второ м порождении (с м. листин г б.1) создается пять задач, но в это м случае каждой задаче с по м о щ ью пара м етра argvпередается необходи м ал информация. Это — дополнительный способ передачи информации задачам при их запуске. Тем самы м сыновние задачи получают е щ е одну воз м ожность уникальны м образо м идентифицировать себя с по м о щ ью значений, получае м ых в пара м етре argv.В листин г е 6 .2,чтобы создать N задач, функция main() несколько раз (вместо одно г о) обра щ ается к функции pvm_spawn ().
// Листинг 6.2. Использование нескольких вызовов
// функции pvm_spawn() из функции main()
int main(int argc, char *argv[]) {
int Taskl; int Task2; int Task3; //.. .
pvm_spawn(«set_combination», NULL,1,«hostl»,l,&Taskl); pvm_spawn(«sec_combination»,argv,1,«host2»,1, &Task2); pvm_spawn(«set_combination»,argv++,l,«host3»,l,&Task3); //. . .
}
Подход к созданию задач, продемонстрированный в листин г е 6.2, можно использовать в том случае, ко г да нужно, чтобы задачи выполнялись на конкретных компьютерах. В этом состоит одно из достоинств PVM-среды. Ведь про г рамме ино г да стоит воспользоваться преимуществами некоторых конкретных ресурсов конкретно г о компьютера, например, специальным математическим спецпроцессором, процессором графическо г о устройства вывода или какими-то дру г ими возможностями. В листин г е 6.2 обратите внимание на то, что каждый компьютер выпол н яет один и тот же набор инструкций, но все они получили при этом разные ар г ументы командной строки. Вариант 2 (см. рис. 6.4) представляет сценарий, в котором функция main() не порождает PVM-задачи. В этом сценарии PVM-задачи ло г ически связаны с функцией funcB(), и поэтому здесь именно функция funcB() порождает PVM-задачи. Функциям main() и funcA() нет необходимости знать что-либо о PVM-задачах, поэтому им и не нужно иметь соответствую щ ий PVM-код. Вариант 3 (см. рис. 6.4) представл я ет сценарий, в котором функции main() и дру г им функциям в про г рамме прису щ естественный параллелизм. В этом случае роль «дру г их» функций и г рает функция funcA ().PVM-задачи, порождаемые функциями main() и funcA(), выполняют различный код. Несмотря на то что задачи, порожденные функцией main(), выпол н яют идентичный код, и задачи, порожденные функцией funcA(), выполняют идентичный код, эти два набора задач совершенно различны. Этот вариант иллюстрирует возможность C++-про г раммы использовать коллекции задач для о д новременно г о решения различных проблем. Ве д ь не су щ ествует причины, по которой на про г рамму бы нала г алось о г раничение решать в любой момент времени только о д ну проблему. Вариант 4 (см. рис. 6 .4)пре д ставляет случай, ко гд а параллелизм заключен внутри объекта, поэтому порождение PVM-задач реализует один из методов это г о объекта. Этот вариант показывает, что при необхо д имости параллелизм может исходить из класса, а не из «свободной» функции.
Как и в дру г их вариантах, все PVM-задачи, порожден н ые в варианте 4, выполняют одинаковый набор инструкций, но с различными данны м и. Этот SPMD -м етод (Single Program, Multiple-Data — одна програ м ма, множество потоков данных) часто используется для реализации параллельного решения проблем некоторого типа. И то, что язык С++ обладает по д держкой объектов и средств обоб щ енного программирования на основе шаблонов, делает его основным инстру м енто м при решении подобных задач. Объекты и шаблоны позволяют С++-программисту представлять обоб щ енные игибкие решения для различных проблем с помо щ ью одной-единственной программной единицы. Наличие единой программной единицы прекрасно вписывается в модель параллелиз м а SPMD. Понятие класса расширяет модель SPMD, позволяя решать целый класс пробле м. Шаблоны дают воз м ожность решать определенный класс проблем для практически любого типа данных. Поэтому, хотя все задачи в модели SPMD выполняют один и тот же код (програ мм ную единицу), он м ожет быть предназначен для любого объекта или л юбого из его пото м ков и рассчитан на раз л ичные типы данных (азначит, и на различные объекты!). Напри м ер, в листингеб.З используется четыре PVM-задачи для генерирования четырех множеств, в каждом из которых имеется C(n,r) элементов: C(24,9), C(24,12), C(7,4) и C(7,3). В частности, влистинге 6.3 перечисляются возможные сочетания из 24 цветов, взятые по 9 и по 12. Здесь также перечисляются возможные сочетания из 7 чисел с плаваю щ ей точкой, взятые по 4 и по 3. Пояснения пообозначению C(n,r) приведены в разделе $ 6.1 («Обозначение сочетаний»).
Читать дальше