\subsection{Первый этап -- подготовка} Основной целью данного этапа стал анализ внутреннего устройства системы 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} Они заполняют структуры, описывающие циклы, анализируют обращения к массивам внутри циклов, отображают обращения к массивам на циклы. Вместе с этим происходит вызов прохода CREATE\_TEMPLATE\_LINKS, который создаёт структуру данных, позволяющую строить распределение данных. Эта структура данных называется \textit{графом измерений массивов}. Кроме этого в работе распараллеливания участвует ещё множество других проходов (всего порядка семидесяти), которые не относятся к распараллеливанию напрямую. Эти проходы не касаются распределения данных, поэтому они пристально не рассматривались. Часть дерева зависимостей прохода вставки параллельных директив изображена на Рис. \ref{fig:distr-alg}. \pagebreak \begin{figure}[h] \centering \includegraphics[scale=0.5]{src/assets/pass_deps_dist.png} \caption{упрощённая схема работы проходов при распараллеливании с распределением данных.} \label{fig:distr-alg} \end{figure} Таким образом, было установлено, что для успешной реализации распараллеливания на общую память необходимо и достаточно внести изменения в эти семь проходов, а от прохода CREATE\_TEMPLATE\_LINKS стоит полностью отказаться в новом режиме.