\subsection{SAPFOR}

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

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

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

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

\begin{lstlisting}[style=FORT,caption={
пример задания приватного массива \texttt{B} для цикла на строке 3 с помощью директивы системе 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} в директиве задаёт редукционную операцию. Далее приведён приведён пример использования этой директивы:
\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}