v2.2
This commit is contained in:
@@ -53,6 +53,11 @@
|
||||
url = "http://dvm-system.org"
|
||||
}
|
||||
|
||||
@online{dvm-doc,
|
||||
title = "Документация к языку Fortran DVMH",
|
||||
url = "http://dvm-system.org/static_data/docs/FDVMH-user-guide-ru.pdf"
|
||||
}
|
||||
|
||||
@inproceedings{sapfor-1,
|
||||
author = "Катаев Н.А., Черных С.А.",
|
||||
title = "Автоматизация распараллеливания программ в системе SAPFOR",
|
||||
|
||||
@@ -48,10 +48,10 @@
|
||||
|
||||
В общем случае такие циклы нельзя распараллеливать, так как в них важен порядок итераций, но существует несколько разных приёмов, позволяющих в некоторых случаях устранить зависимости по данным.
|
||||
|
||||
Важным этапом распараллеливания явлется определение того, какие данные являются локальными или общими по отношению к виткам циклов. Если скалярная переменная или массив перед использованием переопределяется (перезаписываются значения элементов соответственно) на той же самой итерации, то говорят, что такая переменная является \textit{приватной переменной} или \textit{приватным массивом} соответственно. Из определения следует, что счётчик цикла всегда приватен.
|
||||
Важным этапом распараллеливания является определение того, какие данные являются локальными или общими по отношению к виткам циклов. Если скалярная переменная или массив перед использованием переопределяется (перезаписываются значения элементов соответственно) на той же самой итерации, то говорят, что такая переменная является \textit{приватной переменной} или \textit{приватным массивом} соответственно.
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={
|
||||
Пример цикла по \texttt{i} с приватным массивом \texttt{TMP} и приватными переменными \texttt{i} (счётчик), \texttt{j}, \texttt{t}.
|
||||
Пример цикла по \texttt{i} с приватным массивом \texttt{TMP} и приватными переменными \texttt{i}, \texttt{j}, \texttt{t}.
|
||||
}]
|
||||
DO i = 1, 10
|
||||
DO j = 1, 100
|
||||
@@ -62,7 +62,8 @@
|
||||
ENDDO
|
||||
\end{lstlisting}
|
||||
|
||||
Похожим является класс \textit{редукционных переменных}. Он состоит из переменных, значения которых после цикла зависят от каждой итерации цикла, но не зависят от порядка их выполнения. При этом бинарная операция, с помощью которых объединяются частичные значения, называется \textit{редукционной}.
|
||||
|
||||
Часто в программах встречаются циклы, в которых выполняются \textit{редукционные операции} -- в некоторой переменной (\textit{редукционной}) суммируются элементы массива или вычисляется максимальное (минимальное) значение:
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={
|
||||
Пример цикла с редукционной переменной \texttt{sum} (редукционная операция -- сложение).
|
||||
@@ -74,3 +75,5 @@
|
||||
|
||||
write(*, *) sum
|
||||
\end{lstlisting}
|
||||
|
||||
Использование редукционных переменных приводит к появлению зависимостей между витками циклов. Но существуют приемы, которые позволяют справиться с такого вида зависимостями при распараллеливании программы. Например, создав для каждого потока (или процесса) копию переменной, можно объединить их значения по завершении выполнения цикла.
|
||||
@@ -1,4 +1,4 @@
|
||||
\subsection{SAPFOR}
|
||||
\subsection{Система SAPFOR}
|
||||
|
||||
Система SAPFOR (System FOR Automated Parallelization) предназначена для автоматизации процесса распараллеливания программ с использованием технологии DVMH. Она, так же как и DVM-система, поддерживает языки Си и Фортран. Система SAPFOR разделена на два проекта, каждый их которых отвечает за свой язык. В данной работе рассматривается только часть, связанная с языком Фортран.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Также система SAPFOR предоставляет набор директив, с помощью которых пользователь может управлять поведением системы при обработке программы. Например, с помощью таких директив можно задавать различные свойства программы, давать указания на расстановку контрольных точек, ограничивать распараллеливание. Сейчас системой поддерживается около десяти различных директив.
|
||||
|
||||
Рассмотрим подробнее директивы приватизации и редукции, которые будут упомянаться далее в работе. Директива приватизации, как и все директивы системе SAPFOR, представлена в виде комментария, начинающегося с префикса \texttt{\$SPF}. Далее идёт тело директивы, которое имеет вид \texttt{ANALYSIS (PRIVATE(...))}, где вместо троеточия должен быть указан список приватных переменных (скаляров или массивов) через запятую. Следующий пример демонстрирует использование директивы \texttt{PRIVATE} системы SAPFOR:
|
||||
Рассмотрим подробнее директивы приватизации и редукции, которые будут упоминаться далее в работе. Директива приватизации, как и все директивы системе SAPFOR, представлена в виде комментария, начинающегося с префикса \texttt{\$SPF}. Далее идёт тело директивы, которое имеет вид \texttt{ANALYSIS (PRIVATE(...))}, где вместо троеточия должен быть указан список приватных переменных (скаляров или массивов) через запятую. Следующий пример демонстрирует использование директивы \texttt{PRIVATE} системы SAPFOR:
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={
|
||||
Пример задания приватного массива \texttt{B} для цикла на строке 2 с помощью директивы системе SAPFOR.
|
||||
@@ -25,8 +25,6 @@
|
||||
|
||||
Аналогично устроена директива \texttt{!\$SPF ANALYSIS (REDUCTION(OP(...)))}, задающая редукцию по переменным из списка, стоящем вместо троеточия. \texttt{OP} в директиве задаёт редукционную операцию. Далее приведён пример использования этой директивы:
|
||||
|
||||
\pagebreak
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={
|
||||
Пример задания редукции по переменной \texttt{EPS} с редукционной операцией взятия максимума.
|
||||
}]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
\subsection{Второй этап -- реализация}
|
||||
\subsection{Процесс реализации алгоритма распараллеливания на общую память}
|
||||
|
||||
Новый режим работы распараллеливания на общую память был оформлен как отдельных проход. По аналогии этот проход был назван \\ INSERT\_PARALLEL\_DIRS\_NODIST, что подчёркивает отсутствие построения распределения данных. Поскольку INSERT\_PARALLEL\_DIRS осуществляет только вставку созданных заранее директив, его функционал менять не пришлось, поэтому внутри INSERT\_PARALLEL\_DIRS\_NODIST вызывается код прохода INSERT\_PARALLEL\_DIRS.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
\subsection{Первый этап -- подготовка}
|
||||
\subsection{Исследование кодовой базы системы SAPFOR}
|
||||
|
||||
Основной целью данного этапа стал анализ внутреннего устройства системы SAPFOR, так как было принято решение реализовывать распараллеливание как часть её функционала. На данном этапе было проведено исследование исходного кода системы, которое дало ответы на следующие вопросы:
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
|
||||
Они заполняют структуры, описывающие циклы, анализируют обращения к массивам внутри циклов, отображают обращения к массивам на циклы. Также они создают и заполняют структуру данных, позволяющую строить распределение данных -- \textit{граф измерений массивов}. Вместе с этим происходит вызов прохода CREATE\_TEMPLATE\_LINKS, который по построенному графу создаёт схему распределения данных. До них работает ещё множество других проходов (всего порядка семидесяти), которые не относятся к распараллеливанию напрямую. Эти проходы не касаются распределения данных, поэтому они детально не рассматривались. Часть дерева зависимостей прохода вставки параллельных директив изображена на Рис. \ref{fig:distr-alg}:
|
||||
|
||||
\pagebreak
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
\section{Построение решения}
|
||||
|
||||
Весь процесс построения решения можно разделить на три основных этапа -- исследование кодовой базы системы SAPFOR, внесение необходимых изменений и тестирование реализованного функционала.
|
||||
В общих чертах алгоритм решения поставленной задачи можно описать следующим образом:
|
||||
|
||||
\begin{itemize}
|
||||
\item разрабатываемый алгоритм должен принимать на вход исходный код программы и опираться на статический анализ её свойств, выполняемый системой SAPFOR. Система определяет зависимости по данным между витками циклов, определяет регулярные зависимости по данным, приватные и редукционные переменные циклов;
|
||||
|
||||
\item c учетом свойств, найденных системой SAPFOR, алгоритм определяет циклы, витки которых могут выполняться параллельно. Для таких циклов генерируется DVMH-директива \texttt{PARALLEL};
|
||||
|
||||
\item среди циклов программы, отмеченных директивой \texttt{PARALLEL}, алгоритм определяет те, которые могут выполняться на ускорителях. Генерируются директивы \texttt{REGION} и \texttt{END\_REGION}, клаузы \texttt{TIE}. Определяются входные и выходные переменные, которые должны быть скопированы на ускорители. В программу добавляются директивы \texttt{ACTUAL} и \texttt{GET\_ACTUAL}, которые обеспечивают необходимые копирования данных в процессе выполнения программы на центральном процессоре или ускорителе;
|
||||
\end{itemize}
|
||||
|
||||
|
||||
Реализация этого алгоритма происходила в три этапа -- исследование кодовой базы системы SAPFOR, внесение необходимых изменений и тестирование реализованного функционала.
|
||||
|
||||
\input{src/sections/solution/prep}
|
||||
\input{src/sections/solution/impl}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
\subsection{Третий этап -- тестирование и решение возникших проблем}
|
||||
\subsection{Тестирование на корректность и решение возникших проблем}
|
||||
|
||||
Поскольку работа ведётся с исходным кодом Фортран-программ, множество возможных вариантов входных программ слишком велико, чтобы предусмотреть абсолютно все ситуации на этапе реализации. Из-за этого было необходимо произвести тщательное тестирование, чтобы выявить основные случаи некорректного поведения системы SAPFOR.
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
|
||||
Ещё одна проблема связана с обработкой передаваемых в процедуры секций массивов. Дело в том, что в DVM-системе запрещено использование в разных циклах пересекающихся по памяти различных секций массивов. Рассмотрим следующий пример:
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={пример, вызывающий ошибку выполнения.}]
|
||||
\pagebreak
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={Пример, вызывающий ошибку выполнения.}]
|
||||
program p
|
||||
...
|
||||
integer:: A(100)
|
||||
@@ -44,7 +46,7 @@ end
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{src/assets/pass_deps_nodist_1.png}
|
||||
\caption{итоговая схема работы проходов при распределении на общую память.}
|
||||
\caption{Итоговая схема работы проходов при распределении на общую память.}
|
||||
|
||||
\label{fig:deps-final}
|
||||
\end{figure}
|
||||
@@ -50,4 +50,4 @@
|
||||
3 continue
|
||||
\end{lstlisting}
|
||||
|
||||
В дополнение к описанному, существует ещё несколько сценариев использования системы SAPFOR, при котором может пригодиться новый функционал. Во-первых, с помощью режима распараллеливания на общую память можно будет распараллеливать программы, написаные с использованием технологии MPI \cite{mpi}, что может дать дополнительное ускорение. Во-вторых, данный режим может быть полезен и при обычном распараллеливании с распределением данных: с его помощью можно предварительно оценивать программы на предмет потенциала к распараллеливанию, например заранее узнавать, какие циклы могут быть распараллелены, а какие нет. Используя полученную информацию, можно оценивать вероятность того, что распараллеливание даст положительный эффект ещё до создания схемы распределения данных.
|
||||
В дополнение к описанному, существует ещё несколько сценариев использования системы SAPFOR, при котором может пригодиться новый функционал. Во-первых, с помощью режима распараллеливания на общую память можно будет распараллеливать программы, написанные с использованием технологии MPI \cite{mpi}, что может дать дополнительное ускорение. Во-вторых, данный режим может быть полезен и при обычном распараллеливании с распределением данных: с его помощью можно предварительно оценивать программы на предмет потенциала к распараллеливанию, например заранее узнавать, какие циклы могут быть распараллелены, а какие нет. Используя полученную информацию, можно оценивать вероятность того, что распараллеливание даст положительный эффект ещё до создания схемы распределения данных.
|
||||
@@ -12,10 +12,25 @@
|
||||
\item \texttt{PARALLEL ... ON} -- определяет цикл, витки которого следует выполнять параллельно, при этом задавая отображение пространства витков цикла на распределённый массив.
|
||||
\end{itemize}
|
||||
|
||||
При этом директива \texttt{PARALLEL ... ON} может включать в себя также произвольное количество следующих клауз:
|
||||
|
||||
\begin{itemize}
|
||||
\item \texttt{PRIVATE(...)} -- задаёт список приватных переменных;
|
||||
|
||||
\item \texttt{REDUCTION(OP(...))} -- задаёт список редукционных переменных с редукционной операцией \texttt{OP};
|
||||
|
||||
\item \texttt{ACROSS(array(}$l_1:r_1$\texttt{, ... ,} $l_n:r_n$\texttt{))} -- задаёт зависимость по данным для $n$-мерного массива \texttt{array}, где $l_k$ и $r_k$ это размеры зависимости для $k$-го измерения \cite[стр.~16]{dvm-doc};
|
||||
|
||||
\item \texttt{SHADOW\_RENEW(...)}, \texttt{SHADOW\_COMPUTE(...)} и \texttt{REMOTE\_ACCESS(...)} -- клаузы доступа к удалённым данным (см. \cite{dvm-doc}).
|
||||
\end{itemize}
|
||||
|
||||
Рассмотрим пример распараллеленного в модели DVM гнезда циклов (см. Листинг \ref{lst:dvmh-hello-world}). Здесь происходит отображение элементов массива B на элементы массива A, распределение массива A и распараллеливание гнезда циклов. При запуске на кластере каждый узел получит непрерывные и примерно равные секции массива A, точно такие же секции массива B и соответствующие этим секциям итерации цикла.
|
||||
|
||||
\pagebreak
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={
|
||||
Пример распараллеленного в модели DVM гнезда циклов. Здесь происходит отображение элементов массива B на элементы массива A, распределение массива A и распараллеливание гнезда циклов. При запуске на кластере каждый узел получит непрерывные и примерно равные секции массива A, точно такие же секции массива B и соответствующие этим секциям итерации цикла.
|
||||
}]
|
||||
Пример распараллеленного в модели DVM гнезда циклов.
|
||||
},label={lst:dvmh-hello-world}]
|
||||
!DVM$ DISTRIBUTE (BLOCK,BLOCK) :: A
|
||||
!DVM$ ALIGN B(I,J) WITH A(I,J)
|
||||
|
||||
@@ -34,6 +49,10 @@
|
||||
|
||||
Новый вариант директивы \texttt{PARALLEL} отличается от исходного тем, что в ней отсутствует клауза \texttt{ON}. При использовании таких директив не надо указывать распределённые массивы при отображении витков параллельных циклов. Сами директивы распределения данных также не нужны в таких программах. Более того, в таких директивах \texttt{PARALLEL} не должны присутствовать клаузы доступа к удалённым данным, такие как \texttt{SHADOW\_RENEW}, \texttt{SHADOW\_COMPUTE} и \texttt{REMOTE\_ACCESS}.
|
||||
|
||||
В таком варианте директивы \texttt{PARALLEL} может присутствовать клауза \texttt{TIE}, сопоставляющая итерации цикла с массивом. Она используется в DVM-системе для улучшения производительности выходного исполняемого кода.
|
||||
|
||||
\pagebreak
|
||||
|
||||
\begin{lstlisting}[style=FORT,caption={
|
||||
Пример распарараллеливания гнезда циклов на общую память.
|
||||
}]
|
||||
@@ -47,5 +66,3 @@
|
||||
END DO
|
||||
!DVM$ END REGION
|
||||
\end{lstlisting}
|
||||
|
||||
В таком варианте директивы \texttt{PARALLEL} может присутствовать клауза \texttt{TIE}, сопоставляющая итерации цикла с массивом. Она используется в DVM-системе для улучшения производительности выходного исполняемого кода.
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Выходом из такой ситуации является рассмотрение частного случая -- распараллеливания на общую память. При таком распараллеливании предполагается, что целевая вычислительная система состоит из единственного устройства. Это ограничение позволяет убрать необходимость в распределении данных, так как все данные располагаются в общей оперативной памяти устройства.
|
||||
|
||||
В качестве устройства для запуска программы, распараллеленной на общую память, можно рассматривать многопоточный процeссор или графический ускоритель.
|
||||
В качестве устройства для запуска программы, распараллеленной на общую память, можно рассматривать многопоточный процессор или графический ускоритель.
|
||||
|
||||
\input{src/sections/task/dvm_shared}
|
||||
\input{src/sections/task/sapfor_shared}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
\subsection{NAS Parallel Benchmarks}
|
||||
\subsection{Пакет NAS Parallel Benchmarks}
|
||||
|
||||
NAS Parallel Benchmarks -- это пакет из десяти программ, разработанных для тестирования производительности многопоточных вычислительных систем, восемь из них написаны на Фортране, остальные -- на языке Си. Тесты на Фортране включают следующие программы:
|
||||
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
\begin{figure}[hbt!]
|
||||
\centering
|
||||
\includegraphics[scale=0.35]{src/assets/titan_12_all_classes.png}
|
||||
\caption{замер времени работы полученных версий на DVMH и эталонных версий на OpenMP на процессоре Intel Core i7 980x (12 потоков).}
|
||||
\caption{Замер времени работы полученных версий на DVMH и эталонных версий на OpenMP на процессоре Intel Core i7 980x (12 потоков).}
|
||||
\label{fig:titan_12_all_classes}
|
||||
\end{figure}
|
||||
\pagebreak
|
||||
\begin{figure}[hbt!]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{src/assets/titan_c_all.png}
|
||||
\caption{сравнение времени работы тестов на различном количестве потоков на процессоре Intel Core i7 980x (класс C).}
|
||||
\caption{Сравнение времени работы тестов на различном количестве потоков на процессоре Intel Core i7 980x (класс C).}
|
||||
\label{fig:titan_c_all}
|
||||
\end{figure}
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
\begin{figure}[hbt!]
|
||||
\centering
|
||||
\includegraphics[scale=0.35]{src/assets/gpu.png}
|
||||
\caption{демонстрация ускорения работы полученных версий на ускорителях Nvidia относительно запуска последовательной программы на процессоре Intel Core i7 980x.}
|
||||
\caption{Демонстрация ускорения работы полученных версий на ускорителях Nvidia относительно запуска последовательной программы на процессоре Intel Core i7 980x.}
|
||||
\label{fig:gpu}
|
||||
\end{figure}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user