Программа MPI QuickSort

79
7

Я новичок, пытаясь отредактировать программу. У меня есть программа MPI, которая делит массив на подмножества, мастер отправляет подмножества в подчиненные устройства, они выполняют quicksort и затем возвращают отсортированные числа в мастер, чтобы он мог записать их в файл. То, что я пытаюсь сделать, - сделать быстрый сорт еще быстрее. Моя идея состоит в том, чтобы заставить master разделить массив и отправить подмножества на рабов, но сохранить его для себя. Затем снова разделим их на новые подмножества (например, если у нас есть числа от 1 до 100 в массиве, новые подмножества должны быть от 1 до 25, от 26 до 50, от 51 до 75 и от 76 до 100), а затем сохранить первое подмножество ( 1 до 25) для себя, отправьте второй (от 26 до 50) первому рабочему, третьему (от 51 до 76) ко второму ведомому и т.д. Ведомые должны сделать то же самое. Затем он должен выполнить quicksort, и подчиненный должен вернуть отсортированные числа хозяину. Я надеюсь, что таким образом сортировка должна быть быстрее. Проблема в том, что, как я уже сказал, я новичок, и мне нужна помощь с идеями, советами и даже кодом, чтобы я мог достичь своей цели.

спросил(а) 2021-01-19T14:36:53+03:00 9 месяцев, 1 неделя назад
1
Решение
65

Для этого ответа я придерживаюсь предположения, что это должно быть сделано с помощью Quicksort, и что данные считываются в одном процессе. Просто имейте в виду, что существует много сложных методов параллельной сортировки.

Ваша идея разделения чисел на подмножества проблематична, потому что она делает предположения о форме данных. Для неравномерно распределенных наборов данных он даже не поможет узнать минимум и максимум. Лучше просто отправить одинаковое количество чисел каждому процессу, разрешить сортировку и затем объединить данные.

Для слияния вы начинаете с ntasks отсортированных под-списков, и хотите в итоге получить один. Наивное слияние неоднократно искал минимальный элемент в каждом под-списке, удалял его и добавлял в окончательный список. Это требует ntasks * N сравнений, N свопов и памяти N * 2. Вы можете оптимизировать сравнение с log2(ntasks) * N, выполнив фактическую сортировку слияния, но для этого также нужны log2(ntasks) * N swaps. Вы можете дополнительно уточнить это, сохранив log2(ntasks) * N или указатели на их первый элемент) в очереди приоритетов, что должно дать вам log2(ntasks) * N сравнения и N свопов.

Об использовании MPI:

Не используйте MPI_Isend & MPI_Wait сразу после друг друга. В этом случае вместо этого используйте MPI_Send. Используйте немедленные варианты только в том случае, если вы действительно можете сделать что-то полезное между MPI_Isend и MPI_Wait. По возможности используйте коллективные операции. Чтобы распространять данные от корня до всех MPI_Scatter, используйте MPI_Scatter или MPI_Scatterv. Первое требует, чтобы все ранги получали одинаковое количество элементов, что также может быть достигнуто путем заполнения. Чтобы собирать данные с ведомых в главном, используйте MPI_Gather или MPI_Gatherv. 1 Коллектив легче получить, потому что они описывают операцию высокого уровня. Их реализация, как правило, сильно оптимизирована. Чтобы получить сообщение неизвестного размера, вы также можете отправить сообщение напрямую и использовать MPI_Probe со стороны приемника, чтобы определить размер. Вам даже разрешено MPI_Recv с буфером, который больше, чем отправленный буфер, если вы знаете верхнюю границу.

1 Вы также можете рассмотреть шаг слияния как сокращение и распараллелить необходимые вычисления для этого.

ответил(а) 2021-01-19T14:36:53+03:00 9 месяцев, 1 неделя назад
47

В принципе ваше решение выглядит очень хорошо. Я не понимаю полностью, если для больших файлов вы собираетесь обрабатывать их в кусках или в целом. По моему опыту я предлагаю вам назначить как можно больше блоков для подчиненных. Таким образом, довольно дорогостоящие операции передачи сообщений выполняются только очень редко.

Я не могу понять в вашем вопросе, какова общая цель вашей программы. Вы намерены сортировать полные входные файлы параллельно? Если это так, вам понадобится какая-то сортировка слияния, которая будет применяться к результатам, полученным от отдельных процессов.

ответил(а) 2021-01-19T14:36:53+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема