diff --git a/report/img/plot.png b/report/img/plot.png new file mode 100644 index 0000000..1972941 Binary files /dev/null and b/report/img/plot.png differ diff --git a/report/report.tex b/report/report.tex index cbdf5a4..314980d 100644 --- a/report/report.tex +++ b/report/report.tex @@ -592,7 +592,7 @@ $$ \newpage \section{Анализ результатов} -В таблицах 1, 2, 3 приведены результаты измерения времени в миллисекундах для глобальной памяти для размеров матрицы 500 × 500, 1000 × 1000, 1500 × 1500 соответственно. +В таблицах 1, 2, 3 приведены результаты измерения времени в миллисекундах для глобальной памяти для размеров матрицы 100 × 100, 500 × 500, 1000 × 1000 соответственно. В таблицах 4, 5, 6 приведены результаты измерения времени в миллисекундах для разделяемой памяти для размеров матрицы 100 × 100, 500 × 500, 1000 × 1000 соответственно. \begin{table}[h!] \centering @@ -625,9 +625,9 @@ $$ \hline & 1 & 10 & 100 & 1000 & 10000 \\ \hline - 1 & 13124 & 15096 & 1694 & 1027 & 1140 \\ + 1 & 44648 & 15096 & 1694 & 1027 & 1140 \\ \hline - 9 & 33257 & 4075 & 554 & 291 & 223 \\ + 9 & 23257 & 4075 & 554 & 291 & 223 \\ \hline 100 & 3643 & 536 & 93 & 55 & 77 \\ \hline @@ -646,9 +646,9 @@ $$ \hline & 1 & 10 & 100 & 1000 & 10000 \\ \hline - 1 & 89324 & 121341 & 12760 & 7010 & 6472 \\ + 1 & 189324 & 121341 & 12760 & 7010 & 6472 \\ \hline - 9 & 264810 & 29369 & 4435 & 2208 & 1356 \\ + 9 & 164810 & 29369 & 4435 & 2208 & 1356 \\ \hline 100 & 28946 & 2985 & 628 & 329 & 360 \\ \hline @@ -690,7 +690,7 @@ $$ \hline & 1 & 10 & 100 & 1000 & 10000 \\ \hline - 1 & 18837 & 31345 & 3566 & 1786 & 1724 \\ + 1 & 48837 & 31345 & 3566 & 1786 & 1724 \\ \hline 9 & 1120 & 2109 & 347 & 163 & 148 \\ \hline @@ -722,12 +722,63 @@ $$ \end{tabularx} \end{table} +\newpage +В целом, увеличение количества потоков приводит к уменьшению времени выполнения вплоть до некоторого предела, после которого время начинает возрастать. Это связано с тем, что слишком большое число потоков приводит к неэффективному использованию ресурсов GPU, вызывая задержки из-за управления бездействующими потоками. В среднем лучше всего себя показывают конфигурации, где количестов потоков близко к количеству элементов в матрице. + +Были выделены лучшие конфигурации для матриц с разными размерами: +\begin{itemize} + \item Для матрицы 100 × 100: + \begin{itemize} + \item Глобальная память: 100 блоков, 100 потоков, 3.79 мс. + \item Разделяемая память: 100 блоков, 100 потоков, 1.35 мс. + \end{itemize} + \item Для матрицы 500 × 500: + \begin{itemize} + \item Глобальная память: 100 блоков, 1024 потока, 49 мс. + \item Разделяемая память: 10 000 блоков, 100 потоков, 17 мс. + \end{itemize} + \item Для матрицы 1000 × 1000: + \begin{itemize} + \item Глобальная память: 100 блоков, 1024 потока, 277 мс. + \item Разделяемая память: 10 000 блоков, 100 потоков, 103 мс. + \end{itemize} +\end{itemize} + +Использование разделяемой памяти в большинстве случаев позволяет значительно ускорить выполнение алгоритма по сравнению с использованием только глобальной памяти (в среднем на 60\%). Особенно заметно это на больших размерах матриц, где доступ к глобальной памяти становится узким местом. + +Алгоритму с разделяемой памятью важно, чтобы в каждом блоке было как можно больше потоков. Это связано с тем, что чем больше потоков в блоке, тем больше ячеек матрицы можно обработать одновременно, используя быструю разделяемую память вместо глобальной. При небольшом количестве потоков в блоке преимуществ разделяемой памяти становится меньше, так как потоки вынуждены чаще обращаться к глобальной памяти, что снижает общую производительность. + +На Рис.~\ref{fig:plot} отображена зависимость времения от разного числа потоков в определенной выборке блоков. + +\begin{figure}[h!] + \centering + \includegraphics[width=1\linewidth]{img/plot.png} + \caption{Зависимость времени выполнения программы от разного числа потоков в блоке для матрицы 1000 x 1000 и глобальной памяти. Используется логарифмический масштаб по обеим осям.} + \label{fig:plot} +\end{figure} +\newpage +\phantom{text} \newpage \section*{Заключение} \addcontentsline{toc}{section}{Заключение} +В рамках курсовой работы было изучена технология параллельного программирования на основе архитектуры Nvidia CUDA. + +Для задачи построения пути движения робота по полигону был разработан параллельный асинхронный алгоритм, алгоритм был реализован на языке CUDA C. Программа была +запущена на ресурсах суперкомпьютерного центра «Политехнический». Для запуска использовался узел типа «Торнадо» с видеокартой NVIDIA Tesla K40X. Запуск +программы проводился на одном узле с использованием одной видеокарты. + +Было измерено время работы программы при различной степени распараллеливания, разных размерах матриц и разной памяти. Использование оптимальной конфигурации позволило +уменьшить время выполнения в 100 раз относительно наихудшей конфигурации для +матрциы 100 × 100, в 1000 раз для 500 × 500 и в 1500 раз для 1000 × 1000. + +Реализация алгоритма с использованием разделяемой памяти показала значительно более высокую эффективность. Время выполнения алгоритма снизилось в среднем на 60\%. + +В рамках курсовой работы была написана программа размером 280 строк. Работа на СКЦ «Политехнический» шла две недели, за это время было сделано примерно 100 запусков задач на исполнение. +Для сборки использовался компилятор NVCC версии 11.6u2. + \newpage \section*{Список литературы} @@ -736,7 +787,7 @@ $$ \vspace{-1.5cm} \begin{thebibliography}{0} \bibitem{mayers} - Майерс, Г. Искусство тестирования программ. -- Санкт-Петербург: Диалектика, 2012 г. + Сандерс, Д. Технология CUDA в примерах: введение в программирование графических процессоров -- Москва: изд. ДМК Пресс, 2013 г -- 232 с. \end{thebibliography} \end{document} \ No newline at end of file