Научная статья на тему 'Линеаризация выражений в оптимизирующих или распараллеливающих компиляторах'

Линеаризация выражений в оптимизирующих или распараллеливающих компиляторах Текст научной статьи по специальности «Математика»

CC BY
166
30
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЛИНЕАРИЗАЦИЯ / ПРЕОБРАЗОВАНИЕ / ОТКРЫТАЯ РАСПАРАЛЛЕЛИВАЮЩАЯ СИСТЕМА / LINEARIZATION / PROGRAM TRANSFORMATION / OPEN PARALLELIZING SYSTEM

Аннотация научной статьи по математике, автор научной работы — Черданцев Денис Николаевич

Рассматривается преобразование «линеаризация выражений» и его применение. Оно реализовано в открытой распараллеливающей системе; используется как вспомогательное в следующих блоках оптимизирующих (распараллеливающих) компиляторов: вычислении на этапе компиляции, стандартизации выражений, вынесении общих подвыражений, построении графа информационных связей, распараллеливании циклов с линейно рекуррентной зависимостью, проверке программы на принадлежность линейному классу, распараллеливании циклов с дробно-линейной рекуррентной зависимостью.

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

Похожие темы научных работ по математике , автор научной работы — Черданцев Денис Николаевич

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

Expressions Linearization in Optimization or Parallelization Compilers

In this article program transformation «Linearization» is viewed. It is developed in Open Parallelizing System. This transformation is used as auxiliary transformation in next parallelization compilers blocks: partition evaluations, common subexpressions elimination, building dependence graph and others.

Текст научной работы на тему «Линеаризация выражений в оптимизирующих или распараллеливающих компиляторах»

УДК 681.3

ЛИНЕАРИЗАЦИЯ ВЫРАЖЕНИЙ В ОПТИМИЗИРУЮЩИХ ИЛИ РАСПАРАЛЛЕЛИВАЮЩИХ КОМПИЛЯТОРАХ

© 2009 г. Д.Н. Черданцев

Южный федеральный университет, Southern Federal University,

344090, Ростов н/Д, ул. Мильчакова, 8а, 344090, Rostov-on-Don, Milchakov St., 8a,

dnjme@math. sfedu.ru dnjme@math. sfedu.ru

Рассматривается преобразование «линеаризация выражений» и его применение. Оно реализовано в открытой распараллеливающей системе; используется как вспомогательное в следующих блоках оптимизирующих (распараллеливающих) компиляторов: вычислении на этапе компиляции, стандартизации выражений, вынесении общих подвыражений, построении графа информационных связей, распараллеливании циклов с линейно рекуррентной зависимостью, проверке программы на принадлежность линейному классу, распараллеливании циклов с дробно-линейной рекуррентной зависимостью.

Ключевые слова: линеаризация, преобразование, открытая распараллеливающая система.

In this article program transformation «Linearization» is viewed. It is developed in Open Parallelizing System. This transformation is used as auxiliary transformation in next parallelization compilers blocks: partition evaluations, common subexpressions elimination, building dependence graph and others.

Keywords: linearization, program transformation, Open Parallelizing System.

В данной статье рассматривается преобразование «линеаризация выражений» и его применение. Оно реализовано в открытой распараллеливающей системе (ОРС) [1, 2]. На вход преобразования «линеаризация выражений» подаётся выражение и список подвыражений (которые в частном случае могут быть переменными), на выходе - выражение, являющееся линейной комбинацией входных подвыражений. Выходное выражение эквивалентно исходному. Если такое линейное представление исходного выражения невозможно, то на выходе выдается соответствующее сообщение.

