Научная статья на тему 'Применение преобразования циклов «Retiming» с целью уменьшения количества используемых регистров'

Применение преобразования циклов «Retiming» с целью уменьшения количества используемых регистров Текст научной статьи по специальности «Математика»

CC BY
202
20
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ОПТИМИЗИРУЮЩИЙ КОМПИЛЯТОР / RETIMING / ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ / ПРЕОБРАЗОВАНИЯ ЦИКЛОВ / ГРАФ ЗАВИСИМОСТИ ПО ДАННЫМ / РЕГИСТРЫ / OPTIMIZING COMPILERS / PARALLEL COMPUTATIONS / LOOPS TRANSFORMATIONS / DATA DEPENDENCE GRAPH / REGISTERS

Аннотация научной статьи по математике, автор научной работы — Штейнберг Олег Борисович, Ивлев Иван Анатольевич

Рассматривается распараллеливающее преобразование программ «retiming». Это преобразование создавалось для того, чтобы увеличить степень распараллеливаемости программных циклов. Авторы данной работы предлагают его использовать для экономии используемых при вычислениях регистров. Преобразованием используется граф зависимостей по данным, вершинам и дугам которого присваиваются веса. Далее, исходя из полученных весов, строится результирующий код. В работе рассматривается область применения преобразования, а также вспомогательные преобразования, способные ее расширить. Данное преобразование может быть использовано оптимизирующими компиляторами. Авторами данной работы оно программно реализовано и добавлено в Оптимизирующую распараллеливающую систему (ОРС).

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

APPLICATION OF loopS transformation «retiming» to reduce THE number of registers used

The paper discusses the parallelizing transformation of programs «retiming». This transformation was created in order to increase the degree of parallelism of program loops. The authors of this paper suggest using it to save the registers used in the calculations. The transformation uses a dependency graph which vertices and arcs are assigned weights. Further, based on the obtained weights, the resulting code is constructed. The paper considers the application area of the transformation, as well as auxiliary transformations that can expand it. This transformation can be used by optimizing compilers. The authors of this work have implemented it programmatically and added to the Optimizing Parallelization System (OPC).

Текст научной работы на тему «Применение преобразования циклов «Retiming» с целью уменьшения количества используемых регистров»

ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION.

TECHNICAL SCIENCE. 2017. No 3

УДК 519.685.3+

DOI: 10.17213/0321-2653-2017-3-76-80

ПРИМЕНЕНИЕ ПРЕОБРАЗОВАНИЯ ЦИКЛОВ «RETIMING» С ЦЕЛЬЮ УМЕНЬШЕНИЯ КОЛИЧЕСТВА ИСПОЛЬЗУЕМЫХ РЕГИСТРОВ*

© 2017 г. О.Б. Штейнберг, И.А. Ивлев

Южный федеральный университет, г. Ростов-на-Дону, Россия

APPLICATION OF LOOPS TRANSFORMATION «RETIMING» TO REDUCE

THE NUMBER OF REGISTERS USED

O.B. Steinberg, I.A. Ivlev

Southern Federal University, Rostov-on-Don, Russia

Штейнберг Олег Борисович - канд. физ.-мат. наук, ст. науч. сотрудник, Институт математики, механики и компьютерных наук имени И.И. Воровича, Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: olegsteinb@gmail. com

Ивлев Иван Анатольевич - студент, Институт математики, механики и компьютерных наук имени И.И. Воровича, Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: ivlev_1996@mail.ru

Steinberg Oleg Borisovich - Candidate of Physical and Mathematical Sciences, senior scientific researcher, I.I. Vorovich Institute of Mathematics, Mechanics, and Computer Science, Southern Federal University, Rostov-on-Don, Russia. E-mail: olegsteinb@gmail.com

Ivlev Ivan Anatolievich - Student, I.I. Vorovich Institute of Mathematics, Mechanics, and Computer Science, Southern Federal University, Rostov-on-Don, Russia. E-mail: ivlev_1996@mail.ru

Рассматривается распараллеливающее преобразование программ «retiming». Это преобразование создавалось для того, чтобы увеличить степень распараллеливаемости программных циклов. Авторы данной работы предлагают его использовать для экономии используемых при вычислениях регистров. Преобразованием используется граф зависимостей по данным, вершинам и дугам которого присваиваются веса. Далее, исходя из полученных весов, строится результирующий код. В работе рассматривается область применения преобразования, а также вспомогательные преобразования, способные ее расширить. Данное преобразование может быть использовано оптимизирующими компиляторами. Авторами данной работы оно программно реализовано и добавлено в Оптимизирующую распараллеливающую систему (ОРС).

