Files
bachelor_thesis/src/sections/solution/testing.tex

50 lines
5.2 KiB
TeX
Raw Normal View History

2024-05-06 19:59:07 +03:00
\subsection{Третий этап -- тестирование и решение возникших проблем}
Поскольку работа ведётся с исходным кодом фортран-программ, множество возможных вариантов входных программ слишком велико, чтобы предусмотреть абсолютно все ситуации на этапе реализации. Из-за этого было необходимо произвести тщательное тестирование, чтобы выявить основные случаи некорректного поведения системы SAPFOR.
2024-05-06 21:42:13 +03:00
Тестирование проводилось как на небольших модельных примерах, так и на больших примерах практически используемых программ. Суммарно за всё тестирование было обнаружено порядка тридцати различных примеров некорректного поведения добавленного режима. Далее описаны наиболее содержательные из найденных ошибок и то, как они были исправлены.
2024-05-06 19:59:07 +03:00
2024-05-06 21:42:13 +03:00
Первая из них касалась обработки приватных массивов. При распределении данных в DVM-системе запрещается распределять массивы, которые являются приватными хотябы для одного цикла. Поэтому в системе SAPFOR такие массивы не отображаются на циклы при построении схемы распределения данных. При распараллеливании на общую память DVM система допускает использование одного массива в качестве приватного и неприватного для разных циклов. Поэтому для режима распараллеливания на общую память было добавлено отображение на цикл всех неприватных для него массивов (в частности, это нужно для заполнения клаузы \texttt{TIE}). Это привело к правкам в проходе LOOP\_ANALYZER\_NODIST.
2024-05-06 19:59:07 +03:00
Ещё одна проблема связана с обработкой передаваемых в процедуры секций массивов. Дело в том, что в 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). Запуск этого примера приводит к ошибке выполнения системы DVM. При этом если бы в подпрограмме \texttt{foo} было объявлено, что массив имеет размер 100 (то есть фактически передавался бы массив целиком), то ошибки бы не было.
2024-05-06 21:42:13 +03:00
В случае аналогичного распараллеливания с распределением, ошибок выполнения DVM не возникает. Из-за этого в цепь проходов распараллеливания на общую память был добавлен новый проход, который получил название SELECT\_ARRAY\_DIM\_CONF. Он запускается после анализа циклов и фильтрует параллельные циклы так, чтобы в них не было пересечений по памяти используемых массивов.
2024-05-06 19:59:07 +03:00
Таким образом схема проходов нового режима получила окончательный вид, представленный на Рис. \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}