АВТОМАТИЧЕСКОЕ РАСПАРАЛЛЕЛИВАНИЕ ПРОГРАММ В ПРОЦЕССЕ ТРАНСЛЯЦИИ
Лебедев Артем Сергеевич
Рыбинский государственный авиационный технический университет имени П.А. Соловьева, Рыбинск
Современные вычислительные архитектуры обладают значительным параллелизмом, и его степень только увеличивается со временем. Наряду с традиционными универсальными многоядерными процессорами для высокопроизводительных вычислений используются так называемые ускорители - графические процессоры (GPU) и сопроцессоры Intel Xeon PHI. Программирование параллельных архитектур никогда не было тривиальной задачей, и с увеличением разнообразия аппаратных платформ эта задача усложняется. Сложившаяся ситуация требует развития инструментов программирования параллельных систем для повышения качества оптимизирующей трансляции кода и абстрагирования от целевой аппаратной платформы. Большинство вычислительно емких научных и инженерных приложений тратят значительную часть процессорного времени на вложенности циклов. Зачастую такие участки удовлетворяют критериям линейности программ. Модель многогранников [8] предоставляет развитый математический аппарат для осуществления анализа и трансформации таких программ с целью их распараллеливания и оптимизации локальности данных. Она широко используется в статической компиляции [1, 5-7]. Однако, существуют программы с сильной параметризацией, к которым модель многогранников не может быть применена непосредственно, так как не все параметры модели известны статически или выводимы во время компиляции.
В работе предложен подход JIT (Just-In-Time) компиляции для автоматического распараллеливания программ методами модели многогранников, направленный на достижение двух целей:
• расширить границы применимости модели многогранников в случае, когда не все параметры модели известны во время статической компиляции;
• достичь переносимости автоматически распараллеливаемого кода между параллельными архитектурами.
Все параметры модели (технически, значения переменных) становятся известными во время выполнения программы, и ее параметризация ослабляется. Существует класс программ с сильной параметризацией, сводимых таким образом к линейным, и модель многогранников может быть применена.
Переносимость автоматически распараллеливаемого кода обеспечивается самой идеей JIT-компиляции -достаточно поддержать требуемое множество целевых архитектур на фазе кодогенерации.
Автором выбрана среда Java Virtual Machine 1.7u60 [9] для разработки и интеграции распараллеливающего модуля. В качестве целевых параллельных архитектур рассматриваются графические ускорители с поддержкой OpenCL (NVIDIA и AMD), сопроцессор Intel Xeon Phi, универсальные многоядерные процессоры и кластерные системы на основе архитектуры x86.
На рисунке 1 проиллюстрировано положение распараллеливающего модуля в общем тракте трансляции байткода Java.
Java Bytecode ---*
^инструкцииJ ^оптимизаторы/ V МОдуЛ^ J Уинтерпретато^/
Рисунок 1. Распараллеливающий модуль в JIT-компиляции
Промежуточный код (Java IR) инструментируется различными вызовами в зависимости от целевой архитектуры:
• графический процессор - вызовы OpenCL С функций;
• системы с распределенной памятью - MPI-вызовы;
• многоядерный процессор - вызовы функций из библиотеки POSIX Threads;
• Intel Xeon Phi - вызовы динамической библиотеки, сформированной в результате кодогенерации (компилятор ICC - единственное на момент исследования средство, с помощью которого может быть получен машинный код для архитектуры Intel MIC). Поиск функции расписания осуществляется для
многомерного случая по алгоритму [3, с. 9]. Поиск функции размещения основывается на правиле «вычислитель -владелец» (значение принадлежит тому процессору, который его вычислил) и выполняется по алгоритму dependence-driven placements [4, с. 91]. Пусть имеет место зависимость по данным dX^Y между инструкциями X и
Y, где Rd- многогранник зависимости (n - вектор внешних параметров программы):
dX ^Y : <
(x,n,X) y,n, Y) : Rd
fx^
y
v n
>0
Для нахождения FCO-размещения формируется система ограничений вида:
Vx,y,n : Rd
y
v n
> 0
y
v n
-u
X
x
v n
> 0.
В случае кластерной системы применяется эвристика, позволяющая оптимизировать локальность данных и снизить стоимость коммуникаций. Для каждой зависимости по данным устанавливается дополнительное
ограничение: индексы виртуальных процессоров двух операций X и У, ее определяющих, не отличаются больше,
С +1
чем на заданное положительное число р, = -
п : Rd
У
V п
> 0 ^ 0 <п
У
V п у
-п,
V п У
<pd
Такое ограничение позволяет управлять расстоянием использования данных в пространстве физических процессоров благодаря зафиксированному разбиению: N (V) — V mod MSC, где V - номер виртуального процессора, N - номер физического процессора (в терминах модели многогранников), N = mSC + sC + C - глобальный номер ядра, где ТП = 0...(М — 1) - номер узла, 5 = 0... (S — 1) - номер процессора внутри узла,
С = 0.. .(С — 1) - номер ядра процессора. М- количество узлов в кластере, доступных для проведения вычислений, S - количество процессоров в каждом узле, C - количество ядер в каждом процессоре.
В качестве тестовой программы для распараллеива-ния рассматривается LU-разложение квадратной матрицы A порядка N, линеаризованной по строкам: for (int k = 0; k < N; k++) { for (int l = k + 1; l < N; l++) A[l * N + k] /= A[k * N + k]; for (int i = k + 1; i < N; i++) for (int j = k + 1; j < N; j++)
A[i * N + j] -= A[i * N + k] * A[k * N + j];
}
Индексы массива A в программе не являются аффинными по отношению к внешним параметрам программы и индексам циклов, обрамляющих инструкции доступа. Модель многогранников может быть применена только во время исполнения приложения, когда значение N станет известным и выражения примут требуемый аффинный вид.
Испытания проводились на двух машинах с акселераторами, где ускорение оценивалось относительно одно-поточного исполнения программы на центральном процессоре:
• CPU Intel Xeon-E5 2690, 64Gb RAM, Intel Xeon Phi 3100 (оценка ускорения при выгрузке вычислений на сопроцессор);
• CPU Intel Core i7 920, 24Gb RAM, NVIDIA GeForce GTX480 (оценка ускорения при выгрузке вычислений на видеокарту и при многопоточном исполнении на центральном процессоре).
Также были проведены испытания на трех двухпроцессорных узлах кластера IBM РГАТУ [10], оценивалось ускорение от распараллеливания на 6 параллельных процессов относительно запуска вычислений в одном процессе.
Для всех экспериментов N=213, тип элементов матрицы - float. Диаграмма ускорения вычислений после распараллеливания приведена на рисунке 2.
Рисунок 2. Ускорение вычислений после распараллеливания
Алгоритм LU-разложения показал значительное ускорение при параллельном выполнении, оправдывая накладные расходы на распараллеливание. Подход JIT-компиляции позволяет применить анализ и трансформацию методами модели многогранников к нелинейным программам с сильной параметризацией (если они сводимы к линейным во время их выполнения при подстановке значений параметров модели), тем самым расширяя границы применимости модели многогранников и улучшая переносимость автоматически распараллеливаемого кода.
Список литературы:
1. Bondhugula U. et al. Automatic transformations for communication-minimized parallelization and locality optimization in the polyhedral model //Compiler Construction. - Springer Berlin Heidelberg, 2008. - С. 132-146.
2. Feautrier P. Some efficient solutions to the affine scheduling problem. I. One-dimensional time //International journal of parallel programming. - 1992.
- Т. 21. - №. 5. - С. 313-347.
3. Feautrier P. Some efficient solutions to the affine scheduling problem. Part II. Multidimensional time //International journal of parallel programming. - 1992.
- Т. 21. - №. 6. - С. 389-420.
4. Griebl M. Automatic parallelization of loop programs for distributed memory architectures. - Univ. Passau, 2004.
5. Griebl M., Lengauer C. The loop parallelizer LooPo //Proc. Sixth Workshop on Compilers for Parallel Computers. - Konferenzen des Forschungszentrums Jülich, 1996. - Т. 21. - С. 311-320.
6. Irigoin F., Jouvelot P., Triolet R. Semantical interprocedural parallelization: An overview of the PIPS project //Proceedings of the 5th international conference on Supercomputing. - ACM, 1991. - С. 244-251.
7. Lee S. I., Johnson T. A., Eigenmann R. Cetus-an extensible compiler infrastructure for source-to-source transformation //Languages and Compilers for Parallel Computing. - Springer Berlin Heidelberg, 2004. - С. 539-553.
8. Lengauer C. Loop parallelization in the polytope model //CONCUR'93. - Springer Berlin Heidelberg, 1993. -С. 398-416.
9. URL: http://download.java.net/openjdk/jdk7/ (дата обращения: 21.10.2014).
10. URL: http://kbit.rsatu.ru/ibmcluster (дата обращения: 21.10.2014).