Я посещаю класс алгоритмов, и кажется, что алгоритмы «разделяй и властвуй» могут быть реализованы с использованием параллельной обработки. Всегда ли это так?
Все ли алгоритмы «разделяй и властвуй» используют параллелизм?
- Любой алгоритм может быть реализован с использованием параллельной обработки. Вопрос, который вы действительно хотите задать, заключается в том, должны ли они быть такими. IE: Есть ли в этом какая-то польза. 08.11.2013
Ответы:
Да, но не обязательно эффективно.
Алгоритмы «разделяй и властвуй» лучше всего подходят (легче для понимания) для параллелизма на уровне задач. Эти задачи являются рекурсивными, а рекурсивные задачи можно объяснить как иерархию дерева задач. Иерархии дерева задач можно рассматривать как несколько вызовов функции с разными параметрами. Некоторые вызовы функций будут ожидать выполнения других (т. е. своих дочерних элементов), что доступно на параллельном жаргоне как *wait*o или join, если они выполняются асинхронно или доступны непосредственно в синхронных исполнениях (блокировка вызовов будет ожидать результатов автоматически). Все эти операции доступны практически в каждом параллельном фреймворке.
Но связь между параллельными задачами может быть дорогостоящей в зависимости от размера данных параметров. Если разделение и распределение вашей задачи на более мелкие части (по сети для выполнения на нескольких компьютерах или между процессами для многоядерных вычислений) занимает больше времени, чем выполнение частей, вы не получите прироста производительности. Фактически вы потеряете производительность.
Преобразование последовательного алгоритма «разделяй и властвуй» в его параллельный аналог проще при использовании фреймворка, допускающего иерархию задач, такую как задачи OpenMP в C/C++ или SCOOP в Python (доступны многие другие).