АЛГОРИТМ ПОИСКА ПАРАЛЛЕЛЬНОСТИ БЕЗ СИНХРОНИЗАЦИЙ ВО ВЛОЖЕННОСТЯХ ЦИКЛОВ

Информационные технологии Вестник Нижегородс кого университета им. Н.И. Лобачевско го, 2012, № 2 (1), с. 203-209
УДК 004.272
АЛГОРИТМ ПОИСКА ПАРАЛЛЕЛЬНОСТИ БЕЗ СИНХРОНИЗАЦИЙ ВО ВЛОЖЕННОСТЯХ ЦИКЛОВ
© 2012 г. А.А. Новокрещенов
Нижегородский государственный технический университет им. Р.Е. Алексеева andrew.novokreshchenov@gmail.com
Поступнна в р1дакцню 11.01.2012
Предлагается алгоритм поиска параллельности во вложенностях циклов с учетом того, что в качестве целевой архитектуры выступают графические процессоры №УГО1А. Задача алгоритма заключается в выделении максимального количества независимых потоков в исходной вложенности. Результаты работы алгоритма могут быть использованы как входная информация для существующих методов генерации SIMD-кода.
Кнютвые снова: автоматическое распараллеливание, вложенность циклов, СиЭА, GPU, SIMD.
Введение
Поиск параллельности, скрытой в последовательной программе, и ее адаптацию для целевой параллельной архитектуры затруднительно выполнять вручную. Поэтому актуальной на сегодняшний день является задача распараллеливающей трансляции. Это комплексная задача, состоящая из фаз синтаксического анализа, анализа зависимостей, поиска параллельности, генерации кода. В данной работе предлагается алгоритм поиска параллельности без синхронизаций во вложенностях циклов. Данный алгоритм ориентирован на то, что в качестве целевой архитектуры выступают графические процессоры №УШ1А [1]. Данные устройства активно используются, и задача автоматизированного распараллеливания программ для подобных архитектур является актуальной [2].
1. Модель входной вложенности циклов
Алгоритмы, на которых основаны фазы анализа зависимостей и поиска параллельности, воспринимают входную программу как набор математических моделей, заключающий в себе всю необходимую информацию для идентификации структуры параллельной программы [3-5]. Поэтому для дальнейших рассуждений необходимо четко сформулировать, что представляет собой модель входной вложенности циклов.
Пусть задана вложенность, состоящая из d циклов. Пронумеруем подряд сверху вниз все индексные переменные циклов 11, х2,..., 1^. Границы изменения каждой индексной переменной xi представляют собой аффинные выражения от индексных переменных х1,., х/-1 и/или символьных констант, а шаг изменения каждой ин-
дексной переменной равен +1. Так же пронумеруем все инструкции присваивания 51, 52,...5П (далее - просто инструкции) [3]. Класс программ, удовлетворяющих данным условиям, достаточно широк, и задача распараллеливания программ, принадлежащих этому классу, имеет практическую ценность [6].
Любую комбинацию значений индексных переменных вложенности циклов глубины d можно представить как точку в d-мерном целочисленном пространстве X = (хь х2,..., х^, X е 21. При этом 1-е измерение данного пространства соответствует индексной переменной /-го вложенного цикла [7]. Следует отметить, что на данном пространстве определен лексикографический порядок.
Далеко не все точки в пространстве 2 1 представляют собой комбинации индексов, которые встречаются при выполнении d-мерной вложенности циклов, так как индексные переменные имеют границы, в пределах которых они изменяются. Вложенность циклов, принадлежащая указанному классу, может быть представлена в виде целочисленного параметризованного многогранника в 21 от х1,..., х* содержащего все комбинации значений переменных х1,..., х1 [8]. Данный многогранник называют пространством итераций [7].
Срабатывание инструкции 5- в определенной точке пространства итераций называют экземпляром инструкции 5- [7]. Часто бывает так, что инструкция срабатывает не во всех точках пространства итераций. Это происходит из-за того, что вложенность циклов может быть неидеальной (т.е. не все инструкции охвачены одинаковым числом циклов), а также из-за наличия операторов ветвления, определяющих условия срабатывания инструкции [9]. Поэтому для ка-
ждой инструкции необходимо определять множество комбинаций значений индексных переменных, при которых срабатывает данная инструкция. Множество, определяющее срабатывание инструкции 5/, называют ее доменом
05 [8]. Если инструкцию 5- охватывают т циклов, то 05 может быть представлен в виде целочисленного параметризованного многогранника в 2 от Х5 ={х1,х2,...,хт} и п5 = {п\, п2,...,
П]}. Вектор п5 называют вектором структурных
параметров циклов, охватывающих 5- [8].
В данной работе подразумевается, что инструкции содержат в себе только обращения к массивам, при этом индексные выражения представляют собой аффинные выражения от индексных переменных и/или символьных констант [4, 6-8, 10]. В этом случае каждое обращение к массиву, заключенное в инструкции 5/, может быть представлено в виде кортежа
(Л, / (ХД 8), (1)
где Л - имя массива, к которому выполняется обращение, /(Х5 ) - аффинная функция, устанавливающая соответствие между комбинацией значений индексных переменных Х5 и элементом массива Л, 5 - переменная, принимающая значения «истина» или «ложь», если происходит обращение на запись или чтение, соответственно [10]. Следует отметить, что без потери общности данная модель может быть использована и для обычных переменных - всякую переменную можно считать массивом, состоящим из одного элемента [3].
В качестве модели инструкции 5 может быть использован следующий кортеж:
(^, М8), (2)
где 05 - домен инструкции 5/, М5 - множество обращений, заключенных в теле 5/, представленных в форме (1).
Модель входной вложенности циклов представляет собой множество кортежей вида (2), определяющее все инструкции данной вложенности. Информации, заключенной в этой модели, достаточно для выполнения процедур анализа зависимостей и поиска параллельности, т.е. для процедуры распараллеливания в целом [10].
2. Модель зависимости
ствует пара обращений (Л,/х(Х5 ),8Л еМ5 и
Л, /2(Х5 ),82) е М5 , для которой справедливо:
(81 у82) л (3x5 е , 3x5 е В5 | Х5, < Х* ) л Л (/1(О - /2(—О =
(3)
Инструкция (Е>5 ,М5 I зависит по данным от инструкции ,М 5) в том случае, если суще-
где х5 и х5 - комбинации конкретных значений индексных переменных, символ « < » обозначает отношение «меньше» в лексикографическом смысле [10]. Задача алгоритма анализа зависимостей состоит в том, чтобы определить, существуют ли пары целочисленных векторов {—5 ,Х* }, удовлетворяющих (3), а также определить все эти пары [4]. Простое перечисление пар {—5 , Х8 } не может быть использовано в качестве выхода алгоритма анализа зависимостей в силу того, что в случае наличия зависимости число пар обычно очень велико. Поэтому для представления множества пар, удовлетворяющих (3), используются различные аппроксимации [5]. В данной работе в качестве аппроксимации множества пар используются векторы расстояний. Вектором расстояния V, называется вектор, для которого справедливо условие [5]:
— * — * — / л\
Х3] = Х5- + V,] (4)
для пар {—* ,Х* }, удовлетворяющих (3).
Задача процедуры анализа зависимостей заключается в проверке всех пар обращений исходной программы на наличие зависимости [3, 4, 7]. Наиболее часто результат процедуры анализа представляется в виде сокращенного графа зависимостей (СГЗ) - ориентированного графа с одной вершиной для каждой инструкции исходной вложенности и дугами, помеченными в соответствии с выбранным типом аппроксимации [5]. В данной работе в качестве результата процедуры анализа зависимостей используется СГЗ, дуги которого помечены векторами расстояний.
3. Модель параллельной программы
В качестве целевой архитектуры в данной работе используются графические процессоры ^РЦ) №УТО1А. Эти устройства представляют собой массив, состоящий из потоковых мультипроцессоров. Каждый мультипроцессор состоит из восьми скалярных процессоров [1]. В современных моделях GPU количество потоковых процессоров достигает нескольких десятков. GPU представляет собой существенно параллельную архитектуру, позволяющую эффективно выполнять одновременно большое число потоков [1]. Данные устройства относятся к классу SIMD [1, 2].
Программа для GPU представляет собой функцию, параметризованную идентификатором потока. Код этой функции выполняется всеми потоками, но благодаря параметризации каждый поток может выполнять различные действия [1, 2]. Подобные функции называют ядрами (kernel).
Идентификатор потока представляет собой одномерный, двумерный или трехмерный целочисленный неотрицательный вектор. Во время выполнения ядра каждый поток «знает» собственный идентификатор. За планирование потоков отвечает драйвер GPU, и заранее нельзя определить, в какое время и на каком процессоре будет выполняться конкретный поток [1].
Синхронизация между потоками возможна только в рамках блока потоков [1].
В соответствии с указанными архитектурными особенностями GPU в качестве модели параллельной программы будет использоваться пространство потоков, представляющее собой неотрицательную область Z d, где d = 1,2,3, каждая точка которой представляет собой идентификатор потока. Возможность синхронизации между потоками в данном пространстве отсутствует.
4. Модель процедуры поиска параллельности
В соответствии с принятыми моделями последовательной и параллельной программ, задача процедуры поиска параллельности заключается в распределении всех экземпляров инструкций исходной вложенности циклов между потоками таким образом, чтобы между ними (потоками) не требовалась синхронизация и количество потоков было максимально возможным.
Более формально: если входная вложенность циклов содержит N инструкций и представлена
S.) }, 1 ^i ^ N,
процедура поиска параллельности для каждой инструкции S, должна определить отображение точек ее домена DS в точки пространства потоков П S (xS ). При этом отображения должны отвечать следующим требованиям:
- экземпляры инструкций S, и Sj, Vi, j, образующие зависимость в точках Xs е DS , Xs е DS в форме (3), должны быть отображены в одну точку пространства потоков, т.е.:
П S_( X*) = П Sj( XSj); (5)
- независимые экземпляры инструкции Si, Vi, должны быть отображены в различные точки пространства потоков.
множеством кортежей | /Ds ,M
Экземпляр инструкции 5- в точке Х5 считается независимым, если не существует такой пары обращений {Л,/КХ* )Л) еМ%, (л,еМ,, V], для которой было бы справедливо условие:
(81 V 82) л (3Х5,е в5,, 3Х5]е в5]1 х5*] < х5,) л
л (/,(Х*) - /2( х5) = 0).
В данной работе предполагается, что отображение между точками домена и точками пространства потоков является аффинным. Это позволяет свести задачу поиска отображений к задаче линейного программирования.
Отображение множества 2 1 в множество 2 к, определяемое правилом:
а(х) = Cx + с , (6)
где C - (к х 1)-матрица, Х е 21, ае 2к, с е 2к, называется аффинным отображением [11]. Учитывая условие (6) и то, что 05 представляет собой параметрический целочисленный многогранник от Х5 и структурных параметров циклов
п5 , охватывающих 5, отображение П 5 (Х5 ) точек домена 05 в пространство потоков можно представить в виде аффинной функции:
П5, (Х5, ) = ^^1,5, 5, + C2,51П51 + —3,5. , (7)
где C15 - (к х 1)-матрица, 1 - число компонент в Х5 (размерность 05 ), к - размерность пространства потоков, C25 - (к х /)-матрица, / -количество структурных параметров, Х5 е 05 . П 5 (Х5 ) и с35 принадлежат к-мерному пространству потоков.
Таким образом, задача поиска параллельности сводится к отысканию C15 , C25 , с35 , удовлетворяющих указанным выше условиям, для всех инструкций исходной вложенности циклов.
5. Алгоритм поиска параллельности
Входной информацией для предлагаемого алгоритма поиска параллельности является СГЗ с векторами расстояний, полученный в результате выполнения анализа зависимостей.
Первый шаг предлагаемого алгоритма заключается в определении размерности пространства потоков, т.к. размерность прямым образом влияет на размерности ^ 5 , ^ 5 , с35 .
Принципиальная идея, на которой основан алгоритм определения размерности пространства потоков, заключается в следующем: размерность должна быть выбрана таким образом,
чтобы все независимые экземпляры инструкций могли быть взаимнооднозначно отображены в пространство потоков.
Прежде чем представить алгоритм определения размерности, необходимо представить понятие многогранника зависимостей, на которое опирается данный алгоритм. Если во входном СГЗ существует дуга из вершины 5- в 5, помеченная вектором расстояния V ,, то многогранником зависимостей Р5 5 называется целочисленный параметрический многогранник от Х5 , Х5 , п5 , п5 , составленный из 05 , 05 и
уравнений Х5 - Х5 + = 0 [5, 8]. Ниже пред-
ставлен алгоритм определения размерности пространства потоков.
Для каждой инструкции 5- исходной вложенности выполнить:
1. Вход: 05 и все многогранники зависимостей, в которых в качестве зависимой инструкции участвует 5-: Р5 5 , Р5^5 и т.д.;
2. К каждому многограннику зависимостей применить алгоритм исключений Фурье-Моц-кина для исключения из них всех индексных переменных кроме переменных Х5 . Результатом данного шага являются многогранники
P5],5I, Р5к,5. и т.д.;
3. Определить N5 - множество независимых экземпляров инструкции 5 - как разницу многогранников: N5 = 05 -Р5 5 -Р5^5 -...;
4. Определить размерность N5 .
Размерность N5 представляет собой количество индексных переменных, не обратившихся в константы после выполнения шага 3. В качестве размерности пространства потоков выбирается
максимальная размерность среди всех N5 .
Вторым шагом предлагаемого алгоритма поиска параллельности является составление прообразов аффинных функций отображения П5 (Х5 ) для каждой вершины 5 входного СГЗ.
Учитывая то, что пространство потоков представляет собой неотрицательную область 2 а, то прообразы предлагается составить, используя аффинную форму леммы Фаркаша [12]. Лемма утверждает, что функция / (Х) будет неотрицательна на всем многограннике AХ + Ь > 0 тогда и только тогда, когда она представляет собой положительную аффинную комбинацию вида:
/(—) = 10 + 1(ЛХ + Ь), 10 > 0, 1 > 0 . (8)
Множители называют множителями Фар-каша. В соответствии с (8) прообраз функции отображения для каждой инструкции Si может быть составлен в виде:
П51(Х51) = 1 +1Г^5_, 10,1 > — . (9)
Учитывая (9), искомые С15 , С25 , с35 можно
выразить через соответствующие множители Фаркаша. Таким образом, задача алгоритма поиска параллельности сводится к определению целочисленных значений множителей Фаркаша.
Третьим шагом предлагаемого алгоритма поиска параллельности является составление ограничений, учитывающих требование о независимости потоков. Для этого необходимо, чтобы для каждой дуги входного СГЗ, проведенной из вершины S1 в 5, помеченной вектором расстояния V ], выполнялось условие:
П5 (Х*) - П5, (Х5,)=0 ^, Х5,1Х* = Х5,-—,]}. (10)
На понятийном уровне (10) означает, что все зависимые экземпляры инструкций S1 и 5 должны выполняться в рамках потока с одним идентификатором.
Учитывая связь между экземплярами зависимых инструкций через вектор расстояния V ] , (10) можно переписать в упрощенной форме, избавившись от Х5 :
п 5(Х5- —,])-п 5(Х5) =— vx;. (11)
Результатом третьего шага является набор систем линейных уравнений, содержащих в себе все ограничения, вытекающие из зависимостей данных. Способ получения систем уравнений из выражений вида (11) подробно объясняется в работах [7, 12].
Четвертым шагом предлагаемого алгоритма поиска параллельности является составление ограничений, учитывающих требование о максимизации количества потоков. Из геометрических соображений очевидно, что последнее будет справедливо, если для каждой инструкции S1 исходной вложенности все точки многогранника N5 будут взаимно-однозначно отображаться в пространство потоков. Отображение, определяемое аффинной функцией й(х) = Сх + с , только тогда будет взаимно-однозначным, если определитель матрицы С не равен нулю [13]. Учитывая то, что N5 и пространство потоков
являются целочисленными, взаимно-однозначное отображение возможно лишь в том случае, если определитель матрицы, составленной из коэффициентов П5 (Х5 ) при индексных переменных, оставшихся в N5 , равен ±1. Это зна-
чит, что указанная матрица является унимоду-лярной. Чтобы избежать процедуры перебора элементов матрицы C, приводящих к ее унимодулярности, предлагается требовать от матрицы C свойства элементарности. Элементарной матрицей называется матрица, которая отличается от единичной одним элементом, стоящим на главной диагонали [I4].
Всякая элементарная матрица унимодулярна [I4]. Основываясь на данном утверждении, можно получить линейные уравнения, учитывающие требование максимизации числа потоков. Данные уравнения следует добавить к соответствующим системам, полученным на третьем шаге. Также к этим системам добавляются неравенства, требующие неотрицательности множителей Фаркаша. Результатом данного шага является набор систем уравнений/неравенств от искомых множителей Фаркаша.
Пятым шагом предлагаемого метода является отыскание решения на полученных системах уравнений/неравенств. Учитывая то, что данные системы имеют бесконечное множество решений, задача отыскания целочисленных значений множителей Фаркаша представляет собой задачу целочисленного линейного программирования. Если с каждым множителем Фаркаша связать одномерное пространство, то система превращается в многогранник в ZF, где F - количество множителей Фаркаша. В результате решение предлагается определять как точку лексикографического минимума соответствующего многогранника. Для этого необходимо ввести на многограннике отношение порядка, т.е. упо-
F
рядочить координатные оси пространства Z . Упорядочить их следует таким образом, чтобы коэффициенты при индексных переменных оказались в результате минимальными. Результатом пятого шага является вектор искомых множителей Фаркаша, используя которые можно построить все CI, , C2, , СЗ, .
6. Пример
Предложенный алгоритм был опробован на трех программах, выполняющих умножение матрицы на вектор, матрицы на матрицу, перемножение полиномов, и на программе, содержащей перекрестную зависимость между инструкциями. Код данных программ представлен ниже. Умножение матрицы на вектор (matvec): for (i = О; i <= N - 1; i++) і
C[i] = О;/* S1 */ for (j = О; j <= N - 1; j++) C[i]=C[i]+A[i] [j] *B[j] ;/*S2*/
Умножение матрицы на матрицу (matmult):
for (i = 0; i <= N - 1; i++) for (j = 0; j <= N - 1; j++)
{
C[i][j] = 0;/* S1 */ for (k = 0; k <= N - 1; k++) C[i] [j]=C[i] [j]+A[i] [k]*B[k] [j]; /* S2 */
}
Перемножение полиномов (poly):
for (int i = 0; i <= N; i++)
for (int j = 0; j <= N; k++)
{
if (i == 0 || j == 0)
C[i-j+N]=A[i]*B[N-j];/*S1*/ if (i != 0 && j != 0)
C[i - j + N] = C[i - j + N] +
A[i] * B[N - j]; /* S2 */
}
Программа с перекрестной зависимостью (cross):
for (i = 0; i <= N - 1; i++)
for (j = 0; j <= N - 1; j++)
{
X[i][j] = X[i][j] + Y[i -
1] [j];/* S1 */
Y[i] [j] = Y[i] [j] + X[i] [j -
1] ;/* S2 */
}
Для анализа зависимостей в данной работе использовался пакет Petit [15, 16].
К соответствующим результатам анализа зависимостей применялся алгоритм, предложенный в предыдущем параграфе. С его помощью были получены функции отображения, представленные ниже в таблице. Подставляя минимальные и максимальные значения индексных переменных в функции отображения, можно получить число независимых потоков, в рамках которых будет выполняться параллельный аналог исходной программы.
На основе указанных функций был получен SIMD-код ядер для выполнения на GPU. Для получения кода использовался метод, предложенный в [7]. Полученные программы представлены ниже. Все они параметризованы идентификатором потока - ID. В случае двумерного пространства потоков идентификатор потока представляет собой пару (IDx, IDy).
Умножение матрицы на вектор SIMD (mat-vec_s):
if (ID <= N - 1)
{
C[ID] = 0;
For (I = 0; I <= N - 1; i++) C[ID]=C[ID]+A[ID][i]*B[i];
}
Умножение матрицы на матрицу SIMD (matmult_s):
Таблица
Исходная программа Функции отображения Число независимых потоков
matvec ПS, (i) = i, ПS2 (i) = i N
matmult (i 'I (i 'I П ,0V> = j . П sjij) = j \J J \J J N
pdy П^ (i, j) = i - j + N, П S (Л j) = i - j + N 2 2N + 1
cross ПSi (b j) = i - j + N - 1, П S (Л j) = i - j + N 2 2N
if (^х <= N-1 && IDy <= N-1)
{
С[^х] [^у] = 0 ;
Рог (I = 0; I <= N - 1; i++) С[^х][^у] = С[^х][^у] + А [ ^х] [i] * В [i] [^у] ;
}
Перемножение полиномов SIMD (poly_s):
if (ID <= 2*Ю {
foг (i = тах (0, ^ - N); i <=
п^п (N, ID) ; i++)
foг (j = тах (0, i - ID + ^;
j <= min (N, i - ID + N); j++)
{
if (i == 0 || j == 0)
Си - j + N] =
А^]* В [N - j ];
if (i != 0 && j != 0)
C[i - j + N] =
Си - j + N] + A[i]* В [N - j ] ;
}
}
Программа с перекрестной зависимостью SIMD (cross_s):
if (ID <= 2*N - 1)
{
if (ID == 0)
Х[1] [N] = Х[1] [N] + У[0] [N] ; if (ID >= 1 && ^ <= 2*N - 2)
{
if (ID >= N)
Y[ID - N + 1][1] = У[^
- N + 1][1] + Х[^ - N + 1] [0];
^г (i = тах (1, ^ - N + 2);
i <= min (^ ID) ; i++)
{
Х^] [i - ID + N - 1] =
X[i][i - ID + N - 1] +
Y [ i - 1] [i - ID + N - 1];
Y[i] [i - ID + N] =
Y[i][i - ID + N + X[i][i - ID + N
- 1];
if (ID <= N - 1)
X[ID + 1] [N] = X[ID +
1] [N] + Y[ID] [N] ;
}
if (ID == 2*N - 1)
Y [N] [1] = Y[N] [1] + X [N] [0] ;
}
Для оценки быстродействия программ выполнялись замеры времени их выполнения для входных массивов различной длины (различных значений N). Для вычислений в данной работе использовалось следующее программное обеспечение и оборудование: операционная система Ubuntu Linux 10.04, CUDA Toolkit 4.0, драйвер графической карты версии 270.41. Последовательные программы запускались на следующей конфигурации: Intel Pentium Dual-Core 2.6 ГГц, RAM - 2048 Мб. Параллельные программы выполнялись на устройстве NVIDIA GeForce 9600 GT (64 скалярных процессора, 512 МГц каждый), 512 Мб встроенной памяти. Для более эффективного выполнения программ графическая оболочка операционной системы отключалась.
Результаты временных замеров представлены в виде значения коэффициента ускорения к, представляющего собой отношение времени выполнения исходной последовательной программы ко времени выполнения ее параллельного аналога, при соответствующем значении N (рис. 1).
Значение к > 1 говорит о том, что параллельная программа выполняется быстрее исходной. Как видно, в среднем параллельные программы оказались быстрее своих последовательных аналогов в 2-5 раз. Также наблюдается спад коэффициента ускорения при больших значениях N.
Список литературы
1. NVIDIA Corporation. NVIDIA CUDA C programming guide. November, 2010. Version 3.2.
2. Brodtkorb A., Dyken C. State-of-the-art in heterogeneous computing // Scientific Programming journal. Amsterdam: IOS Press, 2010. V. 18. P. 1-33.
N
N
N
в г
Рис. 1. Зависимость коэффициента ускорения от N: а) matmult; б) poly; в) matvec; г) cross
Лг
3. Штейнберг Б.Я. Математические методы распараллеливания рекуррентных циклов для суперкомпьютеров с параллельной памятью. Ростов-на-Дону: Издательство Ростовского университета, 2004. 192 с.
4. Арапбаев Р.Н., Евстигнеев В.А., Осмонов Р.А. Анализ зависимостей: основные тесты на зависимость по данным // Сибирский журн. вычислительной математики. Новосибирск, 2007. Т. 10. С. 247265.
5. Касьянов В.Н., Мирзуитова И.Л. Реструктурирующие преобразования: алгоритмы распараллеливания циклов // Программные средства и математические основы информатики. Новосибирск: Институт систем информатики им. А.П. Ершова СО РАН, 2004. С. 142-188.
6. Gautam G., Radjopadhye S. The Z-polyhedra model // Proceedings of the 12-th ACM SIGPLAN symposium on principles and practice of parallel programming. N.Y.: ACM, 2007. P. 237-248.
7. Ахо А., Лам М., Сети Р. Компиляторы. Принципы, технологии и инструментарий. 2-е изд. М.: Вильямс, 2008. 1184 с.
8. Pouchet L., Bastoul C. Iterative optimization in the polyhedral model: part 1, one-dimensional time // Proceedings of the International Symposium on Code
Generation and Optimization, CG0’07. Washington: IEEE Computer Society, 2007. P. 144-156.
9. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: БХВ-Петербург, 2004. 608 с.
10. Lim A., Lam M. Maximizing parallelism and minimizing synchronization with affine transform // Proceedings of the 24-th ACM SIGPLAN-SIGACT. N.Y.: ACM, 1997. P. 215-227.
11. Емеличев В.А., Ковалев М.М., Кравцов М.К. Многогранники, графы, оптимизация (комбинаторная теория многогранников). М.: Наука, 1981. 344 с.
12. Feautrier P. Some efficient solutions to the affine scheduling problem. One-dimensional time // International Journal of Parallel Programming. Norwell: Kluwer Academic Publishers, 1992. V. 21. P. 313-348.
13. Беклемишев Д.В. Курс аналитической геометрии и линейной алгебры. 10-е изд. М.: Физматлит, 2005. 304 с.
14. Курош А.Г. Курс высшей алгебры. СПб.: Лань, 2004. 432 с.
15. http://www.cs.umd.edu/projects/omega/ (дата обращения: 10.01.2012)
16. Pugh W. The Omega test: a fast and practical integer programming algorithm for dependence analysis // Proceedings of the 1991 ACM/IEEE conference on Supercomputing. N.Y.: ACM, 1991. P. 4-13.
A SEARCH ALGORITHM FOR FINDING SYNCHRONIZATION-FREE PARALLELISM
IN NESTED LOOPS
A.A. Novokreshchenov
A search algorithm for finding parallelism in nested loops is proposed to be used with NVIDIA GPUs. The task of the algorithm is to identify the maximum number of independent threads in the original nesting. The algorithm performance results can be applied as input information for the existing methods of SIMD code generation.
б
а
Keywords: automatic parallelization, loop nesting, CUDA, GPU, SIMD.