Раздел IV.
Информатика
8. Стефанюк В.Л. Теоретические аспекты разработки компьютерных систем обучения: учеб. пособие. Саратов: СГУ, 1995. 98 с.
В.В. Заярный К ВОПРОСУ О Р-ПРОЦЕССОРНОМ СЛИЯНИИ
Параллельная сортировка N элементов наp процессорах, когда N >> p может быть реализована следующим образом. Входную последовательность можно разбить на p частей, отсортировать каждую часть на отдельном процессоре а затем слить упорядоченные последовательности.
В этом, а также в некоторых других случаях возникает необходимость слияния упорядоченных последовательностей [1, 2, 3].
Из полученных p частей длиной N/p посредством сдваиваемых слияний получить выходную отсортированную последовательность за log2(p) этапов.
Слияние каждой пары последовательностей может происходить на одном процессоре. В этом случае на первом этапе задействовано p/2 процессоров, на втором этапе - p/4, а на последнем -один процессор. Остальные процессоры простаивают.
Временная сложность такого слияния - T(p/2)= 0(2*N).
В [1, 2] показано, как можно производить слияние при параллельной работе нескольких процессоров с временной сложностью T(p) = 0(N/p*log2(p)).
Поскольку сливаются отсортированные данные, для нахождения конечных индексов для каждого процессора достаточно обеспечить (с учетом устойчивости), чтобы конечный элемент из первой сливаемой последовательности для текущего процессора был меньше либо равен следующему за конечным элементом из второй сливаемой последовательности и конечный элемент из второй сливаемой последовательности для текущего процессора был меньше следующего за конечным элементом из первой сливаемой последовательности. В отсортированных последовательностях можно организовать двоичный поиск соответствующих элементов.
В данной работе предлагается алгоритм, отличающийся от [1, 2] упрощением программной реализации. Обозначения переменных ниже приводятся в соответствии со стандартами языков программирования.
На первом этапе пара входных последовательностей сливаются двумя процессорами, на втором - четырьмя, а на последнем - p процессорами.
Для этой цели необходимо реализовать подзадачу - слить две входных последовательности длиной N1 и N2 параллельно работающими Pn процессорами.
Ниже будет рассмотрен случай слияния при сортировке по неубыванию.
Для обеспечения параллельной работы необходимо выделить свой отрезок выходной последовательности для каждого из Pn процессоров, а также найти соответствующие им отрезки входных последовательностей.
Далее будут использованы следующие обозначения: A1[N1], A2[N2] - две отсортированные по неубыванию последовательности разной длинны; N1, N2 - длины этих последовательностей; N12 = N1 + N2 - выходная последовательность; Pn - число процессоров;
Kpi - длина в выходной последовательности, приходящаяся на i-й процессор;
j1, j2 - начальные индексы в 1-й и 2-й последовательностях для текущего процессора;
jE1, jE2 - конечные индексы в 1-й и 2-й последовательностях
i1, i2 - длины во входных последовательностях, приходящихся на текущий процессор. St1 - шаг изменения размеров длин входных последовательностей.
Длина выходной последовательности, приходящейся на i-й процессор будет: Kpi = (i+1) *N12/Pn - i*N12/Pn, где i = 1..Pn-1;
Начальные индексы для входных последовательностей имеют значения: j1 = 0 и j2 = 0.
Вестник ТГПИ
Естественные науки
Проведя нахождения длин во входных последовательностях, приходящихся на текущий процессор, а затем для каждой пары входных последовательностей, можно произвести попарное параллельное слияние всех входных последовательностей.
Алгоритм нахождения длин во входных последовательностях, приходящихся на текущий процессор конструируется следующим образом. Алгоритм 1 (без полной формализации).
1. Установить начальные значения.
Взяв jE1 и jE2 из только что означенного цикла (вычисления длин последовательностей для предыдущего процессора), выполнить:
если jE1 > N1, значения i2 и i1 корректируются так, чтобы получить jE1 : = N1 и St1 := (i2+1)/2; если jE2 > N2, значения i2 и i1 корректируются так, чтобы получить jE2 := N2 и St1 := (i1+1)/2. Считаем, что в A1[N1+1] и A1[N2+1] записаны бесконечно большие числа.
2. Если исчерпаны входные последовательности, или, если (A1[jE1]<A2[jE2+1]) & (A2[jE2]<=A1 [jE1+1]) = True, то выполняется переход к п.6 (выход).
3. Если A1[jE1]>=A2[jE2+1], то увеличивается i1 и уменьшается i2 на шаг St1. Вслед за тем выполняется jE1:=j1+i1 и jE2:=j2+i2, а также St1 := (St1+1)/2;
если при этом jE1 > N1, то корректируются i2 и i1 так, чтобы получить jE1 := N1 и
St1 := (i2+1)/2.
4. Если A2[jE2]>A1[jE1+1], увеличиваем i2 и уменьшаем i1 на шаг St1. Вычисляем jE1:=j1+i1 и jE2:=j2+i2, а также St1: = (St1+1)/2;
если при этом jE2 > N2, корректируем i2 и i1 так, чтобы получить jE2 := N2 и St1 := (i1+1)/2.
5. Перейти к п.2
6. Выход
Поскольку внутри цикла значение St1 на каждом шаге уменьшается вдвое, работа алгоритма 1 закончится за log2(Kpi) шагов.
После работы этого алгоритма мы имеем соответствующий отрезок выходной последовательности, а также соответствующие отрезки входных последовательностей для текущего процессора.
Повторив вычисления для каждого процессора, а затем для каждой пары входных последовательности (это займет 0(p*log2(Kpi)) шагов), можно произвести попарное параллельное слияние всех входных последовательностей.
Через log2(p) попарных слияний получим отсортированную выходную последовательность. Достигается окончательная оценка временной сложности слияния вида T(p) = 0(N/p*log2(p)), где p - число процессоров.
Таким образом, при наличии процедур сортировки для одного процессора можно реализовать многопроцессорную сортировку.
Если есть несколько процедур сортировки, лучше использовать ту, которая не имеет «худшего случая» (например, пирамидальную сортировку или сортировку слиянием), поскольку переход к слиянию происходит после сортировки всех отдельных частей входной последовательности.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Кнут Д. Искусство программирования. Сортировка и поиск. М.: Мир, 1978. 844 с. Т. З.
2. Ромм Я.Е. Параллельная сортировка слиянием по матрицам сравнений. I // Кибернетика и системный анализ. 1994. № 5. С. 3-23.
3. Ромм Я.Е. Параллельная сортировка слиянием по матрицам сравнений. II // Кибернетика и системный анализ. 1995. № 4. С. 13-37.