Метод объединения и разделения циклических участковпоследовательных наследуемых программ

УДК 681.3

Д. Б. Борзов, С. А. Дюбрюкс, В. С. Титов

МЕТОД ОБЪЕДИНЕНИЯ И РАЗДЕЛЕНИЯ ЦИКЛИЧЕСКИХ УЧАСТКОВ ПОСЛЕДОВАТЕЛЬНЫХ НАСЛЕДУЕМЫХ ПРОГРАММ

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

Ключевые слова: распараллеливание, программа, объединение, разделение, цикл, линейка, участок, метод.

В настоящее время все большее распространение получает использование большого количества процессоров (до нескольких сотен) для решения поставленных задач [1]. В то же время значительная часть задач остается последовательными [2], в связи с этим для повышения производительности необходимо назначать на разные процессоры отдельные части одной задачи. Очевидно, что различные подзадачи при этом должны оставаться независимыми без потери логики исходного алгоритма, в связи с чем необходимо выявлять независимые подалгоритмы внутри последовательных программ. Значительная часть современных алгоритмов состоит из циклических участков [3], на обработку которых используется ощутимая часть ресурсов вычислительной системы.

В настоящей статье предложен метод объединения и разделения циклических участков последовательных исполняемых программ, развиваются идеи, представленные в работах [4, 5].

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

Введем исходные обозначения.

1. Множество операторов задается массивом M = тiJ- ^ 5, где i = N — порядковые

номера операторов, N — общее число операторов.

2. Vj = 1, Em, = N0pN , где N0p — порядковые номера элементов массиваМ, i = 1, N.

3. Vj = 2, Em 2 = VN , где V — уровень вложенности i-го оператора, i = 1, N.

4. Vj = 3, Ет з = CbegN, где Сьеё — начальное значение счетчика цикла, в который

вложен i-й оператор, i = 1, N.

5. Vj = 4, Ет = Cend , где Cend — конечное значение счетчика цикла, в который

вложен i-й оператор, i = 1, N.

6. У/ = 5, Ет^ = Сп^ , где Сп — порядковые номера циклов, / = 1, N.

На первом этапе при использовании метода осуществляются поиск и выделение на описанном массивом М фрагменте программы участка из циклов, подлежащих объедине-

нию. Операторы, составляющие тела этих циклов, должны иметь одинаковый уровень вложенности.

