Если вы хотите повысить производительность MergeSort с помощью распараллеливания, вам следует распараллелить разбиение (часть, которую вы выполняете до объединения результатов).Я предполагаю, что у вас есть несколько узлов ЦП.
Разделение: Пусть текущий узел ЦП сохранит одну половину массива и передаст другому узлу ЦП другую половину.Продолжайте повторять этот процесс.Параллелизм будет увеличиваться по мере того, как вы будете углубляться в дерево (как вы упомянули)
Базовый случай: Когда данные представляют собой один элемент, текущий узел ЦП отправляет их обратно на родительский узел.Родительские узлы будут ждать, пока дочерние узлы передадут данные, прежде чем выполнять любое объединение.
Объединение: После получения данных от дочернего узла, узел (родитель этого дочернего узла)может начать объединение полученных данных с собственными данными.После слияния он передает его на родительский узел и так далее.Поскольку каждый узел представляет собой отдельный процессор, объединение на более низких уровнях выполняется параллельно.Этот параллелизм уменьшается, когда мы поднимаемся по дереву.(так же, как вы упомянули)
Это должно ускорить сортировку слиянием.
Однако эта статья в Википедии http://en.wikipedia.org/wiki/Merge_sort#Parallel_processing показывает, что вы можете ускорить шаг слияния до O (1) распараллеливая и специализируя его (а также добавляя сортировку вставкой, когда размер данных <11) </p>
Мне любопытно, почему вы не используете Quicksort.Он прекрасно подходит для распараллеливания!
Edit:
Кроме того, почему мы не можем просто начать с объединения первых двух элементов в несортированном массиве, затем следующих двух и так далее?на.В основном избавиться от первой половины алгоритма?
И ответить на ваш вопрос:
Вот что делает сортировка слиянием, это слияниепервые 2, следующие 2 и так далее, но чтобы добраться до них, он использует рекурсию.Что делает время выполнения O (n * 2log (n)), потому что есть 2 дерева (одно создано при разбиении и одно создано при объединении в один большой список).Это относится к O (nlog (n)).
Возьмите свою идею, начните снизу, возьмите 2 на 2 числа и отсортируйте их.Затем увеличьте границы, чтобы охватить 2 блока (каждый w 2 номера) 4 номера ... и так далее.Вы строите дерево, от листьев до корня.Это похоже на алгоритм турнира (хотя там у вас может быть только один победитель - корень дерева).
Время выполнения: сначала у вас есть n чисел.Вы зацикливаетесь, поэтому устанавливаете границы для каждых 2 чисел O (n / 2), следующего уровня O (n / 4), следующего O (n / 8) и так далее.Для построения этого дерева требуется O (log (n)).Но вы все равно должны объединить другие номера в список.Поскольку у вас есть n чисел, то есть n * O (nlogn), что дает вам то же время выполнения, что и сортировка слиянием nlogn.
Резюме: Итак, я пытаюсь сказать, что ваша идеяслияния снизу еще долго.Вы избавляетесь от одного из деревьев, поэтому ускорение незначительно.