\subsection{Третий этап -- тестирование и решение возникших проблем}

Поскольку работа ведётся с исходным кодом Фортран-программ, множество возможных вариантов входных программ слишком велико, чтобы предусмотреть абсолютно все ситуации на этапе реализации. Из-за этого было необходимо произвести тщательное тестирование, чтобы выявить основные случаи некорректного поведения системы SAPFOR.

Тестирование проводилось как на небольших модельных примерах, так и на больших примерах практически используемых программ. Суммарно за всё тестирование было обнаружено порядка тридцати различных примеров некорректного поведения реализованного режима. Далее описаны наиболее содержательные из найденных ошибок и то, как они были исправлены.

Первая из них касалась обработки приватных массивов. При распределении данных в DVM-системе запрещается распределять массивы, которые являются приватными хотя бы для одного цикла. Поэтому в системе SAPFOR такие массивы не отображаются на циклы при построении схемы распределения данных. При распараллеливании на общую память DVM-система допускает использование одного массива в качестве приватного и неприватного для разных циклов. Поэтому для режима распараллеливания на общую память было добавлено отображение на цикл всех неприватных для него массивов (в частности, это нужно для заполнения клаузы \texttt{TIE}). Это привело к изменениям в проходе LOOP\_ANALYZER\_NODIST.

Ещё одна проблема связана с обработкой передаваемых в процедуры секций массивов. Дело в том, что в DVM-системе запрещено использование в разных циклах пересекающихся по памяти различных секций массивов. Рассмотрим следующий пример:

\begin{lstlisting}[style=FORT,caption={пример, вызывающий ошибку выполнения.}]
program p
    ...
    integer:: A(100)
    call foo(A)

!DVM$ REGION
!DVM$ PARALLEL (i), TIE(A(i))
    do i = 1, 100
        A(i) = ...
    endo
!DVM$ END REGION
end

subroutine foo(A)
    integer:: A(50)

!DVM$ REGION
!DVM$ PARALLEL (i), TIE(A(i))
    do i = 1, 50
        A(i) = ...
    endo
!DVM$ END REGION
end
\end{lstlisting}

В нём нём есть два параллельных цикла (строки 8 и 19). Один из них использует полный массив A (который объявлен на строке 3). Другой же использует секцию массива A, которая содержит его первые 50 элементов (объявление на строке 15). Запуск этого примера приводит к ошибке выполнения. При этом если бы в подпрограмме \texttt{foo} было объявлено, что массив имеет размер 100 (то есть фактически передавался бы массив целиком), то ошибки бы не было.

В случае аналогичного распараллеливания с распределением данных ошибок выполнения не возникает. Из-за этого в цепь проходов распараллеливания на общую память был добавлен новый проход, который получил название SELECT\_ARRAY\_DIM\_CONF. Он запускается после анализа циклов и выполняет фильтрацию параллельных циклов так, чтобы в них не было пересечений по памяти используемых массивов.

Таким образом схема проходов нового режима получила окончательный вид, представленный на Рис. \ref{fig:deps-final}:

% \pagebreak
\begin{figure}[h]
\centering
\includegraphics[scale=0.5]{src/assets/pass_deps_nodist_1.png}
\caption{итоговая схема работы проходов при распределении на общую память.}

\label{fig:deps-final}
\end{figure}