diff --git a/report/.gitignore b/report/.gitignore new file mode 100644 index 0000000..38a3719 --- /dev/null +++ b/report/.gitignore @@ -0,0 +1,5 @@ +**/* +!.gitignore +!report.tex +!img +!img/** \ No newline at end of file diff --git a/report/img/memory.png b/report/img/memory.png new file mode 100644 index 0000000..4b6c9e8 Binary files /dev/null and b/report/img/memory.png differ diff --git a/report/img/streams.png b/report/img/streams.png new file mode 100644 index 0000000..6b11c46 Binary files /dev/null and b/report/img/streams.png differ diff --git a/report/report.tex b/report/report.tex new file mode 100644 index 0000000..273ab85 --- /dev/null +++ b/report/report.tex @@ -0,0 +1,512 @@ +\documentclass[a4paper, final]{article} +%\usepackage{literat} % Нормальные шрифты +\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта +\usepackage{tabularx} +\usepackage[T2A]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage[russian]{babel} +\usepackage{amsmath} +\usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry} +\usepackage{ragged2e} %для растягивания по ширине +\usepackage{setspace} %для межстрочно го интервала +\usepackage{moreverb} %для работы с листингами +\usepackage{indentfirst} % для абзацного отступа +\usepackage{moreverb} %для печати в листинге исходного кода программ +\usepackage{pdfpages} %для вставки других pdf файлов +\usepackage{tikz} +\usepackage{graphicx} +\usepackage{afterpage} +\usepackage{longtable} +\usepackage{float} + + + +% \usepackage[paper=A4,DIV=12]{typearea} +\usepackage{pdflscape} +% \usepackage{lscape} + +\usepackage{array} +\usepackage{multirow} + +\renewcommand\verbatimtabsize{4\relax} +\renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге +\renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице +\usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы +\usepackage{listings} %листинги +\usepackage{xcolor} % цвета +\usepackage{hyperref}% для гиперссылок +\usepackage{enumitem} %для перечислений + +\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}} + + +\setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях + +\hypersetup{colorlinks, + allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные) + +% подгружаемые языки — подробнее в документации listings (это всё для листингов) +\lstloadlanguages{ SQL} +% включаем кириллицу и добавляем кое−какие опции +\lstset{tabsize=2, + breaklines, + basicstyle=\footnotesize, + columns=fullflexible, + flexiblecolumns, + numbers=left, + numberstyle={\footnotesize}, + keywordstyle=\color{blue}, + inputencoding=cp1251, + extendedchars=true +} +\lstdefinelanguage{MyC}{ + language=SQL, +% ndkeywordstyle=\color{darkgray}\bfseries, +% identifierstyle=\color{black}, +% morecomment=[n]{/**}{*/}, +% commentstyle=\color{blue}\ttfamily, +% stringstyle=\color{red}\ttfamily, +% morestring=[b]", +% showstringspaces=false, +% morecomment=[l][\color{gray}]{//}, + keepspaces=true, + escapechar=\%, + texcl=true +} + +\textheight=24cm % высота текста +\textwidth=16cm % ширина текста +\oddsidemargin=0pt % отступ от левого края +\topmargin=-1.5cm % отступ от верхнего края +\parindent=24pt % абзацный отступ +\parskip=5pt % интервал между абзацами +\tolerance=2000 % терпимость к "жидким" строкам +\flushbottom % выравнивание высоты страниц + + +% Настройка листингов +\lstset{ + language=C++, + extendedchars=\true, + inputencoding=utf8, + keepspaces=true, + % captionpos=b, % подписи листингов снизу +} + +\begin{document} % начало документа + + + + % НАЧАЛО ТИТУЛЬНОГО ЛИСТА + \begin{center} + \hfill \break + \hfill \break + \normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\ + федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]} + \normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt] + \normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt] + \normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\ + + \hfill \break + \hfill \break + \hfill \break + \large{Отчёт по по дисциплине}\\ + \large{<<Курсовое проектирование по управлению ресурсами суперэвм>>}\\ + \large{Решение задачи нахождения пути движения робота по полигону}\\ + \hfill \break + + % \hfill \break + \hfill \break + \end{center} + + \small{ + \begin{tabular}{lrrl} + \!\!\!Студент, & \hspace{2cm} & & \\ + \!\!\!группы 5130201/20102 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\ + \!\!\!Преподаватель & \hspace{2cm} & \underline{\hspace{3cm}} & Курочкин М. А. \\\\ + &&\hspace{4cm} + \end{tabular} + \begin{flushright} + <<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2025г. + \end{flushright} + } + + \hfill \break + % \hfill \break + \begin{center} \small{Санкт-Петербург, 2025} \end{center} + \thispagestyle{empty} % выключаем отображение номера для этой страницы + + % КОНЕЦ ТИТУЛЬНОГО ЛИСТА + \newpage + + \tableofcontents + + + \newpage + + \section*{Введение} + + \addcontentsline{toc}{section}{Введение} + + Многие задачи, возникающие на практике, требуют большого объема вычислений. Одним из вариантов решения сложных вычислительных задач является использование параллельного программирования. За последние несколько десятилетий стало очень распространено вычисление с помощью графических ускорителей — устройств с массивно-параллельной архитектурой. Производить вычисления общего +назначения можно на видеокартах архитектуры Nvidia CUDA. Сегодня спроектированы и испытаны многие компьютеры, которые используют в своей архитектуре +тот или иной вид параллельной обработки данных. Сложность работы программирования заключается в координации используемых ресурсов. Одним из примеров +массивных вычислительных систем является суперкомпьютерный центр «Политехнический». Часть узлов этого суперкомпьютера оборудована графическими ускорителями Nvidia Tesla K40X. + + + \newpage + + \section {Постановка задачи} + В рамках данной работы необходимо изучить технологию параллельного программирования с использованием архитектуры Nvidia CUDA. + + Также необходимо ознакомиться с принципом использования ресурсов суперкомпьютерного центра «Политехнический» для решения прикладной задачи. + + Необходимо написать программу для решения поставленной практической задачи с использованием технологии Nvidia CUDA и провести исследование зависимости времени + выполнения программы от количества используемых ресурсов. + + В рамках курсовой работы необходимо написать программу для построения пути движения робота по полигону. + + \newpage + \section {Аппаратно-программная платформа Nvidia + CUDA} + CUDA (Compute Unified Device Architecture) — это архитектура параллельных +вычислений от Nvidia, позволяющая существенно увеличить вычислительную производительность благодаря использованию GPU (графических процессоров) фирмы Nvidia. + + \subsection{Архитектура Nvidia CUDA} + + Видеокарты Nvidia CUDA имеют иерархическую архитектуру: + \begin{itemize} + \item Процессор GPU представляет собой массив потоковых процессоров (Streaming + Processor Array); + \item Потоковый процессор состоит из кластеров текстурных процессоров (Texture + Processor Clusters); + \item Текстурные процессоры состоят из набора мультипроцессоров (Streaming + Multiprocessor); + \item Мультипроцессоры содержат несколько потоковых процессоров (Streaming + Processors) или ядер (CUDA cores). + \end{itemize} + + Планирование выполнения команд происходит при помощи GigaThread Engine. +Он распределяет блоки потоков по мультипроцессорам. Общий вид GPU кардинально не меняется при переходе от одной микроархитектуры к другой, изменяется размер и скорость L2 кэша. + +В архитектуре Nvidia CUDA применяется SIMT (Single Instruction Multiple +Thread) модель исполнения. Это модель является комбинацией из MIMD (Multiple +Instruction Multiple Data) и SIMD (Single Instruction Multiple Data). Вычисляемая +задача состоит из сетки блоков, а блок состоит из нитей (thread), при исполнении +нити разбиваются на варпы — группы по 32 нити. Все нити варпы выполняют в одно +время одну и ту же инструкцию. + + \subsection{Вычислительные возможности Nvidia CUDA} + + Видеокарты Nvidia CUDA разных микроархитектур обладают разным количеством ядер разного назначения. В этом разделе приведены краткие сведения о вычислительных возможностях различных поколений Nvidia CUDA. + + \subsubsection*{Микроархитектура Fermi} + В каждом потоковом процессоре: + \begin{itemize} + \item 32 ядра CUDA для выполнения операций с целыми числами и с числами с + плавающей точкой; + \item 16 ядер загрузки/выгрузки данных; + \item 4 блока специального назначения (для вычисления сложных арифметических + функций). + \end{itemize} + + Для распределения задач используется два планировщика варпов. Для хранения +используется: +\begin{itemize} + \item Регистровый файл, 128KB; + \item L1-cache, 16KB/48KB; + \item Разделяемая память, 48KB/16KB. +\end{itemize} + + +\subsubsection*{Микроархитектура Kepler} +В каждом потоковом процессоре: +\begin{itemize} + \item 192 ядра CUDA для выполнения операций с целыми числами и с числами с + плавающей точкой; + \item 64 блока для обработки чисел с двойной точностью; + \item 32 ядер загрузки/выгрузки данных; + \item 32 блока специального назначения (для вычисления сложных арифметических + функций). +\end{itemize} + +Для распределения задач используется два планировщика варпов. Для хранения +используется: +\begin{itemize} +\item Регистровый файл, 256KB; +\item L1-cache, 16KB/48KB/32KB; +\item Разделяемая память, 48KB/16KB/32KB; +\item Константная память (Read-Only Data Cache), 48KB. +\end{itemize} + +\subsubsection*{Микроархитектура Maxwell} +Каждый потоковый процессор в этой архитектуре состоит из четырех блоков. В +каждом блоке: +\begin{itemize} + \item Свой планировщик варпов; + \item Свой регистровый файл, 64KB; + \item 32 ядра CUDA; + \item 8 ядер загрузки/выгрузки данных; + \item 8 блока специального назначения (для вычисления сложных арифметических + функций). +\end{itemize} +Общими для четырех блоков являются L1/Texture кэш и разделенная память. В +отличие от предыдущих микроархитектур shared memory теперь является отдельным +блоком размером 96KB. + +\subsubsection*{Микроархитектура Pascal} +В плане архитектуры Pascal отличается от Maxwell тем, что каждый потоковый +процессов содержит 2 блока. + +\subsubsection*{Микроархитектура Tesla} +В Volta SM отказались от CUDA ядер и расщепили их на отдельные блоки (INT ++ FP32), что позволило использовать их одновременно и, соответственно, увеличило +общую производительность. Также в состав включили абсолютно новый компонент +под названием Tensor Core, нацеленный на увеличение производительности для глубокого обучения. По аналогии с Maxwell в SM есть 4 одинаковых блока, каждый из +которых содержит планировщик варпов, один модуль отправки команд, 8 ядер двойной точности, 32 целочисленных ядра, 32 ядра одинарной точности, 2 Tensor Core, 8 +LD/ST и 1 SFU. Регистровый файл для каждого блока равен 64KB. Для Volta L1 кэш +и разделяемая память общие для всех блоков и снова объединены общим объемом в +128KB, где под разделяемую память можно отвести до 96 KB. + +\subsubsection*{Вычислительные возможности Nvidia Tesla K40} +Программа в рамках данной работы исполнялась на видеокарте Nvidia Tesla +K40. Ниже приведены вычислительные возможности этой видеокарты: + +\begin{itemize} + \item Размерность сетки блоков. Максимальное число измерений: 3; максимальное + число блоков по каждому измерению: $2^{31-1}$, 65535, 65535; + \item Размерность блока. Максимальное число измерений: 3; максимальное число + нитей по каждому измерению: 1024, 1024, 64; максимальное число нитей в + блоке: 1024; + \item Размер варпа: 64; + \item Размер регистрового файла. На блок: 64000 регистров; на нить: 255 регистров; + \item Размер разделяемой памяти на мультипроцессор: 48К; + \item Размер константной памяти на блок: 64KB. +\end{itemize} + + + \subsubsection{Потоковая модель} + Вычислительная архитектура CUDA основана на понятии мультипроцессора и + концепции SIMT (Single Instruction Multiple Threads). При выполнении многопоточной программы на видеокарте CUDA, все потоки разделяются на блоки, а внутри + блоков на варпы, где все потоки выполняют одну и ту же инструкцию. Группа блоков + выполняется на потоковом процессоре, распределением задач занимается планировщик. Программа, выполняющаяся на нескольких блоках одновременно называется + ядром (kernel). + + Особенностью архитектуры CUDA является блочно-сеточная организация, +необычная для многопоточных приложений (Рис.~\ref{fig:streams}). При этом драйвер CUDA самостоятельно распределяет ресурсы устройства между потоками. + +\begin{figure}[h!] + \centering + \includegraphics[width=0.5\linewidth]{img/streams.png} + \caption{Организация потоков.} + \label{fig:streams} +\end{figure} + + + \subsection{Устройство памяти} + Видеокарта имеет собственную оперативную глобальную память, отдельную от +оперативной памяти CPU (на хосте). При выполнении кода на видеокарте (на устройстве) обращение может происходить только к памяти на видеокарте. Для перемещения данных с хоста на устройство и обратно используются служебные функции, +вызываемые с хоста. Помимо глобальной оперативной памяти на каждом мультипроцессоре есть свой кэш, своя текстурная, константная, разделяемая память и тд. + + \subsection{Модели памяти} + В CUDA выделяют шесть видов памяти: + + \begin{itemize} + \item регистры; + \item локальная память; + \item глобальная память; + \item разделяемая память; + \item константная память; + \item текстурная память. + \end{itemize} + + На Рис.~\ref{fig:memory} представлено устройство памяти. + + \begin{figure}[h!] + \centering + \includegraphics[width=0.7\linewidth]{img/memory.png} + \caption{Устройство памяти.} + \label{fig:memory} + \end{figure} + + \subsubsection*{Регистры} + На один мультипроцессор доступно 8192 32-разрядных регистров. Они распределяются между нитями в этом потоке. Обращение к этой памяти самое быстрое. + + \subsubsection*{Глобальная память} + Глобальная память имеет большой объем. Она поддерживает произвольный доступ для всех мультипроцессоров, а также запись и чтение с хоста. Однако, эта +память очень медленная и не кэшируется, поэтому рекомендуется сократить количество обращений к этой памяти. + + \subsubsection*{Локальная память} + Это небольшой объём памяти, к которому имеет доступ только один потоковый +процессор. Она относительно медленная — такая же, как и глобальная. + + \subsubsection*{Разделяемая память} + Разделяемая память — это некэшируемая, но быстрая память. Ее и рекомендуется использовать как управляемый кэш. На один мультипроцессор доступно всего +16KB разделяемой памяти. Она обеспечивает взаимодействие потоков, управляется +разработчиком напрямую и имеет низкие задержки. Разделив это число на количество задач в блоке, получим максимальное количество разделяемой памяти, доступной на один поток. + +\subsubsection*{Константная память} +Константная память — это тип памяти, который хранит неизменяемые данные, доступные на уровне сетки. Ее размер 64KB, физически она не отделена от глобальной памяти, но, используя системы кэшей и механизму широкого вещания +(broadcast), она может обеспечить прирост производительности за счет сокращения +трафика между процессором и памятью. + +\subsubsection*{Текстурная память} +Текстурная память — это тип памяти, который похож на константную память, +поскольку через текстурный блок разрешены запросы только для чтения. Физически +текстурная память не отделена от глобальной. Как и константная память, позволяет +увеличить производительность за счет системы кэшей. Отличительной особенностью +является оптимизация текстурного кэша для двумерной пространственной локальности (данные расположены рядом в двумерном пространстве). + + + \subsection{Модель вычислений на GPU} + Программа, запускаемая на GPU с Nvidia CUDA, называется ядром (kernel). + Ядро запускается одновременно на сетке из блоков. Каждый из блоков, как было + сказано раньше, состоит из нескольких потоков. Количество блоков и потоков задается при вызове ядра. В каждом потоке выполняется один и тот же код. Добиться + разного поведения в потоках возможно при помощи информации о номере блока и + потока, которая доступна для каждого потока. + + Все команды, пришедшие на GPU, будут исполняться в порядке общей для всех +потоков очереди. Последовательность исполнения может сгладить планировщик, который может запустить одновременно копирование с хоста, на хост и исполнение +ядра. А если ядро использует меньше 50\% мощности GPU, то запустить параллельно следующее ядро из +другого потока, если оно готово к запуску. Так, для оптимизации времени выполнения задач в разных потоках нужно учитывать, что на GPU команды будут +исполнятся в том порядке, в котором их вызвали в хост коде. Это значит, что не +всегда лучше заполнить задачами один поток, затем второй и т.д. Скорее более оптимальным подходом будет равномерный запуск задач по всем потокам. Для этого +можно сначала заполнить один поток командами, а затем другой. Тогда команды +второго потока будут ожидать окончания выполнения команд первого потока, или, +что более вероятно, начала копирования в память хоста из первого потока. Другой +вариант, когда команды будут распределяться по потокам поочередно, т.е. в первый +поток отправляется первая команда, затем во второй отправляется также первая, затем в первый вторая, и т.д. В результате такого равномерного распределения можно +добиться улучшения производительности за счет умения планировщика одновременно запускать операции копирования и ядра. + + \subsection{Планировщик задач} + Поток (stream) в CUDA — логическая последовательность зависимых асинхронных операций, независимая от операций в других потоках. Потоки позволяют запускать CUDA команды на GPU в порядке, определенном в контексте одного потока. +С точки зрения GPU потоков не существует, и все команды, пришедшие на GPU, +будут исполняться в порядке общей для всех потоков очереди, знание этой особенности может помочь при оптимизации. Последовательность исполнения может сгладить планировщик, который может запустить одновременно копирование с хоста, на +хост и исполнение ядра. При вызове ядра можно указать поток, в который будет добавлено это ядро. По умолчанию все ядра добавляются в поток 0, который является +синхронным с хостом. + + +\subsection{Компиляция программы} + +Программа для видеокарт Nvidia CUDA пишется на основе других языков, в +частности используется расширение языка C. Оно называется CUDA C. Для сборки +программы используется компилятор nvcc, который входит в пакет инструментов +разработчика. Этот пакет, а также библиотеку CUDA можно скачать с сайта Nvidia. + + +\newpage + \section{Суперкомпьютерный центр «Политехнический»} + + \subsection{Состав} + + Суперкомпьютерный центр «Политехнический» состоит из узлов трех типов: + + \begin{itemize} + \item 668 узлов кластера «Политехник - РСК Торнадо»; + \item 288 узлов вычислителя с ультравысокой многопоточностью «Политехник - + РСК ПетаСтрим»; + \item 64 узла кластера «Политехник - NUMA». + \end{itemize} + + \subsection{Характеристики} + + \subsubsection*{Политехник - РСК Торнадо} + Кластер содержит узлы двух типов: + + \begin{itemize} + \item 612 узлов с прямым жидкостным охлаждением серии «Торнадо»(производитель + РСК Технологии РФ), имеющие каждый два CPU Intel Xeon E5-2697 v3 (14 + ядер, 2.6 ГГц) и 64 ГБ оперативной памяти DDR4; + \item 56 узлов с прямым жидкостным охлаждением серии Tornado содержащие каждый два CPU Intel Xeon E5-2697 v3 и два ускорителя вычислений NVIDIA Tesla + K40X, 64 ГБ оперативной памяти DDR4. + \end{itemize} + + \subsubsection*{Политехник - РСК ПетаСтрим + } + Кластер содержит узлы двух типов: + + \begin{itemize} + \item 288 однопроцессорных узлов с пиковой производительностью 1 ТФлопс каждый; + \item 17280 многопоточных ядер общего назначения (69120) потоков, поддерживающих векторную обработку данных посредством аппаратно реализованных + инструкций FMA (Fused Multiply-Accumulate); + \item оперативная память узла - 8 ГБ, GDDR5; суммарный объём оперативной памяти системы 2304 ГБ; + \item пропускная способность между двумя узлами модуля системы на тесте MPI + OSU или Intel MPI Benchmarks не менее 6 ГБ/с. + \end{itemize} + + \subsubsection*{Политехник - NUMA} + Кластер содержит узлы двух типов: + + \begin{itemize} + \item 64 вычислительных узла, каждый из которых включает: + \begin{itemize} + \item 3 CPU AMD Opteron 638; + \item Адаптер NumaConnect N313-48; + \item 192 ГБ оперативной памяти; + \end{itemize} + \item 192 процессора; + \item 3072 ядер х86. + \end{itemize} + + \subsection{Технология подключения} + + Для подключения зарегистрированного пользователя к СКЦ необходимо использовать SSH клиент. С помощью него получается доступ к удаленному терминалу +для работы с ресурсами СКЦ. + +В рамках работы была использована следующая технология подключения: + \begin{enumerate} + \item Были получен приватный ключ от администрации СКЦ в виде файла. + + \item При помощи команды ssh был произведен вход: ssh -v tm3u21@login1.hpc.spbstu.ru + -i /.ssh/id\_rsa, где tm3u21 - логин, login1.hpc.spbstu.ru - адрес, id\_rsa - приватный ключ. + + \item Чтобы переслать файлы, использовалась команда \\ + scp -r D:\textbackslash kernel.cu tm3u21@login1.hpc.spbstu.ru\:home/kernel.cu. \\ Где \texttt{"D:\textbackslash kernel.cu"} -- путь + до файла на локальном компьютере, tm3u21 - логин, login1.hpc.spbstu.ru - адрес, + home/kernel.cu - пусть сохранения файла на СКЦ. + \end{enumerate} + + +\newpage +\section{Постановка решаемой практической задачи} + +Построение пути движения робота по полигону. + +Дано: +\begin{itemize} + \item массив Р - полигон (nxn), -- целых чисел; + \item P1(x1,y1), P2(x2,y2) точки на полигоне; + \item V - Контуры, запрещенные для движения, граница контура имеет значение -1. +\end{itemize} + +Надо: +\begin{itemize} + \item построить L - траекторию, соединяющую P1 и P2. +\end{itemize} + +Ограничения: +\begin{itemize} + \item L не включает точки полигона со значениями P(I,j)=-1 + \item M -- Число контуров -- случайная величина; + \item контуры V могут пересекаться; +\end{itemize} + + + + +\newpage + \section*{Заключение} + \addcontentsline{toc}{section}{Заключение} + + +\newpage +\section*{Список литературы} +\addcontentsline{toc}{section}{Список литературы} + +\vspace{-1.5cm} +\begin{thebibliography}{0} + \bibitem{mayers} + Майерс, Г. Искусство тестирования программ. -- Санкт-Петербург: Диалектика, 2012 г. +\end{thebibliography} + +\end{document} \ No newline at end of file