Параллельное программирование: Учебное пособие, страница 67

P = 0;                                           // Внутреннее имя первого процессора

for (char **cPtr = plist; *cPtr != 0; cPtr++)

P++;

proc_names = plist;          // Теперь сохраняются процессорные имена

}

Ранее в тексте 3.4 исследовался параллельный поиск решения на двоичном дереве, при выполнении которого создавались новые процессы для исследования поддеревьев в каждой не концевой вершине графа. При этом, каждый процесс выполнялся в новом процессорном объекте. В тексте 3.9 этой же программы на выбранном наугад процессоре размещается каждая вновь созданная пара: процессорный объект – процесс. Реализация такого поведения выполнена на основе класса  Mapping  из текста 3.8.

Текст 3.9. – Использование конструкторов отображения

Mappingmapping;                                   // Переменная типа отображения

global class Tree

{

public:

int search(int);                         // Объявление функции поиска

Tree(Mapping m) {mapping = m;} // Функция инициализации

};

int Tree::search(int A)

{   // Определение функции поиска, как функции-члена класса Tree

int ls, rs;

if (leaf(A))

{

if solution(A)

return(1);

else

return(0);

}

else

{                            // Создание новых процессорных объектов

Tree *global lobj = new Tree(mapping);

Tree *global robj =

new (mapping.random_p()) Tree(mapping);

par

{// Создание процессов для поиска поддеревьев

ls  = lobj->search(left_child(A));

rs  = robj->search(right_child(A));

}

delete(lobj); 

delete(robj);

return(ls + rs);

}

}

void main(int argc, char *argv[])

{

char *nodes[] = read_nodes();   // Чтение узла и активация

information mapping.initmap(nodes);       // отображения

Tree *global searcher = new Tree(mapping);

int total = searcher->search(1);

printf("There were %   s

}

Имеются три существенных различия между этим текстом программы и текстом 3.4:

1)  Во-первых, в начале главной процедурыmain определяется и инициализируется глобальный объект Mapping для того, чтобы включить имена процессоров, на которых должна выполниться программа. Эти имена читаются из файла.

2)  Во вторых, заготовлен конструктор для процессорного объекта класса Tree, который в момент создания нового процессорного объекта копирует ему объект Mapping.

3)  В-третьих, некий распределенный процессорный объект вызывает функцию search дополненную обращением к random_p, которая и передает proc_t структуру случайно выбранному процессору.

3.5.9  Отображение процессов на процессорные объекты

Другой способ отображения в СС++ состоит в том, чтобы сначала создать заданное число процессорных объектов, а затем в них поместить процессы. Этот подход часто используется на вычислительных структурах SPMD, когда один и тот же, единственный процесс размещен на каждом процессорном объекте. Сюда же можно отнести и случаи, когда прикладная программа для вычислений создает большое количество простых процессов, которые взаимодействуют только через глобальные указатели. Такие процессы можно распределить на постоянном числе процессорных объектов, избегая тем самым накладных расходов на создание нового процессорного объекта в момент его создания. Поскольку процессы используют локальные структуры данных не совместно, то их отображение на процессорные объекты не влияет на результат вычислений.

В тексте 3.10 определяется класс POArray, который используется для создания массива процессорных объектов заданного размера и типа. С этой целью класс POArray вводит функцию инициализации init, которая создает процессорные объекты. Параметры этой функции определяют количество и имена процессоров, на которых должны быть размещены процессорные объекты. Функция init сначала многократно обращается к create_pobj, создавая массив процессорных объектов с типом POArrayNode. Этот тип инициализирует процессорные объекты путем вызова функции init_pobj с копией объекта POArray в качестве параметра. Ключевое слово this, использованное в последней строке текста 3.10, является указателем на объект, из которого происходило обращение. То есть специально функции передачи данных не готовятся.