УДК 681.124.2
МИНИМИЗАЦИЯ КОЛИЧЕСТВА ВРЕМЕННЫХ МАССИВОВ В ЗАДАЧЕ РАЗБИЕНИЯ ЦИКЛОВ
© 2011 г. О.Б. Штейнберг
Южный федеральный университет, Southern Federal University,
ул. Мильчакова, 8, г. Ростов-на-Дону, 344090 Milchakov St., 8, Rostov-on-Don, 344090
Описывается алгоритм разбиения циклов, использующий в качестве вспомогательного преобразования введение временных массивов. Он построен таким образом, чтобы количество введений временных массивов было минимальным. Эта задача решается с помощью графовых моделей программ, а точнее с использованием графа информационных связей и построенного на его основе фактор-графа. Результаты этой статьи могут быть использованы при разработке распараллеливающих компиляторов. Написана программная реализация этого алгоритма в рамках проекта «Диалоговый высокоуровневый оптимизирующий распараллеливатель».
Ключевые слова: параллельные вычисления, разбиение цикла, временные массивы.
This paper describes a loop distributing algorithm used node splitting as auxiliary transformation. In addition, the algorithm is developed so that the amount of the temporary arrays would be minimal. This problem is solved by using graph models of programs, and more precisely by using a data dependence graph and built based on this factor-graph. The results of this paper can be used in parallelizing compilers developing. The software implementation of this algorithm was written in the «Dialog-basedHigh-level Optimizing Parallelizer».
Keywords: parallel computation, loop distribution, node splitting.
Разбиение цикла - одно из наиболее важных преобразований программ, которое может быть использовано при распараллеливании. Иногда вместо термина «разбиение» используется термин «разрезание» или «распределение» (loop distribution). Некоторые циклы невозможно разбить в исходном виде, и тогда можно попытаться применить вспомогательные преобразования. Таким преобразованием, приводящим цикл к разбиваемому виду, может являться введение временных массивов. С другой стороны, это преобразование приводит к увеличению количества операторов и расходу памяти. В данной работе рассматривается задача минимизации использования временных массивов для разрезания.
Суть разбиения цикла состоит в том, чтобы заменить цикл, в теле которого много операторов присваивания, на эквивалентный фрагмент программы из нескольких циклов, в телах которых меньше операторов. При распараллеливании зачастую большой цикл не может быть эффективно отображен на архитектуру параллельного компьютера (например, из-за нехватки ресурсов). В этом случае есть надежда, что после разбиения все или хотя бы некоторые из результирующих циклов смогут быть параллельно вычислены. Преобразование «разрезание цикла». Рассмотрим цикл
For(i=0;i<N;i++) {
Si
Sk Sk+1
Sm },
тело которого состоит из операторов Sj, 1<j<m. Этот цикл преобразуется к фрагменту программы, состоящему из двух циклов: For(i=0; i<N;i++)
{
81 }
Гаг(1=0;]<М;]++) {
8к+1
8т }.
Данная задача рассматривалась в работах [1-3]. Она близка к задаче векторизации [4] или частичной векторизации [5] одномерного цикла.
В ее рассмотрении ключевую роль занимает граф информационных связей [3], т.е. граф, вершинами которого являются вхождения, а дуга идет из /-й вершины в /-ю, если вхождения, соответствующие этим вершинам, обращаются к одной и той же ячейке памяти. Вначале обращение идет со стороны вхождения, соответствующего /-й вершине, потом - /-й.
На основе алгоритма, представленного в данной работе, написана программа, вошедшая в проект ОРС и систему ДВОР [6] (рис. 1).
Условия применения преобразования разбиение цикла:
1) должна соблюдаться корректность в передачах управления:
1.1. Ни один из операторов Бк+1, ... , 8т не находится в зоне действия какого-либо условного оператора из множества Б1, ... , Бк (т.е. выполнение или невыполнение этого оператора не зависит от значения логического выражения условного оператора).
1.2. Ни один из операторов Бк+1, ... , 8т не находится в теле цикла, заголовок которого во множестве 81, ... ,
Рис. 1. Построение графа информационных связей открытой распараллеливающей системой
1.3. Всякий оператор goto из множества S1, ... , Sk (или Sk+1, ... , Sm) указывает на метку оператора из этого же множества;
2) не существует такой дуги графа информационных связей (у1,у2), что г1 принадлежит Si, к+1<<т, у2 принадлежит Sj, 1<]<к.
Приведение цикла к разбиваемому виду
Иногда условия разбиения цикла не выполняются, но после проведения некоторых эквивалентных преобразований этого можно добиться. Препятствиями для разбиения цикла могут быть либо синтаксические особенности (управляющие связи в теле цикла), либо информационные зависимости. Поэтому предварительные преобразования, ориентированные на дальнейшее разбиение цикла, состоят в устранении управляющих связей или информационных зависимостей.
Использование перестановки операторов для разбиения цикла. Иногда бывает так, что в исходном виде цикл не разбивается, но если в теле этого цикла переставить местами некоторые операторы, разбиение станет возможно.
Пример 1.
Фрагмент программы
¥ог^=0;<М+)
{
Хф=АА+1)+А(-1);
С=Хр+1)*5;
}
эквивалентен следующему:
¥ог^=0;<М+)
{
С=Хр+1)*5;
Х(0=А^+1)+А(-1); }
и следующему:
¥оф=0;ИМ^++) {
С=Хр+1)*5; }
¥ог^=0,ч<М,ч++) {
Хф=АА+1)+А(-1); }■
Использование преобразования «введение временных массивов» для разбиения цикла. Не всегда можно произвести перестановку операторов, потому что это преобразование может оказаться не эквивалентным. Пример 2.
Фрагмент программы
¥оф=0;ИМ^++) {
А(У=Х®*5;
Х0)=Аф; }
не эквивалентен следующему:
¥оф=0;ИМ^++) {
Хф=А()
А(1)=Х(г)*5; }
Иногда после перестановки операторов цикл все равно нельзя разрезать, потому что вместо одной дуги, направленной снизу вверх, появляется другая, имеющая такое же направление. Пример 3.
Фрагмент программы
¥от(1=0;1<М;1++) {
Л(1)=Х(1+1)*5;
Х(1)=Л(1+2); }
эквивалентен следующему:
¥от(1=0;1<М;1++) {
Х(1)=Л(1+2); Л(1)=Х(1+1)*5; },
но даже после перестановки операторов разрезать цикл нельзя.
Преобразование «введение временных массивов» [5, с. 121] может устранить дугу антизависимости, идущую снизу вверх. Правда, в результате преобразования появятся две дуги, идущие сверху вниз. После этого неразбиваемый цикл может стать разбиваемым. Пример 4.
¥от(1=0;1<М;1++) {
Л(1)=Б(1)+н1и(С(1));
С(1)=Л (1+1)+Б(1); }
В этом примере непосредственная перестановка операторов неэквивалентна. Для осуществления перестановки можно ввести временный массив ТЕМР(г).
¥от(1=0;1<^;1++) {
ТЕМР(1)=С(1); Л(1)=Б(1+т(ТЕМР(1));
С(1)=Л(1+1)+Б(1); }
Теперь можно выполнить перестановку операторов и разбить цикл, хотя за это пришлось заплатить появлением еще одного оператора присваивания.
¥от(1=0;1<^;1++) {
ТЕМР(1)=С(1); }
¥от(1=0;1<М;1++) {
С(1)=Л(1+1)+Б(1); }
¥от(1=0;]<М;]++) {
Л(1)=Б(1)+н1и(ТЕМР(1)); }
Алгоритм разрезания цикла, использующий перестановку операторов и введение временных массивов. Для описания алгоритма используется фактор-граф -это граф, вершинами которого являются классы эквивалентности, а дуга соединяет 2 вершины тогда и только тогда, когда в исходном графе была дуга, соединяющая вершины, принадлежащие этим классам эквивалентности.
Для большей ясности рассмотрим Пример 5.
¥от(1=0;1<10;1=1+1) {
Л[1]=Б[1]+Б[1-1];
Б[1]=С[1-1];
С[1]=Б[1+1]+Б[1-1];
В[1]=С[1-1]+Е[1+1];
Е[1]=0[1];
}■
Построим фактор-граф, в котором в качестве классов эквивалентности рассматриваются вхождения, относящиеся к одному оператору. Отбросим дуги антизависимости. Выделим в получившемся графе компоненты сильной связности и построим для них правильную нумерацию (т.е. такую, в которой нет дуг из вершин с большими номерами в вершины с меньшими) (рис. 2).
О
о
ш
0
1
О
Ь
Рис. 2. Фактор-граф, полученный из графа информационных связей: кружочки - вершины графа, соответствующие операторам тела цикла. В правой части выделены компоненты сильной связности и задана правильная нумерация. При этом дуги антизависимости, обозначенные пунктиром, не учитывались
На данный момент мы можем разрезать цикл на 3 части (цикла). В 1 -м результирующем цикле будут первые 3 оператора присваивания примера 5, во 2-м -4-й оператор, в 3-м - 5-й оператор присваивания цикла из примера 5. Разрезать цикл так, чтобы 1 и 2-й операторы оказались в разных результирующих циклах нельзя, потому что есть дуга, идущая из 2 в 1.
Попробуем произвести манипуляции, которые помогут разрезать цикл на 4 части. На 5 частей, пользуясь лишь перестановкой операторов и введением временных массивов, его разрезать не удастся. Это связано с тем, что ни одно из перечисленных преобразований не сможет удалить или перенаправить дугу потоковой зависимости, ведущую от 3-го оператора присваивания ко 2-му.
Для дуг антизависимости, идущих из компоненты с большим номером в компоненту с меньшим, применим преобразование «введение временных массивов» (рис. 3).
Теперь цикл можно разрезать на 5 частей. В 1 -й части будет находиться оператор присваивания, который появился в результате преобразования «введение
временных массивов», в остальных - компоненты Расположим компоненты сильной связности со-сильной связности. гласно правильной нумерации (рис. 4).
Рис. 3. Цикл после применения преобразования «введение временных массивов» для удаления одной из дуг антизависимости. Фактор-граф, изображенный справа, изменился, так как добавился новый оператор присваивания, и изменился оператор, составляющий компоненту номер 3
Рис. 4. Цикл после применения преобразования «перестановка операторов» с целью расположить полученные ранее компоненты сильной связности согласно правильной нумерации
Жог(И=0;И<10;И=И+1) {
ВТЕМР_ 1[И]=Б[Н] }
¥отО,2=0^2<10^2Ч2+1) {
В^2]=С^2-1];
С^2]=В^2+1]+В^2-1]; }
Гот^3=0,ч3<10,ч3=3+1) {
Бр3]=С^3-1]+Ер3+1]; }
Еот^4=0^4<10М^4+1) {
Ар4]=ВТЕМР_1р4]+В^4-1]; }
Еот^5=0,ч5<10,ч5^5+1) {
Е^5]=0^5]; }
Работа поддержана проектом «Создание высокотехнологичного производства комплексных решений в области предметно-ориентированных облачных вычислений для нужд науки, промышленности, бизнеса и социальной сферы», шифр 2010-218-01-209; ФЦП «Научные и научно-педагогические кадры инноваци-
Поступила в редакцию_
онной России» по теме «Диалоговый высокоуровневый оптимизирующий распараллеливатель программ и его приложения», государственный контракт 02.740.11.0208 от 7 июля 2009 г.; ФЦП «Научные и научно-педагогические кадры инновационной России» по теме «Создание биоинформационной технологии поиска взаимосвязанных сценариев организации в геномах животных и человека некодирующей ДНК и кодирующей белок ДНК», государственный контракт № 14.740.11.0006 от 1 сентября 2010 г.
Литература
1. Allen R., Kennedy K. Optimizing compilers for modern ar-
chitectures. San Francisco; San Diego; N.Y.; Boston; London; Sidney; Tokyo. 2002. 790 p.
2. Преобразования программ для открытой распараллели-
вающей системы / Б.Я. Штейнберг [и др.] // Искусственный интеллект. 2003. № 3. С. 97-104.
3. Штейнберг Б.Я. Математические методы распараллели-
вания рекуррентных программных циклов на суперкомпьютеры с параллельной памятью. Ростов н/Д, 2004. 192 с.
4. Lamport L. The parallel execution of DO loops // Commun.
ACM. 1974. Vol. 17, № 2. P. 83-93.
5. Векторизация программ: теория, методы, реализация:
c6. переводов ст. М., 1991. C. 346-267.
6. URL: http://www.ops.rsu.ru (дата обращения: 21.12.2010).
21 декабря 2010 г.