Рассмотрим более подробно данный этап на примере следующего алгоритма. Счетчик С( используется для подсчета числа операторов, составляющих выделяемый участок программы, переменная Level используется для перебора возможных значений уровня вложенности от первого до максимального для всего фрагмента программы значения LevMax, переменная Copy2 используется для копирования нижней границы искомого участка, i и к являются вспомогательными переменными.

1. Level=1.

2. i = 1.

3. Если y(i)=Level, то С±=1; А(СГ_)=М(1); LowSide=i (иначе п. 9),

4. k=i+1.

5. Если V(k)=Level, то Сь= Сь+1; А(Сь)=М(к) (иначе п. 8).

6. к=к+1.

7. Если k=N, то п. 8 ( иначе п. 5).

8. Если Ct>1, то Copy2 = = LowSide; переход на 2 этап (иначе п. 10

9. i=i+1.

10. Если i=N, то п. 11 (иначе п. 3).

11. Level=Level+1.

12. Если Level>LevMax, то конец (иначе п. 2).

Данные о выделенных участках заносятся во вспомогательный массив A =

a

Nx5 '

имеющий одинаковую структуру с массивом М.

Опишем работу приведенного алгоритма на следующем примере. Пусть дан массив М с числом операторов N = 9, где максимальное значение уровня вложенности V равно 2 (табл. 1).

Таблица 1

Nop V C ^bea C ^end C ^n

1 0 1 12 0

2 1 1 15 1

3 1 1 20 2

4 1 1 20 2

5 1 1 12 3

6 0 13 15 0

7 1 13 15 4

8 2 16 20 5

9 0 16 20 0

В п. 1 алгоритма переменной Level присваивается значение 1, т.е. выполняются поиск и выделение групп операторов первого уровня вложенности. В п. 2 счетчику i операторов присваивается значение 1. В результате значение первого элемента вектора V меньше значения переменной Level, поэтому содержимое счетчика i увеличивается на единицу (i=2). Так как значение второго элемента вектора V равно значению переменной Level, то счетчику Ct операторов образуемой группы присваивается значение 1, а нижней границе LowSide будущего участка — значение i: LowSide=2. Элемент 2 массива М копируется на место элемента 1 вспомогательного массива А. В п. 4 инициализируется вспомогательная переменная к=3. Значение третьего элемента вектора V равно значению переменной Level, поэтому содержание счетчика Ct увеличивается на единицу: Ct =2. В то же время элемент 3 массива М перемещается (копируется) на место второго элемента вспомогательного массива А. В п. 6 к=4. Так как к меньше общего числа операторов, осуществляется переход к п. 5. Значение четвертого элемента вектора V равно значению переменной Level, следовательно, Ct увеличивается на единицу: Ct =3. При этом элемент 4 массива М копируется на место элемента 3 вспомогательного массива А и к=5. Так как к<9, то осуществляется переход к п. 5. Так как значение пятого элемента вектора V равно значению переменной Level, содержимое счетчика Ct увеличивается

на единицу: Ct =4, а элемент 5 массива М копируется на место элемента 4 вспомогательного массива А, при этом и увеличивается на единицу переменная k: k=6. Значение шестого элемента вектора V не равно значению переменной Level, следовательно, осуществляется переход к п. 8. Так как Ct>1, то искомый участок выбран, значение его нижней границы (2) сохраняется в переменной Copy2, осуществляется переход к следующему этапу.

На втором этапе происходит объединение всех циклов выделенного участка в один с минимальным значением счетчика Cbeg с последующим разделением оставшихся участков, затем — объединение по новому минимальному значению Cbeg среди счетчиков конца цикла c дальнейшим разделением и т.д., пока количество циклов объединения/разделения не станет равным числу циклов на участке, уменьшенному на единицу.

Исходными данными этапа 2 являются массив A =

a

Nx 5

(табл. 2), значение Ct счет-

чика количества операторов выделенного на первом этапе участка, суммарное количество циклов этого участка Мах^с, и его нижняя граница LowSide.

Таблица 2

Nop V Cbeg Cend C

2 1 1 15 1

3 1 1 20 2

4 1 1 20 2

5 1 1 12 3

Этап состоит из многоитерационной процедуры поиска минимума среди элементов Cend с последующей модификацией элементов Cbeg и Cn при объединении циклов участка и копирования информации, характеризующей операторы, при разделении циклов. Процесс представляется следующим алгоритмом, в котором HighSide — верхняя граница участка, х — счетчик числа итераций объединения/разделения, Min — переменная для поиска минимума среди конечных значений счетчиков циклов, Copyl — переменная для копирования значений границ участка, z — вспомогательная переменная:

1. HighSide=Ct; LowSide=1.

2. x=1.

3. Если хф1, то HighSide=LowSide+1.

4. Min=Cend(LowSide).

5. z= LowSide+1.

6. Если Cend(z)=Min then Min= Cend(z).

7. z=z+1.

8. Если z>HighSide, то п. 9 (иначе п. 6).

9. Copy1= HighSide.

10. z= LowSide.

11. Если Cend ( z )>Min, то Cend ( z )=Min, Cbeg( z+Ct )=Min+1;

Nop(z+ Ct )= Nop(z)+ Ct; Cn(z)=x.

12. Cn (z+ Ct )= Cn(z); Copy1= Copy1 + 1.

13. z=z+1.

14. Если z>HighSide, то п. 14 (иначе п. 11).

15. LowSide= HighSide+1; HighSide=Copy1.

16. x=x+1.

17. Если x= Max Nc-1, то переход на этап 3 (иначе п. 4).

Рассмотрим работу данного алгоритма на примере выходных данных первого этапа, которые состоят из массива А (табл. 2), нижней границы LowSide=2, суммарного количества циклов участка MaxNc=3 и длины участка, равной значению счетчика Ct =4.

В п. 1 значению начальной верхней границы участка присваивается значение HighSide= Ct =4 и нижней границы — LowSide=1, т.е. на первой итерации обработка ведется среди элементов а1;1—а41. В п. 2 счетчику х числа итераций присваивается начальное значение 1. На первой итерации модификация границ участка поиска минимума не производится,

за минимум принимается значение 0^(0=15, соответствующее первому элементу массива А. Значение нижней границы участка, увеличенное на единицу, присваивается счетчику г перебора участка: г=2. Значение Сеп1с(2) больше минимума, поэтому г увеличивается на единицу: г=3. Так как значение 2 меньше верхней границы, элемент вектора Сеп1с(3) сравнивается с минимумом. Значение Сеп1с(3) больше минимума, поэтому содержание счетчика увеличивается и становится равным четырем. Так как значение 2 равно верхней границе, элемент вектора Сеп,с(4) сравнивается с минимумом. Сеп1с(4) больше минимума, следовательно, минимуму присваивается значение СепсС(4)=12. Далее 2 = 5 — что больше верхней границы, следовательно, осуществляется переход к п. 9 и копируется значение верхней границы Highside в переменную Сору1. В п. 10 счетчику г нижней границы перебора участка присваивается значение 1. Так как Сеп1с(1) больше минимума, то в п. 11 минимуму присваивается значение Сеп1с(1), а элемент массива А(1) копируется в элемент А(5), при этом происходит модификация значений СешС(1)=]^п=12; СЪе§(5)=]у^п+1=13, С„(1)=1 и Сп(5)=4, а также увеличивается значение копии верхней границы: Сору1=5. В п. 12 осуществляется приращение значения г: г=2; Так как г<4, то происходит переход к п. 11. Поскольку Сеп1с(2) больше минимума, то в п. 11 элементу вектора Сеп1с(2) присваивается значение минимума, при этом элемент массива А(2) копируется в элемент А(6), осуществляются модификация значений СешС(1)=]^п=12, СЪеё(5)=]^п+1=13, Сп(2)=1, Сп(6)=5 и увеличение значения копии нижней границы Сору1=Сору1+1=6. Далее значение г увеличивается на единицу: г=3. Так как г<4, то осуществляется переход к п. 11. Элемент вектора Сеп1с(3) больше минимума, поэтому в п. 11 ему присваивается значение минимума, а элемент массива А(3) копируется в элемент А(7), при этом происходит модификация следующих значений: СешС(1)=]^п=12, СЪеё(5)=]^п+1=13, Сп(3)=1, Сп(7)=6. Затем происходит увеличение на единицу значения копии нижней границы и счетчика г: Сору1=7, г=4. Так как г=4, то происходит переход к п. 11. Значение СепсС(4) равно минимуму, следовательно, осуществляются переход к п. 13 и приращение на единицу значения г: г=5. Так как г>4, то переходим к п. 14 и модифицируем границы участка поиска минимума: LowSide= Highside+1=5; нighSide=Copy1=7. В п. 15 содержимое счетчика итераций х увеличивается, поиск минимума и копирование элементов массива А, меньших минимума, повторяются. В данном примере необходимо выполнить три итерации, после чего массив А примет вид, представленный в табл. 3. После выполнения последней итерации управление передается третьему этапу.

