Алгоритм параллельного обхода дерева

From
Gennady Mayko ()
To
Mike Roschin
Date
2002-10-10T15:35:02Z
Area
RU.ALGORITHMS
From: "Gennady Mayko" <gennady.mayko@broadcom.com>

Sat Oct 05 2002 22:54, Mike Roschin wrote to Gennady Mayko:

 MR> Reply to msg from Gennady Mayko(2:5020/400)
 MR> To All written 01.Oct.2002, 11:27
 MR> Ave Gennady Mayko!

 GM>> Есть некоторое дерево, точная структура его не известна. Какие есть
 GM>> алгоритмы полного обхода дерева 

 MR> ВОзможно, что я чего-то не понимаю, но IMHO есть один-единствный способ
 MR> обхода дерева: взался за корешок -> обошел левую ветку -> обошел правую
 MR> ветку. Небольшие нюансы - непринципиальны.

 GM>> с использованием нескольких потоков (процессоров)? 
 GM>> Количество узлов дерева гораздо больше, чем количество потоков,
 GM>> которые практически можно создать.

 MR> PROCEDURE ОбходДерева ( КорневойУзел : УзелДерева );
 MR>   BEGIN
 MR>     ВыполнитьОперациюНадУзлом ( КорневойУзел );

 MR>     IF ЕстьСвободныйПроцесс THEN    
 MR>       ЗапуститьПроцесс ( ОбходДерева ( КорневойУзел->Левое ) );
 MR>     ELSE
 MR>       ОбходДерева ( КорневойУзел->Левое );
 MR>     END;

 MR>     IF ЕстьСвободныйПроцесс THEN    
 MR>       ЗапуститьПроцесс ( ОбходДерева ( КорневойУзел->Правое ) );
 MR>     ELSE
 MR>       ОбходДерева ( КорневойУзел->Правое );
 MR>     END;

 MR>   END ОбходДерева;

 MR> Примерно так. В рельности придется добавить массу приседаний для
 MR> взаимоувязывания процессов, как то: обеспечить реентерабельность процедур
 MR> обработки, локнуть обращение к разделяемым ресурсам, в зависимости от
 MR> организации мультитридовой надстройки согласовать проверку наличных
 MR> пустых тридов и запуск нового трида.
--
Как раз "приседания" и интересуют :) Понятно, что базовых алгоритмов прохода
дерева не так уж много и они хорошо известны.

Например, интересует соотношение "количество потоков" / "количество доступных
CPU". Microsoft рекомендует для Windows выбирать "количество потоков" =
"количество доступных CPU" и, наверное, в этом есть резон. Тогда для
несерверных версий Windows NT4/W2K/XP можно, например, предложить такой
алгоритм - один поток проходит по дереву по "левой" стороне, второй - по
"правой" и, забирая узел для обработки, "атомарно" помечает его. Помеченный
узел в каждом потоке пропускается.

Понятно, что следует уменьшать накладные расходы (как, например, не запускать
каждый раз новый поток, как в алгоритме выше, а использовать свободный поток
из некоторого пула). Тогда нужно организовывать что-то вроде FIFO для хранения
узлов для обработки. Иметь одно FIFO, скорее всего, невыгодно, так как оно
может быть BottleNeck. Тогда интересно определить оптимальную конфигурацию
потоков и этих FIFO.

Ну и так далее.

 MR> Get Warped 3.0!  \\Thesis 

С уважением,
Геннадий Майко.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)