\section{Построение решения}

В общих чертах алгоритм решения поставленной задачи можно описать следующим образом:

\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}
\input{src/sections/solution/testing}

% \input{src/sections/solution/issues}