Это преобразование используется как вспомогательное в следующих блоках оптимизирующих (рас-

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

Применение линеаризации относительно I и J к выражению 5*1+6^-2*1 в ОРС. Получены выражение 3*1+6^ (правое верхнее окно), информация о коэффициентах при I и J, признак линейности. Левое нижнее окно содержит параметры вызова преобразования, правое нижнее - сообщение о выполнении преобразования

Преобразование линеаризация проводится в символьном виде. Оно способно не только привести выражение вида 1+1 к 2, но и 1+1 к 24, где I - переменная.

Следуем отметить, что преобразование «линеаризация» не всегда возможно. Например, выражение a*b+b*c+c*a не может быть линеаризовано одновременно относительно a, Ь в силу нелинейности по совокупности данных переменных. В этом случае выдается соответствующее сообщение.

Канонизация (стандартизация) выражений. Линеаризация позволяет приводить выражения к каноническому (стандартному) виду [3].

В данной работе предлагаются следующие стандартные требования к записи выражений.

1. Аргументы коммутативной бинарной операции должны следовать в алфавитном порядке. Например, P*Q, а не Q*P.

2. Если в выражении некоторая операция одновременно коммутативная и ассоциативная и должна выполняться несколько раз подряд, то все аргументы должны быть отсортированы по алфавиту. Например, сумма нескольких переменных A+B-X (вычитание в этой записи следует понимать, как сложение с переменной с унарным минусом A+B+(-X)).

3. Сумма двух одинаковых выражений с числовыми множителями заменяется таким выражением с

множителем, который равен сумме исходных. 3*1-1 => 2*!

4. Можно выносить общий множитель-переменную, пользуясь законом дистрибутивности. Но при вызове такой процедуры следует указывать, какие множители нам следует выносить. Такая процедура может выполняться благополучно лишь тогда, когда исходное выражение линейно зависит от совокупности указанных переменных (если их несколько). Например, А*В+А*С+В*С => А*В+(А+В)*С, если выражение надо приводить относительно переменной С. Заметим, что в этом примере невозможно привести исходное выражение относительно переменных А и В одновременно, поскольку выражение нелинейно зависит от их совокупности. Если выносимый множитель является не константой, а переменной или подвыражением, то он пишется слева или справа в зависимости от алфавитного порядка с переменной, относительно которой множитель выносится.

5. При записи отношений будем использовать «<» вместо «>» и «<» вместо «>». (х+2)<0 вместо 0>(х+2).

6. Булевы выражения следует приводить к дизъюнктивной нормальной форме (ДНФ), в которой аргументы конъюнкций и дизъюнкций расположены в алфавитном порядке. Выражение без отрицания должно записываться раньше такого же выражения с

отрицанием. Например, Not(A) and B and Z or B and Y or not(B) and C.

7. Арифметические подвыражения над константами следует заменять их числовыми значениями. Например, числом -5 можно заменить выражение (3-4*2).

8. Унарный «-» можно выносить как множитель, если это особо оговорено в параметрах процедуры.

Пример 1.

X(I)*2-2*X(I-1) = > 2*X(I)-2*X(I-1),

X(I)*A(I)-2*X(I) => (A(I)-2))* X(I),

X(I)*Y(I)-2*X(I) => X(I) *(Y(I)-2)).

Для реализации п. 4 может быть полезным предварительное раскрытие скобок по закону дистрибутивности.

Пример 2.

5*(X-Y)+(A+1)*(X+Y) => 5*X-5 *Y+(A+1) *X+(A+ 1)*Y => (5+(A+1))*X +(-5+(A+1))*Y => (A+6)*X +(A-4)*Y.

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

Канонический вид позволяет отождествлять выражения, т.е. понять что X(I+1) и X(1+I) одно и то же, что важно, например, при анализе зависимостей или при вынесении общих подвыражений.

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

Вычисления на этапе компиляции. Приведение к каноническому виду, как уже было сказано, заменяет арифметические подвыражения над константами их числовыми значениями. Тем самым ещё на этапе компиляции происходит упрощение (вычисление) выражений [5].

Пример 3. Пусть имеем выражение 2*a+5*(a+10)+ + a*(5+7). Линеаризация относительно «a» преобразует это выражении в следующее: 19*a+50.

Построение графа информационных связей. Граф информационных зависимостей [6] - ориентированный помеченный граф. Его вершины - вхождения переменных. Если вхождение v зависит от вхождения u, то существует дуга, направленная от u к v. С нею связывается некоторая дополнительная информация о зависимых вхождениях, такая как носитель (глубина) зависимости, вектор направления, вектор расстояния и др.

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

Пример 4. Рассмотрим фрагмент программы

for( i ...) for (j ...) for(k ...)

.. .=a(3*j+4*i+m*k+4,2*i+(n-1)*j-d).

В нем три цикла со счетчиками i, j, k и одно вхождение переменной.

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

Индексное Коэф. Коэф. Коэф. Свободный

