\subsection{SAPFOR}

Система SAPFOR (System FOR Automated Parallelization) предназначена для автоматизации процесса распараллеливания программ с использованием технологии DVMH. Она, так же как и DVM-система, поддерживает языки Си и Фортран. Система SAPFOR разделена на два проекта, каждый их которых отвечает за свой язык. В данной работе рассматривается только часть, связанная с языком Фортран.

С помощью системы SAPFOR можно производить не только само распараллеливание, но и множество других преобразований, позволяющих приводить программы к \textit{потенциально параллельному виду} -- к форме, в которой она может быть автоматически переведена в параллельную без участия пользователя. Для удобства проведения таких манипуляций была создана графическая оболочка, которая предоставляет пользователям системы удобный интерфейс для её использования.

Также система SAPFOR предоставляет набор директив, с помощью которых пользователь может управлять поведением системы при обработке программы. Например, с помощью таких директив можно задавать различные свойства программы, давать указания на расстановку контрольных точек, ограничивать распараллеливание. Сейчас системой поддерживается около десяти различных директив.

Рассмотрим подробнее директивы приватизации и редукции, которые будут упомянаться далее в работе. Директива приватизации, как и все директивы системе SAPFOR, представлена в виде комментария, начинающегося с префикса \texttt{\$SPF}. Далее идёт тело директивы, которое имеет вид \texttt{ANALYSIS (PRIVATE(...))}, где вместо троеточия должен быть указан список приватных переменных (скаляров или массивов) через запятую. Следующий пример демонстрирует использование директивы \texttt{PRIVATE} системы SAPFOR:

\begin{lstlisting}[style=FORT,caption={
Пример задания приватного массива \texttt{B} для цикла на строке 2 с помощью директивы системе SAPFOR.
}]
!$SPF ANALYSIS(PRIVATE(B))
    DO I = 1, N
        DO J = 1, N
            B(J) = J
        END DO

        A(I) = B(A(I))
    END DO
\end{lstlisting}

Хотя скаляры и можно объявлять в директиве приватизации, на практике обычно это не используется, потому что в системе SAPFOR при распараллеливании автоматически производится анализ приватных скалярных переменных.

Аналогично устроена директива \texttt{!\$SPF ANALYSIS (REDUCTION(OP(...)))}, задающая редукцию по переменным из списка, стоящем вместо троеточия. \texttt{OP} в директиве задаёт редукционную операцию. Далее приведён пример использования этой директивы:

\pagebreak

\begin{lstlisting}[style=FORT,caption={
Пример задания редукции по переменной \texttt{EPS} с редукционной операцией взятия максимума.
}]
!$SPF ANALYSIS(REDUCTION (MAX(EPS)))
    DO I = 1, N
        DO J = 1, N
            EPS = MAX(EPS, ABS(B(I,J) - A(I,J)))
            A(I, J) = B(I, J)
        END DO
    END DO
\end{lstlisting}