Аноним

Параллельные алгоритмы вычисления компонент связности и минимальных остовных деревьев: различия между версиями

Материал из WEGA
м
Строка 46: Строка 46:




Алгоритм для EREW с временем исполнения O(log n), предложенный в [1], основан на некоторых структурных свойствах, связанных с минимальными остовными деревьями, и способен вычислять элементы <math>B_i \;</math> более независимым образом. У этого алгоритма имеются <math>\lfloor log \; n \rfloor</math> одновременных потоков (поток представляет собой группу процессоров). Для <math>1 \le i \le \lfloor log \; n \rfloor</math> поток (i) пытается вычислить <math>B_i \;</math>, начиная работу задолго до того, как поток (i-1) вычислит <math>B_{i-1} \;</math>, и получая результаты работы потоков от 1 до i-1 (т.е. <math>B_1, ..., B_{i-1} \;</math>) по мере продвижения. Говоря более точно, алгоритм выполняется за <math>\lfloor log \; n \rfloor</math> меташагов, где каждый меташаг выполняется за время O(1). Поток (i) выдает в результате <math>B_i \;</math> по окончании i-го меташага. Вычисление потока (i) разбито на <math>\lfloor log \; n \rfloor</math> фаз. Вначале рассмотрим простой случай, когда i представляет собой степень двойки. Фаза 1 потока (i) начинается на (i/2 + 1)-м меташагу, т.е. когда <math>B_1, ..., B_{i/2} \;</math> уже доступны. Фаза 1 занимает не более i/4 меташагов и заканчивается на (i/2 + i/4)-м меташагу. Фаза 2 начинается на (i/2 + i/4 + 1)-м меташагу, т.е. когда уже доступны <math>B_{i/2+1}, ..., B_{i/2 + i/4} \;</math>, и занимает i/8 меташагов. Каждая последующая фаза использует вдвое меньше меташагов, чем предшествующая ей. Последняя фаза (log i) начинается и заканчивается на i-м меташагу; заметим, что <math>B_{i-1} \;</math> доступно после (i-1)-го меташага.
Алгоритм для EREW с временем исполнения O(log n), предложенный в [1], основан на некоторых структурных свойствах, связанных с минимальными остовными деревьями, и способен вычислять элементы <math>B_i \;</math> более независимым образом. У этого алгоритма имеются <math>\lfloor log \; n \rfloor</math> одновременных потоков (поток представляет собой группу процессоров). Для <math>1 \le i \le \lfloor log \; n \rfloor</math> поток (i) пытается вычислить <math>B_i \;</math>, начиная работу задолго до того, как поток (i-1) вычислит <math>B_{i-1} \;</math>, и получая результаты работы потоков от 1 до i-1 (т.е. <math>B_1, ..., B_{i-1} \;</math>) по мере продвижения. Говоря более точно, алгоритм выполняется за <math>\lfloor log \; n \rfloor</math> меташагов, где каждый меташаг выполняется за время O(1). Поток (i) выдает в результате <math>B_i \;</math> по окончании i-го меташага. Вычисление потока (i) разбито на <math>\lfloor log \; i \rfloor</math> фаз. Вначале рассмотрим простой случай, когда i представляет собой степень двойки. Фаза 1 потока (i) начинается на (i/2 + 1)-м меташагу, т.е. когда <math>B_1, ..., B_{i/2} \;</math> уже доступны. Фаза 1 занимает не более i/4 меташагов и заканчивается на (i/2 + i/4)-м меташагу. Фаза 2 начинается на (i/2 + i/4 + 1)-м меташагу, т.е. когда уже доступны <math>B_{i/2+1}, ..., B_{i/2 + i/4} \;</math>, и занимает i/8 меташагов. Каждая последующая фаза использует вдвое меньше меташагов, чем предшествующая ей. Последняя фаза (log i) начинается и заканчивается на i-м меташагу; заметим, что <math>B_{i-1} \;</math> доступно после (i-1)-го меташага.


== Применение ==
== Применение ==
4430

правок