\subsection{Реализация в DVM-системе}

Как описывалось во введении, распараллеливание в модели DVM происходит при помощи специальных директив. При привычном распараллеливании с распределением данных, в основном, используются следующие директивы:

\begin{itemize}
    \item DISTRIBUTE -- предназначена для распределения элементов массивов по узлам
    
    \item ALIGN -- отображает элементы нескольких массивов на заданный распределённый массив и распределяет их на соответствующие узлы

    \item REGION -- определяет область кода, которую следует выполнять параллельно

    \item PARALLEL ... ON -- определяет цикл, витки которого следует выполнять параллельно, при этом задавая отображение пространства витков цикла на распределённый массив.
\end{itemize}


\begin{lstlisting}[style=FORT,caption={
пример распараллеленного в модели DVM гнезда циклов. Здесь происходит отображение элементов массива B на элементы массива A, распределение массива A и распараллеливание гнезда циклов. При запуске на кластере каждый узел получит непрерывные и примерно равные секции массива A, точно такие же секции B и соответствующие этим элементам итерации цикла.
}]
...
!DVM$ DISTRIBUTE (BLOCK,BLOCK) :: A
!DVM$ ALIGN B(I,J) WITH A(I,J)

!DVM$ REGION
!DVM$ PARALLEL (I,J) ON A(I,J), 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
!DVM$ END REGION
...
\end{lstlisting}

Чтобы дать пользователю возможность распараллеливать программы на общую память, в синтаксис языка DVM-системы была добавлена новая форма директивы PARALLEL для распараллеливания без распределения данных.

Новый вариант директивы PARALLEL отличается от исходного тем, что в ней отсутствует клауза ON. При использовании таких директив не надо указывать распределённые массивы. Сами директивы распределения данных также не нужны в таких программах. Более того, в таких директивах PARALLEL не должны присутствовать клаузы доступа к удалённым данных, такие как SHADOW\_RENEW, SHADOW\_COMPUTE и REMOTE\_ACCESS.

\begin{lstlisting}[style=FORT,caption={
пример распарараллеливания гнезда циклов на общую память. Здесь не должно быть ни директив распределения данных, ни клаузы ON отображения витков цикла на массив.
}]
...
!DVM$ REGION
!DVM$ PARALLEL (I,J), REDUCTION (MAX(EPS)), TIE(A(I, J), B(I, J))
    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
!DVM$ END REGION
...
\end{lstlisting}

Так же в таком варианте директивы PARALLEL может присутствовать клауза TIE, сопоставляющая итерации цикла с массивом, которая используется в DVM-системе для улучшения производительности выходного исполняемого кода.