Заготовка отчёта

This commit is contained in:
2025-03-31 16:53:01 +03:00
parent a33e38a105
commit ecc7c3ed61
4 changed files with 517 additions and 0 deletions

5
report/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
**/*
!.gitignore
!report.tex
!img
!img/**

BIN
report/img/memory.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

BIN
report/img/streams.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

512
report/report.tex Normal file
View File

@@ -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}