Ключевые слова: оптимизирующий компилятор; retiming; параллельные вычисления; преобразования циклов; граф зависимости по данным; регистры.

The paper discusses the parallelizing transformation of programs «retiming». This transformation was created in order to increase the degree ofparallelism ofprogram loops. The authors of this paper suggest using it to save the registers used in the calculations. The transformation uses a dependency graph which vertices and arcs are assigned weights. Further, based on the obtained weights, the resulting code is constructed. The paper considers the application area of the transformation, as well as auxiliary transformations that can expand it. This transformation can be used by optimizing compilers. The authors of this work have implemented it pro-grammatically and added to the Optimizing Parallelization System (OPC).

Keywords: optimizing compilers; retiming; parallel computations; loops transformations; data dependence graph; registers.

Введение

При параллельном выполнении программ немаловажную роль играют программные циклы. Однако не в каждом цикле можно выполнить даже несколько итераций независимо друг от

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

Исследование выполнено при финансовой поддержке РФФИ в рамках научного проекта № 16-31-60055 мол_а_дк.

преобразования) говорится, что преобразование разрабатывалось для увеличения параллелизма циклов вида DOACROSS [1, 3]. Авторы данной работы, помимо описанного применения, предлагают использовать retiming для уменьшения числа регистров, используемых при вычислении тела цикла. Также авторы статьи исследовали область применения преобразования и добавили его реализацию в Оптимизирующую распараллеливающую систему [4].

Используемые понятия

В данной статье будут рассматриваться циклы

for(i = M; i<N; i++)

{

LoopBody(i);

}

содержащие счетчик (i), нижнюю (M) и верхнюю (N) границу. При этом N-M>0.

Определение 1. Вхождение переменной (occurrence) - это имя переменной в совокупности с тем местом в программе, в котором эта переменная появилась. Всякому вхождению (а для массивов - при конкретном значении индексного выражения) соответствует обращение к некоторой ячейке памяти. Если при обращении к ячейке памяти происходило чтение, то такое вхождение называется использованием (in), а если запись, то генератором (out).

Определение 2. Говорят, что два вхождения порождают информационную зависимость (information dependence), если они обращаются к одной и той же ячейке памяти.

Определение 3. Информационная зависимость между вхождениями называется циклически независимой (loop independent dependence), если эти вхождения обращаются к одной и той же ячейке памяти на одной и той же итерации цикла. Иначе зависимость называется циклически порожденной (loop carried dependence).

Определение 4. В решении задачи преобразования программ ключевую роль играет граф информационных связей [3, 5 - 9]. Вершинами этого графа являются вхождения переменных. Дуга (i, j) идет из i-й вершины в j-ю, если вхождения, соответствующие этим вершинам, порождают истинную, выходную или антизависимость. При этом к одной и той же ячейке памяти сначала обращается вхождение, соответствующее i-й вершине, а затем вхождение, соответствующее j -й вершине.

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

Определение 5. Граф зависимости по данным (ГЗД) - это ориентированный граф, вершинами которого являются операторы, а дуга соединяет i-ю вершину с j -й, если существует дуга графа информационных связей, соединяющая некоторое вхождение оператора, соответствующего i-й вершине, с вхождением оператора, соответствующего j-й вершине [3, 8 - 10, с. 9].

Описание преобразования retiming

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

Условия, накладываемые на заголовок цикла:

1. Счётчик цикла после каждой итерации увеличивается на единицу.

2. Счётчик и верхняя граница цикла не изменяются в его теле.

Условие, накладываемое на содержимое тела цикла:

3. В теле цикла содержатся только операторы присваивания.

Условия, накладываемые на операторы присваивания:

4. Каждый оператор в теле цикла содержит только один генератор (вхождение, используемое для записи).

5. Каждый оператор в теле цикла содержит только константы и вхождения массивов, зависящие от счётчика данного цикла.

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

7. Рекуррентные зависимости в операторах присваивания не допускаются.

Условие, накладываемое на вхождения массивов:

8. Переменные с разными именами не должны обращаться к одной и той же ячейке памяти (т.е. нет алиасов).

9. Все информационные зависимости в теле рассматриваемого цикла регулярны (т.е. разность индексных выражений вхождений, образующих зависимость, - константа).

