\section{Описание алгоритмов распараллеливания в системе SAPFOR}

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

Весь исходный код системы SAPFOR написан на языке C++ \cite{cpp}. Программа, поступающая на вход системе, переводится в абстрактное синтаксическое дерево операторов (АСД) \cite{dragonbook}. В качестве реализации абстрактного синтаксического дерева используется библиотека Sage++ \cite{sage}. С её помощью входную программу можно анализировать, модифицировать и переводить обратно в код на Фортране.

Помимо структур библиотеки Sage++, в системе SAPFOR введён ряд типов данных, упрощающих разработку. Среди них можно выделить следующие наиболее используемые:

\begin{itemize}
    \item \texttt{Array} -- тип, отражающий массив входной программы. Помимо прочего, содержит информацию о его имени, размерности, определении, местах использования;

    \item \texttt{FuncInfo} -- отражает процедуру входной программы. Содержит информацию о названии, определении, точках её вызова, подключенных common-блоков, именах её формальных аргументов, информацию о наличии побочных эффектов и т. д.;

    \item \texttt{LoopGraph} -- отражает цикл. Имеет информацию о месте расположения, вложенных циклах, вызовах функций внутри цикла, операциях над массивами внутри цикла. Если цикл находится в канонической форме, дополнительно содержит название итерационной переменной, границах и шаге итерирования, глубину гнезда тесновложенных циклов. Кроме этого структура содержит набор флагов, отмечающих интересующие с точки зрения распараллеливания свойства;

    \item \texttt{ParallelDirective} -- структура, отражающая созданную директиву распараллеливания. Содержит информацию о размере распараллеливаемого гнезда, о клаузах \texttt{SHADOW\_RENEW}, \texttt{ACROSS}, \texttt{REMOTE\_ACCESS}, \texttt{REDUCTION}, \texttt{PRIVATE} и используемых в них массивах.
\end{itemize}

\input{src/sections/impl/distr}
\input{src/sections/impl/nodistr}