Таблица 3

V с ^Ъеа с ^епсС с ^п

2 1 1 12 1

3 1 1 12 1

4 1 1 12 1

5 1 1 12 1

6 1 13 15 2

7 1 13 15 2

8 1 13 15 2

9 1 16 20 3

10 1 16 20 3

На третьем этапе происходит вставка в исходный массив М вспомогательного массива А с помощью нижеприведенного алгоритма, в котором значения переменных Сору1 и Сору2 заимствуются из предыдущих этапов, ^ и к — вспомогательные переменные для индексации массивов А и М.

1. й=Сору1 - Сору2.

2. б=Ы.

3. М(Б+Ь)=М(Б).

4. з=з-1.

5. Если з<Сору2, то п. 6 (иначе п. З).

6. Б=2.

7. М(Б)=Л(Б).

8. з=з+1.

9. Если з>0ору2, то Ы=Ы+Ь; 2=0ору1+1; передача управления на этап 1 (иначе п. 7).

В приведенном алгоритме происходит нахождение длины И отрезка массива М, который необходимо освободить для вставки массива А (п. 1 алгоритма), затем перезапись элементов массива М в память на расстояние И (пп. 2—5 алгоритма), а также вставка элементов массива А в массив М (пп. 6—9 алгоритма), что при копировании всех данных, характеризующих операторы, приводит к эквивалентному преобразованию программы. В п. 9 число операторов программы увеличивается на И, счетчик операторов — на Сору1+1, и управление передается п. 10 первого этапа. Аналогичным образом осуществляются обработка оставшихся элементов вектора V и поиск участков, содержащих операторы уровня вложенности 1, после чего содержимое счетчика х уровня вложенности на первом этапе увеличивается на 1. Так как при х=2 участков для объединения/разделения в рассматриваемом фрагменте программы нет, массив М примет окончательный вид (табл. 4).

Таблица 4

Мор V с ^Ъеа с ^епсС с ^п

1 0 1 12 0

2 1 1 12 1

3 1 1 12 1

4 1 1 12 1

5 1 1 12 1

6 1 13 15 2

7 1 13 15 2

8 1 13 15 2

9 1 16 20 3

10 1 16 20 3

11 0 13 15 0

12 1 13 15 4

13 2 16 20 5

14 0 16 20 0

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

список литературы

1. Трахтенгерц Э. А. Введение в теорию анализа и распараллеливания программ ЭВМ в процессе трансляции. М.: Наука, 1981. С. 184—187.

2. Воеводин В. В. Математические модели и методы в параллельных системах. М.: Наука, 1986.

3. Дюбрюкс С. А., Борзов Д. Б., Титов В. С. Выявление параллелизма внутри линейных участков последовательных программ со связями по управлению // Сб. тр. XIV Междунар. науч.-технич. конф. „Машиностроение и техносфера XXI века". Т. 2. Донецк, 2007. С. 26—30.

4. Борзов Д. Б., Дюбрюкс С. А., Титов В. С. Метод выявления параллелизма внутри линейных участков последовательных программ и его аппаратная реализация // Изв. вузов. Приборостроение. 2008. Т. 51, № 2. С. 34—38.

5. Воеводин В. В., Воеводин Вл. В. Параллельные вычисления. СПб: БХВ-Петербург, 2002. 608 с.

Дмитрий Борисович Борзов

Сергей Александрович Дюбрюкс Виталий Семенович Титов

Рекомендована кафедрой вычислительной техники

Сведения об авторах

канд. техн. наук, доцент; Курский государственный технический университет, кафедра вычислительной техники; E-mail: borzovdb@kursknet.ru

аспирант; Курский государственный технический университет, кафедра вычислительной техники; E-mail: serhio5551@yandex.ru д-р техн. наук, профессор; Курский государственный технический университет, кафедра вычислительной техники; зав. кафедрой; E-mail: titov@vt.kstu.kursk.ru

Поступила в редакцию 12.09.08 г.