Из описанных ограничений следует, что наличие скаляров в операторах тела цикла не допускается, однако это ограничение можно обойти с помощью преобразования программ «растягивание скаляров» [3, 8, 9, 11], которое заменяет вхождения скаляра вхождениями специально созданного массива.

Преобразование retiming выполняется в три этапа:

1. Построение взвешенного графа зависимостей по данным. По коду программы строится ГЗД. Каждой дуге этого графа присваивается вес [12, 13], равный разности индексных выражений образующих её вхождений. Стоит отметить, что количество итераций цикла, которые можно выполнять параллельно, равно минимальному из этих весов ненулевому значению. Поэтому, если алгоритм применяется с целью увеличения числа параллельно выполняемых итераций, то нужно максимизировать минимальный ненулевой вес дуги.

2. Преобразование взвешенного графа зависимостей по данным. Определяются веса вершин графа с последующим пересчетом весов дуг. Веса вершин определяются по-разному в зависимости от количества циклов в ГЗД:

- когда ГЗД не содержит циклов, можно выбрать любое значение (k) минимального ненулевого веса дуги в результирующем цикле (не превышающее количества итераций цикла). Тогда веса вершин определяются из системы неравенств:

r(u) + w(u, v) — r(v) > k, V(u, v) e E , (1)

где r(u), r(v) - веса вершин u и v соответственно; w(u, v) - вес дуги, идущей из u в v.

Далее веса дуг пересчитываются по формуле

wnew (U v) = r(u) + v) — r(v)■

Временная сложность алгоритма, находящего веса, равна O(|V|*|V|+|V|*|E|), где |V| - количество операторов в теле рассматриваемого цикла, а |E| - количество дуг в ГЗД. Эта сложность обусловлена тем, что для решения системы неравенств (1) используется алгоритм Беллмана-Форда;

- когда каждая компонента сильной связности [12, 13] ГЗД содержит не более одного цикла, серией преобразований сводится к случаю с ациклическим графом. При этом в результирующем цикле параллельно можно будет выполнять уже не любое количество итера-

