\subsection{Исследование кодовой базы системы SAPFOR}

Основной целью данного этапа стал анализ внутреннего устройства системы SAPFOR, так как было принято решение реализовывать распараллеливание как часть её функционала. На данном этапе было проведено исследование исходного кода системы, которое дало ответы на следующие вопросы:

\begin{itemize}
    \item как происходит запуск распараллеливания с распределением данных;

    \item какой код и в какой последовательности работает при распараллеливании с распределением данных;

    \item какие ограничивающие проверки планируется убрать в проходе распараллеливания на общую память;

    \item какие структуры данных используются;

    \item использование каких структур данных нужно избежать;

    \item какие существующие алгоритмы (с модификациями или без) можно (и нужно) переиспользовать в добавляемом режиме.
\end{itemize}

Путём чтения исходного кода, документации и общения с авторами системы все эти вопросы были разрешены. Далее излагаются основные полученные сведения.

Как уже упоминалось ранее, структурно система SAPFOR состоит из множества алгоритмов, которые логически разделены на отдельные блоки -- проходы. Каждый проход выполняет свою функцию и может зависеть от других проходов. При запуске прохода перед ним запускаются все проходы, от которых он зависит непосредственно или транзитивно, при чём каждый проход запускается не больше одного раза. Таким образом в системе выстраивается дерево зависимостей проходов.

Конечным проходом при распараллеливании с распределением данных является проход с названием INSERT\_PARALLEL\_DIRS, который производит вставку созданных директив в код. Главная его зависимость -- проход CREATE\_PARALLEL\_DIRS создания параллельных директив (без вставки) по полученной информации из анализа циклов. Анализ циклов производится следующей группой проходов: 

\begin{itemize}
    \item LOOP\_ANALYZER\_COMP\_DIST;

    \item LOOP\_ANALYZER\_DATA\_DIST\_S2;

    \item LOOP\_ANALYZER\_DATA\_DIST\_S1;

    \item LOOP\_ANALYZER\_DATA\_DIST\_S0;
\end{itemize}

Они заполняют структуры, описывающие циклы, анализируют обращения к массивам внутри циклов, отображают обращения к массивам на циклы. Также они создают и заполняют структуру данных, позволяющую строить распределение данных -- \textit{граф измерений массивов}. Вместе с этим происходит вызов прохода CREATE\_TEMPLATE\_LINKS, который по построенному графу создаёт схему распределения данных. До них работает ещё множество других проходов (всего порядка семидесяти), которые не относятся к распараллеливанию напрямую. Эти проходы не касаются распределения данных, поэтому они детально не рассматривались. Часть дерева зависимостей прохода вставки параллельных директив изображена на Рис. \ref{fig:distr-alg}:


\begin{figure}[h]
\centering
\includegraphics[scale=0.5]{src/assets/pass_deps_dist.png}
\caption{Упрощённая схема работы проходов при распараллеливании с распределением данных.}
\label{fig:distr-alg}
\end{figure}

Таким образом, было установлено, что для успешной реализации распараллеливания на общую память необходимо и достаточно внести изменения в эти семь проходов.