Мне нужно распараллелить алгоритм kruskal, в серийной версии использовался алгоритм поиска соединения для обнаружения цикла в неориентированном графе. Есть ли способ распараллеливать эту часть кода?Алгоритм поиска параллельного соединения
ответ
Ну, это может быть распараллелено до некоторой степени. Он выглядит следующим образом:
Первоначально все ребра сортируются в порядке возрастания. Существует main thread
, который фактически сканирует каждое ребро с самого начала и решает, добавляет ли текущий край цикл. Наша главная цель в параллелизации алгоритма состоит в том, чтобы сделать эти проверки параллельными.
Здесь мы используем worker threads
. Каждому потоку задано определенное количество ребер для проверки, где в каждом потоке проверяется, образуют ли его ребра цикл с текущим представлением после каждой итерации (итерация означает, что основной поток добавляет новый край). Поскольку основной поток продолжает добавлять ребра, некоторые потоки видят, что определенные ребра уже формируют цикл с текущим представлением.
Такие края обозначены как discarded
. Когда основной поток достигает таких краев, он просто переходит к следующему, не делая никаких проверок на нем.
Таким образом, мы проверили эти проверки параллельно, что означает, что алгоритм работает быстро, повышая эффективность.
Фактически, существует nice paper, который использует ту же идею, что и описанную выше.
EDIT:
Если вы в значительной степени обеспокоены бегущего времени все более-алгоритма, вы можете даже использовать алгоритм параллельной сортировки сначала как @ jarod42 предложил.
Легко ли использовать этот метод с openMP? Я имею в виду, что управление потоками с расписанием кажется трудным. – Betelgeuse
@Betelgeuse. Вы просто создадите потоки и назначьте определенное количество ребер каждому. Один из способов назначения - последовательный. И они будут проверяться после добавления нового края. Если все ребра, назначенные потоку, полностью обрабатываются основным потоком, то завершайте соответствующий рабочий поток. Думаю, это легко! – nitish712
- 1. Алгоритм параллельного рыцарского тура
- 2. Алгоритм параллельного компактирования коллектора
- 3. Захват данных параллельного соединения
- 4. Алгоритм для поиска вектора, параллельного плоскости и перпендикулярного другому вектору
- 5. Самый полезный алгоритм параллельного программирования?
- 6. Алгоритм параллельного фильтра в C#
- 7. Какие-либо предложения распределенного параллельного дерева поиска?
- 8. SQL соединения с сервером строка для большого параллельного соединения
- 9. Как определить наиболее эффективный алгоритм параллельного добавления?
- 10. Неожиданная производительность параллельного соединения в Java 8
- 11. Алгоритм поиска симметрии дерева
- 12. Алгоритм поиска нескольких критериев
- 13. Гарантии на алгоритмах параллельного поиска STL
- 14. Я ищу конкретный алгоритм поиска
- 15. Алгоритм для соединения множества точек?
- 16. Алгоритм эффективного управления ресурсами соединения
- 17. Apache2 в Freebsd Причина параллельного запроса Сброс соединения
- 18. Эффективный кортеж алгоритм поиска
- 19. алгоритм поиска близких друзей?
- 20. Алгоритм поиска текста
- 21. Алгоритм поиска положения тени
- 22. Алгоритм поиска радиальной сетки
- 23. алгоритм поиска списков
- 24. Алгоритм поиска шаблона
- 25. Алгоритм поиска скользящего окна
- 26. Алгоритм поиска набора соединений
- 27. Ускорить алгоритм Строка поиска
- 28. Как реализовать алгоритм поиска
- 29. Алгоритм внешнего поиска
- 30. C++ Линейный алгоритм поиска
Хороший вопрос! Но не могли бы вы показать нам код ваших попыток? –
Поскольку вся функция [Disjoint-set_data_structure] (http://en.wikipedia.org/wiki/Disjoint-set_data_structure) почти в постоянное время (но инициализация). Интересно, имеет ли смысл параллелизм в этих функциях ... Параллелизм может быть сделан для сортировки ребер. – Jarod42