ций. Их количество будет равно минимуму из сумм весов дуг, принадлежащих каждому циклу (т.е. k = min(Ew(u1,v1),..., (Ew(un,vn)), если в ГЗД присутствует n различных циклов). Временная сложность алгоритма, находящего веса, такая же, как в случае ациклического графа;

- когда хотя бы одна из компонент сильной связности ГЗД содержит более одного цикла, авторы преобразования сводят к задаче линейного целочисленного программирования [1]. Сложность алгоритма в этом случае указывается как неполиномиальная.

3. Преобразование кода программы. В теле цикла к индексным выражениям каждого оператора присваивания прибавляется вес соответствующей вершины ГЗД. Если в результате этого вес дуги в ГЗД становится равным нулю и дуга идёт «снизу вверх», то операторы в теле цикла нужно поменять местами. Далее, для того чтобы результирующий код был эквивалентным исходному циклу, количество итераций цикла уменьшается на число, равное весу самой «тяжёлой» вершины графа. Затем до и после результирующего цикла добавляются операторы присваивания, вычисляющие недостающие итерации исходного цикла.

Добавление преобразования retiming в ОРС

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

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

- цикл является простым (с постоянными верхней и нижней границей и счётчиком, увеличивающимся на единицу);

- в цикле присутствуют только операторы присваивания;

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

ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION.

TECHNICAL SCIENCE. 2017. No 3

Кроме описанных функций, уже реализованных в ОРС, была добавлена проверка на отсутствие рекуррентных зависимостей внутри операторов присваивания.

Построение ГЗД. В ОРС присутствует инструмент, строящий граф информационных связей, но для описанного преобразования требуется ГЗД, являющийся фактор-графом [12, 13] графа информационных связей [3, 4, 9]. Ввиду этого авторами реализовано получение ГЗД по имеющемуся графу информационных связей.

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

Выполнение второго этапа преобразования. Для реализации второго этапа преобразования был написан код, в основе которого лежат различные действия, производимые над числовыми матрицами (матрицами весов графа).

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

Оптимизация использования регистров

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

Рассмотрим, каким образом преобразование влияет на веса дуг ГЗД (рис. 1)

for(int i=0; i<1000; i

a[i+1]-...c[i]...; b[i+1]-...a[i]...; c[i+2]-...b[i]...;

!

/'Результирующий код*/

Рис. 1. ГЗД тела цикла. До преобразования - слева, после - справа / Fig. 1. Dependence graph of the loop body. Before the transformation is located on the left, after the right

В результате применения преобразования минимальное ненулевое значение веса дуги повысилось до 4. Таким образом, в результирующем цикле можно будет выполнять по 4 итерации параллельно. Заметим также, что веса всех дуг (располагающихся внутри цикла ГЗД), кроме одной, после применения преобразования становятся равными 0. Это означает, что зависимость, которую обозначает данная дуга, стала циклически независимой (т.е. у обоих вхождений массива индексные выражения совпадают).

Пример. Рассмотрим цикл на языке C: for (int i = 0; i < N - 2; ++i)

{

a[i + 1] = c[i] * d[i + 2], b[i + 1] = a[i] + e[i + 1], c[i + 2] = b[i] - f[i];

}

После применения преобразования retiming к этому циклу получится следующий участок кода:

c[2] = b[0] - f[0] b[1] = a[0] + e[1] c[3] = b[1] - f[1]

for (int i {

1]

0; i < N - 4; ++i)

a[i + b[i + 2] c[i + 4]

c[i] * d[i + 2]; a[i + 1] + e[i + 2]; b[i + 2] - f[i + 2];

}

4]

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

a[N - 3] = c[N -b[N - 2] = a[N - 3] + e[N -a[N - 2] = c[N - 3] * d[N -

* d[N - 2] 2] 1]

Ниже приведен ассемблерный код данных фрагментов, полученный с помощью компилятора gcc версии 4.8.4 с ключом -Ofast. В левой колонке приведен код ассемблера для исходного цикла, справа - для результирующего фрагмента программы.

.L13:

movl (\%rdx,\%rax,4), \%r10d

imull 8(\%rcx,\%rax,4), \%r10d

movl \%r10d, 4(\%rdi,\%rax,4)

movl (\%rdi,\%rax,4), \%r10d

addl 4(\%r8,\%rax,4), \%r10d

movl \%r10d, 4(\%rsi,\%rax,4)

movl (\%rsi,\%rax,4), \%r10d

subl (\%r9,\%rax,4), \%r10d

movl \%r10d, 8(\%rdx,\%rax,4)

addq \$1, \%rax cmpl \%eax, \%r11d jg L13

.L13:

movl (\%rdx,\%rax,4), \%r10d

imull 8(\%rcx,\%rax,4), \%r10d

movl \%r10d, 4(\%rdi,\%rax,4)

addl 8(\%r8,\%rax,4), \%r10d movl \%r10d, 8(\%rsi,\%rax,4)

subl 8(\%r9,\%rax,4), \%r10d movl \%r10d, 16(\%rdx,\%rax,4)

addq

cmpl jg

\$1, \%rax \%eax, \%r11d .L13

Из текста в правой колонке видно, что запись и использование значения а^+1] применяют один и тот же регистр (то же касается и Ь^+1]).

ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION.

Заключение

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

Литература

1. Duo Liu, Zili Shao, Meng Wang, Minyi Guo, Jingling Xue. Optimal Loop Parallelization for Maximizing Iteration-Level Parallelism // International Conference on Compilers, Architecture, and Synthesis for Embedded Systems (CASES'09) (Grenoble). 2009. P. 67 - 76.

2. Duo Liu, Yi Wang, Zili Shao, Minyi Guo, Jingling Xue. Optimally Maximizing Iteration-Level Loop Parallelism // International IEEE Trans. Parallel Distrib. Syst.: 2012, № 23(3), Р. 564 - 572

3. Wolfe M. High Performance Compilers for Parallel Computing. Redwood city: Addison-Wesley Publishing Company, 1996. 570 p.

TECHNICAL SCIENCE. 2017. No 3

4. Оптимизирующая распараллеливающая система. URL: http://ops.rsu.ru/about_OPS.html (дата обращения: 29.02.2017).

5. Арапбаев Р.Н. Анализ зависимостей по данным: тесты на зависимость и стратегии тестирования: дис.... канд. физ.-мат. наук. Новосибирск: ИСИ СО РАН, 2008. 116 с.

6. Бабичев А.В., Лебедев В.Г. Распараллеливание программных циклов // Программирование. 1983. № 5. С. 52 - 63.

7. Шульженко А.М. Исследование информационных зависимостей программ для анализа распараллеливающих преобразований: дис..канд. техн. наук / РГУ. Ростов н/Д., 2006. 200 с.

