2014-02-12 3 views
3

Мне нужно распараллелить алгоритм kruskal, в серийной версии использовался алгоритм поиска соединения для обнаружения цикла в неориентированном графе. Есть ли способ распараллеливать эту часть кода?Алгоритм поиска параллельного соединения

+0

Хороший вопрос! Но не могли бы вы показать нам код ваших попыток? –

+0

Поскольку вся функция [Disjoint-set_data_structure] (http://en.wikipedia.org/wiki/Disjoint-set_data_structure) почти в постоянное время (но инициализация). Интересно, имеет ли смысл параллелизм в этих функциях ... Параллелизм может быть сделан для сортировки ребер. – Jarod42

ответ

3

Ну, это может быть распараллелено до некоторой степени. Он выглядит следующим образом:

Первоначально все ребра сортируются в порядке возрастания. Существует main thread, который фактически сканирует каждое ребро с самого начала и решает, добавляет ли текущий край цикл. Наша главная цель в параллелизации алгоритма состоит в том, чтобы сделать эти проверки параллельными.

Здесь мы используем worker threads. Каждому потоку задано определенное количество ребер для проверки, где в каждом потоке проверяется, образуют ли его ребра цикл с текущим представлением после каждой итерации (итерация означает, что основной поток добавляет новый край). Поскольку основной поток продолжает добавлять ребра, некоторые потоки видят, что определенные ребра уже формируют цикл с текущим представлением.

Такие края обозначены как discarded. Когда основной поток достигает таких краев, он просто переходит к следующему, не делая никаких проверок на нем.

Таким образом, мы проверили эти проверки параллельно, что означает, что алгоритм работает быстро, повышая эффективность.

Фактически, существует nice paper, который использует ту же идею, что и описанную выше.

EDIT:

Если вы в значительной степени обеспокоены бегущего времени все более-алгоритма, вы можете даже использовать алгоритм параллельной сортировки сначала как @ jarod42 предложил.

+0

Легко ли использовать этот метод с openMP? Я имею в виду, что управление потоками с расписанием кажется трудным. – Betelgeuse

+1

@Betelgeuse. Вы просто создадите потоки и назначьте определенное количество ребер каждому. Один из способов назначения - последовательный. И они будут проверяться после добавления нового края. Если все ребра, назначенные потоку, полностью обрабатываются основным потоком, то завершайте соответствующий рабочий поток. Думаю, это легко! – nitish712

Смежные вопросы