УДК 681.3
О ВЗАИМОСВЯЗИ МЕЖДУ РЕШЕТЧАТЫМ ГРАФОМ ПРОГРАММЫ И ГРАФОМ ИНФОРМАЦИОННЫХ СВЯЗЕЙ
© 2011 г. Б.Я. Штейнберг
Южный федеральный университет, Southern Federal University,
ул. Мильчакова, 8, г. Ростов-на-Дону, 344090 Milchakov St., 8, Rostov-on-Don, 344090
Показана сводимость графа информационных связей к решетчатому графу программы и обратная сводимость. Граф информационных связей является основным средством контроля эквивалентности различных преобразований программ. Он используется в оптимизирующих и распараллеливающих компиляторах. Решетчатый граф программы описывает информационные зависимости между точками пространства итераций гнезда циклов и может применяться при преобразованиях и параллельном выполнении гнезд циклов. Результаты могут быть использованы при разработке оптимизирующих и распараллеливающих компиляторов, позволяют упростить понимание решетчатых граф и их роли при распараллеливании гнезд циклов.
Ключевые слова: распараллеливание программ, граф информационных связей, решетчатый граф программы.
It has been shown that the data dependence graph could be reduced to the lattice graph in this paper. Results of this paper may be used in the development of optimizing and parallelizing compilers. The data dependence graph is the main tool of control of different program transformations equivalence. This graph is using in optimizing and parallelizing compilers. The lattice program graph has describes information dependences between points of loop nest iteration space. It may be used to loops nest transformations and parallel execution. The results of this paper could be interesting for parallelizing and optimizing compilers design. More over, it may simplify our understanding about lattice graphs and their place in loop nest parallelizing.
Keywords: program parallelizing, data dependence graph, lattice graph.
Граф информационных связей [1, 2] или близкий к нему граф зависимостей по данным [3] - основной инструмент отслеживания корректности при выполнении преобразований программ. В частности, в терминах этого графа описываются условия распаралле-ливаемости циклов [4]. Но бывают гнезда циклов, в которых ни один цикл не распараллеливается, но нек-торые точки пространства итераций могут выполняться параллельно (см., например, «метод гиперплоскостей» [2]). Условия параллельного выполнения точек пространства итераций гнезд циклов описываются решетчатыми графами [5-9]. В данной работе выявлена взаимозависимость между этими двумя графовыми моделями программ.
Информационная зависимость в программе
Приведем необходимые сведения об информационных зависимостях из теории преобразования программ [1-4].
Вхождением переменной, как обычно, будем называть всякое появление переменной в тексте программы вместе с тем местом в программе, в котором эта переменная появилась. Всякому вхождению (при конкретном значении индексного выражения для массивов) соответствует обращение к некоторой ячейке памяти. Если при этом обращении происходит запись в ячейку памяти, то такое вхождение называется генератором. Остальные вхождения называются использованиями.
Говорят, что два вхождения порождают информационную зависимость, если при некоторых допусти-
мых значениях индексных выражений они обращаются к одной и той же ячейке памяти.
Граф информационных связей - это ориентированный граф, вершины которого соответствуют вхождениям, а дуга соединяет пару вершин (v,u), если эти вхождения обращаются к одной и той же ячейке памяти (т.е. порождают информационную зависимость), причем вхождение v раньше, чем u, и хотя бы одно из этих вхождений является генератором.
Генератор будем обозначать out (output), а использование - in (input). Дуги графа информационных связей бывают 3 типов в зависимости от типов инцидентных им вершин: out-in - истинная информационная зависимость (true dependence), in-out - антизависимость (antidependence), out-out - выходная зависимость (output dependence) [4, с. 95].
Дуга истинной зависимости (v,u) называется ложной, если существует такая другая дуга истинной зависимости (v2,u), что ко всем общим ячейкам памяти вхождений v и u обращается также и вхождение v2, причем v2 всегда позже, чем v.
Пространство итераций гнезда циклов
Будем рассматривать гнездо циклов кратности n, содержащих вхождения многомерных массивов размерности m.
DO 99 I1=L1,R1
DO 99 I2=L2,R2
DO 99 In=Ln,Rn (1)
LOOPBODY (I1,I2,...,In)
99 СОЧТЕЧиЕ
Пространство итераций Б гнезда циклов (1) - это множество всех таких целочисленных векторов 1=(11,12,...,1п), что Ь1=<11=<К1, Ь2=<12=<И2,
Будем допускать, что границы Lj, Rj изменения счетчиков циклов Ij могут линейно зависеть от счетчиков объемлющих циклов. В этом случае пространство итераций D гнезда циклов (1) является целочисленным многогранником в n-мерном пространстве. Гнездо циклов (1) будем более компактно записывать в следующем виде: DO 99 I D LOOPBODY (I)
99 CONTINUE
На пространстве итераций D будем рассматривать лексикографический порядок. Например, при n=3 выполняется (2,4,5)>(2,3,8). Именно в лексикографическом порядке просматриваются итерации гнезда циклов при его выполнении на компьютере (не параллельном).
Многомерный цикл (гнездо циклов) с выделенными вхождениями будем выписывать следующим образом:
DO 99 I D
X(F1(I),...,Fm(I)) = . . .
. . . = X(G1(I),..,Gm(I)) 99 CONTINUE или так DO 99 I D X(F(I)) = . . .
. . . = X(G(I)) (2)
99 CONTINUE.
Пространство итераций фрагмента программы -это объединение пространств итераций всех гнезд циклов, входящих в данный фрагмент программы. Если некоторый оператор не принадлежит ни одному циклу, то будем считать, что этот оператор принадлежит гнезду циклов кратности 0.
Решетчатый граф и его соотношение с графом информационных связей
Решетчатые графы использовались в методах распараллеливания программ с 70-х гг. в работах Л. Лампорта в методе гиперплоскостей [1], В. Вальковского в методе параллелепипедов [10] и методе пирамид [11] и у других исследователей. Эти графы использовались для иллюстрации идей, лежащих в основе методов распараллеливания, но не в явном виде, поскольку традиционные формы хранения графа в виде матрицы смежностей или списка дуг не эффективны: прочтение такого графа может потребовать больше времени, чем последовательное исполнение программы, по которой этот граф построен. В конце 80-х гг. был сделан прорыв в этом направлении: В.В. Воеводин [5-7] и P. Feautrier [8, 9] научились хранить этот граф в виде функций и разработали алгоритмы построения этих функций. У P. Feautrier функция строится для программ из линейного класса и содержит в
своем определении не очень удобные для исследования условные операторы. У В.В. Воеводина функция является кусочно-линейной и определена на подмножестве линейного класса программ; но большинство практически значимых программ линейного класса относятся к этому подмножеству. В теории решетчатых графов можно отметить также работы [12, 13].
Пусть в гнезде циклов имеется пара зависимых вхождений Х(¥(1)) и Х(0(3)), и этой паре соответствует некоторая дуга графа зависимостей по данным. Зависимость означает обращение этих вхождений к одной и той же ячейке памяти. Но на разных итерациях гнезда циклов эти вхождения могут обращаться к разным ячейкам памяти. Возникает задача описания всех таких пар итераций гнезда циклов (1,1), для которых оба вхождения Х(¥(1)), Х(0(3)) обращаются к одной и той же ячейке памяти. Для описания этих пар итераций используется элементарный решетчатый граф программы, который можно определить не только для произвольной дуги информационной зависимости, но и для произвольной упорядоченной пары вхождений Х(¥(1)) и Х(0(3)). Если окажется, что эта пара не связана дугой графа информационных связей, то решетчатый граф будет пустым (без дуг).
Определение элементарного решетчатого графа. Пусть в гнезде циклов имеется пара зависимых вхождений Х(¥(1)) и Х(0(3)), и этой паре соответствует некоторая дуга графа информационных связей, через (¥,0) будем обозначать элементарный решетчатый граф, построенный по двум вхождениям Х(¥) и Х(О) переменной Х в гнезде циклов, Б - множество вершин этого графа - пространство итераций цикла (2). Дуга (1,1) принадлежит графу, если ¥(1)=0(3) , 1<3 (лексикографический порядок), и для любого такого К из области Б , для которого К<3 и ¥(К)=0(3), выполняется К < 1.
Иными словами, вершина 1 является лексикографическим максимумом множества всех таких точек К, для которых ¥(К)=0(3) и К</. В [5] (¥,0) называется элементарным решетчатым графом. Всякий раз при упоминании графа (¥,0) будем предполагать, что индексные отображения ¥ и 0 не содержат переменных, кроме счетчиков рассматриваемых объемлющих циклов, - в этом случае граф (¥,0) однозначно определен.
Описанный граф называется решетчатым, поскольку его вершины (точки пространства итераций) располагаются в узлах многомерной целочисленной решетки (размерность равна количеству циклов в гнезде).
Решетчатый граф строится по паре зависимых вхождений, т.е. по дуге графа информационных связей. Поскольку эти дуги подразделяются на 4 типа зависимостей, решетчатые графы имеют такие же типы: истинная (потоковая), антизависимость, выходная и входная зависимости.
Определение решетчатого графа истинной зависимости. Пусть задан фрагмент программы и некоторая переменная (м.б. индексная) Х. Множество вершин решетчатого графа истинной зависимости переменной -это пространство итераций заданного фрагмента.
Две точки пространства итераций 1 и 3 соединяются дугой, если в графе информационных связей существует дуга истинной зависимости (и1, VI), ре-
шетчатый граф которой содержит дугу (I,J); для любой другой дуги (u2, v1) истинной зависимости графа информационных связей, решетчатый граф которой содержит некоторую дугу (I2,J), входящую в вершину J, точка пространства итераций I2 лексикографически меньше I, либо I2 = I, но вхождение u2 в тексте программы встречается всегда раньше вхождения u.
Аналогично определяются решетчатые графы для антизависимости, выходной и входной зависимостей.
Определение (полного) решетчатого графа фрагмента программы. Решетчатый граф фрагмента программы - это граф, вершины которого - все точки пространства итераций, множество дуг - объединение множеств дуг решетчатых графов всех переменных данного фрагмента.
Следующие 2 утверждения показывают связь между решетчатым графом и графом информационных связей.
Теорема 1. В графе информационных связей гнезда циклов (2) существует дуга от генератора переменной X к использованию этой переменной (дуга истинной информационной зависимости), причем использование X(G) использует значение, записанное в память генератором X(F), тогда и только тогда, когда в графе (F, G) существует хотя бы одна дуга.
Доказательство вытекает непосредственно из определений графа (F,G) и графа информационных связей.
Напомним, что раскрутка циклов (full loop unrolling) - это фрагмент программы, представляющий собой повторение тела цикла (с соответствующими значениями счетчика цикла) столько раз, сколько итераций предполагает выполнение цикла [2].
Теорема 2. Пусть (X(F(I)), X(G(I))) - дуга истинной информационной зависимости в графе информационных связей; (F,G) - соответствующий решетчатый граф. Дуга (I,J) принадлежит графу (F,G) тогда и только тогда, когда в раскрутке циклов гнезда (2) вхождение X(G(J)) использует данное, записанное в память генератором X(F(I)).
Доказательство вытекает из определения графа (F, G) и раскрутки цикла.
Таким образом, существует взаимно однозначное соответствие между дугами графа (F, G) цикла (2) и не ложными дугами графа информационных связей раскрутки всех циклов гнезда.
Поступила в редакцию_
Работа поддержана проектом «Создание высокотехнологичного производства комплексных решений в области предметно-ориентированных облачных вычислений для нужд науки, промышленности, бизнеса и социальной сферы», шифр 2010-218-01-209; ФЦП «Научные и научно-педагогические кадры инновационной России», государственные контракты № 02.740.11.0208 от 7 июля 2009 г., № 14.740.11.0006 от 1 сентября 2010 г.
Литература
1. Lamport L. The parallel execution of DO loops // Com-
mun. ACM. 1974. Vol. 17, № 2. P. 83-93.
2. Штейнберг Б.Я. Математические методы распараллели-
вания рекуррентных программных циклов на суперкомпьютеры с параллельной памятью. Ростов н/Д, 2004. 192 с.
3. Allen R., Kennedy K. Optimizing compilers for Mordern
Architetures. San Francisco; San Diego; N.Y.; Boston; London; Sidney; Tokyo. 2002. 790 p.
4. Векторизация программ: теория, методы, реализация:
c6. переводов ст. М., 1991. С. 246 - 267.
5. Воеводин В.В. Математические модели и методы в па-
раллельных процессах. М., 1986. 296 с.
6. Воеводин В.В., Воеводин Вл.В. Параллельные вычисле-
ния. СПб., 2002. 599 с.
7. URL:http://www.parallel.guru.ru (дата обращения:
10.12.2010).
8. Feautrier P. Data Flow Analysis for Array and Scalar Ref-
erences // International J. of Parallel Programming. 1991. Vol. 20, № 1. P. 23-53.
9. Feautrier P. Parametric Integer Programming. Laboratoire
MASI, Institut Blaise Pascal, Universite de Versailles St-Quentin, 1988. 25 p.
10. Вальковский В.А. Параллельное выполнение циклов.
Метод пирамид // Кибернетика. 1983. № 5. С. 51-55.
11. Вальковский В.А. Параллельное выполнение циклов.
Метод параллелепипедов // Кибернетика. 1982. № 2. С. 51-62.
12. Шульженко А.М. Автоматическое определение циклов
ParDo в программе // Изв. вузов. Сев.-Кавк. регион. Ес-теств. науки. 2005. Прил.11. C. 77-88.
13. Лиходед Н.А. Распределение операций и массивов дан-
ных между процессорами // Программирование. 2003. № 3. С. 73-80.
20 декабря 2010 г.