8. Штейнберг Б.Я. Математические методы распараллеливания рекуррентных программных циклов на суперкомпьютеры с параллельной памятью. Ростов н/Д.: Изд-во Рост. ун-та, 2004. 192 с.

9. Allen R., Kennedy K. Optimizing Compilers for Modern Architectures. - San Francisco; San Diego; New York; Boston; London; Sidney; Tokyo: Morgan Kaufmann Publishers, 2002. 790 p.

10. Векторизация программ: теория, методы, реализация: сб. пер. статей. М.: Мир, 1991. С. 246 - 267.

11. Штейнберг О.Б. Минимизация количества временных массивов в задаче разбиения циклов // Изв. вузов. Сев.-Кавк. регион. Естеств. науки. 2011. № 5. С. 31 - 35.

12. Зыков А.А. Основы теории графов. М.: Вузовская книга, 2004. 662 с.

13.Харари Ф. Теория графов. М.: Мир, 1973. 300 с.

References

1. Duo Liu, Zili Shao, Meng Wang, Minyi Guo, Jingling Xue. Optimal Loop Parallelization for Maximizing Iteration-Level Parallelism. International Conference on Compilers, Architecture, and Synthesis for Embedded Systems (CASES'09) (Grenoble). 2009. Pp. 67 - 76.

2. Duo Liu, Yi Wang, Zili Shao, Minyi Guo, Jingling Xue. Optimally Maximizing Iteration-Level Loop Parallelism // International IEEE Trans. Parallel Distrib. Syst. 2012, 23(3), Pp. 564 - 572

3. Wolfe M. High Performance Compilers for Parallel Computing. Redwood city: Addison-Wesley Publishing Company, 1996. 570 p.

4. Optimiziruyushchaya rasparallelivayushchaya sistema [The optimizing parallelizing system]. Available at: http://ops.rsu.ru/about_OPS.html (accessed 29.02.2017).

5. Arapbaev R.N. Analiz zavisimostei po dannym: testy na zavisimost' i strategii testirovaniya. Diss. kand. fiz.-mat. Nauk [Analysis of dependences by data: dependence tests and strategy of testing. Dr. phys. and math. sci. diss.]. Novosibirsk, ISI SO RAN, 2008, 116 p.

6. Babichev A.V., Lebedev V.G. Rasparallelivanie programmnykh tsiklov [Parallelization of program cycles]. Programmirovanie, 1983, no. 5, Pp. 52 - 63. [In Russ.]

7. Shul'zhenko A.M. Issledovanie informatsionnykh zavisimostei programm dlya analiza rasparallelivayushchikh preobrazovanii. Diss. kand. tekhn. nauk [Research of information dependences of programs for the analysis of the parallelizing transformations. Cand. techn. sci. diss.]. Rostov-on-Don, RGU Publ., 2006, 200 p.

8. Shteinberg B.Ya. Matematicheskie metody rasparallelivaniya rekurrentnykh programmnykh tsiklov na superkomp'yutery s parallel'noi pamyat'yu [Mathematical methods of parallelization of recurrent program cycles on supercomputers with parallel memory]. Rostov-on-Don, Izdatel'stvo Rostovskogo universiteta, 2004. 192 p.

9. Allen R., Kennedy K. Optimizing Compilers for Modern Architectures. San Francisco, San Diego, New York, Boston, London, Sidney, Tokyo: Morgan Kaufmann Publishers, 2002. 790 p.

10. Vektorizatsiya programm: teoriya, metody, realizatsiya [Vectorization of programs: theory, methods, realization]. Sbornik perevodov statei, Mir Publ., 1991, Pp. 246 - 267. [In Russ.]

11. Shteinberg O.B. Minimizatsiya kolichestva vremennykh massivov v zadache razbieniya tsiklov [Minimization of quantity of temporary massifs in a problem of splitting cycles]. Izv. vuzov. Sev.-Kavk. region. Estestvennye nauki, 2011, no. 5, pp. 31-35. [In Russ.]

12. Zykov A.A. Osnovy teoriigrafov [Bases of the theory of counts]. Moscow, Vuzovskaya kniga, 2004, 662 p.

13. Kharari F. Teoriya grafov [Theory of counts]. Moscow, Mir Publ., 1973, 300 p.

Поступила в редакцию /Received 03 мая 2017 г. /May 03, 2017

i Надоели баннеры? Вы всегда можете отключить рекламу.