выражение при 1 при J при K член

1-е 4 3 M 4

2-е 2 (n-1) 0 -d

Распараллеливание циклов с линейно рекуррентной зависимостью. Рассмотрим цикл вида For (i.)

X[i]= B1[i]*X[i-1] +B2[i] *X[i-2] +B 3 [i]. Следует отметить, что этот цикл в частном случае вычисляет числа Фибоначи. Вычисление такого цикла сводится к решению системы алгебраических уравнений (СЛАУ) с ленточными матрицами [7].

С помощью линеаризации к такому виду можно приводить многие циклы. Например, For (i ...)

X[i]= X[I-2] + 5*X[I-1]+7* X[-1+I] + Bi2. Здесь вычисляется переменная X. Для проверки того, что X вычисляется рекуррентно, к индексным выражениям ее вхождений применяется линеаризация. Не всякие циклы с рекуррентной зависимостью допускают эффективное распараллеливание. Например, эффективно могут быть распараллелены циклы с линейной рекуррентной зависимостью [7]. Это свойство, в свою очередь, может быть проверено с помощью линеаризации. В данном примере следует проверить правую часть оператора присваивания на линейность относительно вхождений переменной X.

Проверка программы на принадлежность линейному классу. В соответствии с [8] будем считать, что алгоритм записан с помощью следующих средств языка: в программе может использоваться любое число простых переменных и переменных с индексами; единственным типом исполнительного оператора может быть оператор присваивания, правая часть которого есть арифметическое выражение (допускается любое число таких операторов); все повторяющиеся операции описываются только с помощью циклов DO; структура вложенности циклов может быть произвольной; шаги изменения параметров циклов всегда равны +1; если у цикла нижняя граница больше верхней, то цикл не выполняется; допускается использование любого числа условных и безусловных операторов перехода, передающих управление «вниз» по тексту; не допускается использование побочных выходов из циклов; все индексные выражения переменных, границы изменения параметров циклов, условия передачи управления задаются в общем случае неоднородными формами, линейными как по параметрам циклов, так и по внешним переменным программы; все коэффициенты линейных форм являются целыми числами; внешние переменные программы всегда целочисленные, и вектора их значений принадлежат некоторым целочисленным многогранникам; конкретные значения внешних переменных известны только перед началом работы программы и неизвестны в момент ее исследования.

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

В ОРС реализована проверка на принадлежность к линейному классу.

Распараллеливание циклов с дробно-линейной рекуррентной зависимостью [9]. Рассмотрим цикл вида

For (i...)

X[i]= (A[I]*X[I-1]+B[I])/(C[I]*X[I-1]+D[I]).

Такие циклы называются циклами с дробно-линейной рекуррентной зависимостью. Числитель и знаменатель должны быть линейны относительно переменной X. Эта проверка осуществляется преобразованием линеаризация.

Литература

1. URL: http://www.ops.rsu.ru (дата обращения: 10.01.2008).

2. Открытая распараллеливающая система 2006 / Б.Я. Штейнберг [и др.] // Перспективы систем информатики: Семинар НПО 6-й Междунар. конф. 27-28 июня 2006 г. Новосибирск, 2006. С. 526-541.

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

3. Евстигнеев В.А., Спрогис С.В. Векторизация программ // Векторизация программ: теория, методы, реализация. М., 1991. С. 246 - 267.

4. Aho A. V., Johnson S. C., Ullman J. D. Code Generation for expressions with common subexpressions // Journal of the ACM. 1984. Vol. 24. № 1.

5. Ершов А.П. Смешанные вычисления: потенциальные применения и проблемы исследования. URL: http://ershov. iis.nsk.su/archive/eaindex.asp?lang=1&did=2596 (дата обращения: 15.01.2008).

6. Шульженко А.М. Решетчатый граф и использующие его преобразования программ в Открытой распараллеливающей системе // Научный сервис в сети Интернет: технологии распределенных вычислений: тр. Всерос. науч. конф. 19-24 сентября 2005 г. Новороссийск, 2005. С. 82-85.

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

8. URL: http://www.parallel.guru.ru (дата обращения: 10.01.2008).

9. Валях Е. Последовательно-параллельные вычисления. М., 1985. 456 с.

_22 февраля 2008 г.

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