Files
supercomputers/report/report.tex

410 lines
28 KiB
TeX
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\documentclass[a4paper, final]{article}
%\usepackage{literat} % Нормальные шрифты
\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\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}
% Рекомендуется для biblatex (кавычки/локализация цитат и т.п.)
\usepackage{csquotes}
% ГОСТ-стили для biblatex
\usepackage[
backend=biber,
bibstyle=gost-numeric, % ссылки вида: [1]
citestyle=gost-numeric,
sorting=none % порядок в списке = по первому цитированию
]{biblatex}
% Все источники хранятся в отдельном файле
\addbibresource{refs.bib}
\renewcommand*{\bibfont}{\small}
% \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}}
\newcommand{\imgplaceholder}[2][0.9\textwidth]{%
\IfFileExists{#2}{%
\includegraphics[width=#1]{#2}%
}{%
\fbox{%
\parbox[c][0.22\textheight][c]{0.82\textwidth}{%
\centering
Заглушка для изображения\\
\texttt{#2}%
}%
}%
}%
}
\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=python,
extendedchars=\true,
inputencoding=utf8,
keepspaces=true,
% captionpos=b, % подписи листингов снизу
}
% Настройка содержания
\usepackage{tocloft}
\usepackage[hidelinks]{hyperref}
% section в содержании НЕ жирным
\renewcommand{\cftsecfont}{\normalfont}
\renewcommand{\cftsecpagefont}{\normalfont}
% убрать отступ у subsection
\setlength{\cftsubsecindent}{0pt}
% subsubsection курсивом
\usepackage{titlesec}
\titleformat{\subsubsection}
{\normalfont\large\itshape} % стиль: обычный + курсив
{\thesubsubsection} % номер (убери если не нужен)
{1em}
{}
\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{<<Высокоскоростные сетевые технологии суперкомпьютеров>>}\\
\hfill \break
\hfill \break
\hfill \break
\end{center}
\small{
\begin{tabular}{lrrl}
\!\!\!Студент, & \hspace{2cm} & & \\
\!\!\!группы 5130201/20101 & \hspace{2cm} & \underline{\hspace{3cm}} & Тищенко А. А. \\\\
\!\!\!Руководитель, & \hspace{2cm} & & \\
\!\!\!профессор, д.т.н. & \hspace{2cm} & \underline{\hspace{3cm}} & Курочкин М. А. \\\\
&&\hspace{4cm}
\end{tabular}
\begin{flushright}
<<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2026г.
\end{flushright}
}
\hfill \break
\begin{center} \small{Санкт-Петербург, 2026} \end{center}
\thispagestyle{empty} % выключаем отображение номера для этой страницы
\newpage
\section*{Введение}
\addcontentsline{toc}{section}{Введение}
Современные вычислительные задачи во многих областях науки и техники требуют обработки больших объёмов данных и выполнения ресурсоёмких численных расчётов. В связи с этим особую роль играют высокопроизводительные вычислительные системы (High Performance Computing, HPC), позволяющие значительно ускорить решение сложных задач за счёт параллельной обработки данных и использования специализированных архитектур.
Одной из ключевых задач при работе с вычислительными системами является исследование их производительности. Для этого применяются специальные тесты и бенчмарки, позволяющие оценить эффективность вычислений при различных алгоритмах и конфигурациях оборудования. Одним из наиболее известных тестов является LINPACK, который используется для измерения производительности вычислительных систем при решении систем линейных алгебраических уравнений \cite{dongarra2003linpack}. Данный тест лежит в основе рейтинга суперкомпьютеров TOP500 и широко применяется для оценки производительности высокопроизводительных вычислительных систем.
Первая лабораторная работа посвящена исследованию производительности вычислительных систем на основе решения систем линейных алгебраических уравнений. В рамках работы изучаются численные методы решения СЛАУ, включая прямые и итерационные методы, а также реализуется собственная версия теста LINPACK с использованием параллельных вычислений. Особое внимание уделяется сравнению производительности стандартной реализации Intel High Performance Linpack и собственной реализации алгоритма.
Вторая лабораторная работа направлена на изучение технологий параллельного программирования и межпроцессного взаимодействия. В рамках данной работы рассматривается технология MPI (Message Passing Interface), широко используемая для разработки масштабируемых параллельных приложений \cite{gropp2014mpi}. Разработанный алгоритм реализуется с использованием MPI и исследуется его производительность при запуске на различном количестве вычислительных узлов. Полученные результаты сравниваются с реализацией вычислений с использованием технологии CUDA, предназначенной для выполнения параллельных вычислений на графических процессорах \cite{kirk2016cuda}.
Все вычислительные эксперименты проводились на вычислительном кластере Суперкомпьютерного центра Политехнического университета (СКЦ Политехнический). Доступ к вычислительным ресурсам осуществлялся через удалённое подключение по протоколу SSH. Для выполнения экспериментов использовалась учётная запись \texttt{tm3u21}, вход на кластер производился через узел доступа \texttt{login1.hpc.spbstu.ru}.
Полученные в ходе работы результаты позволяют оценить влияние различных технологий параллельных вычислений на производительность алгоритмов решения вычислительных задач и сравнить эффективность использования различных вычислительных архитектур.
\section{Задача 1}
\subsection{Постановка задачи}
В рамках первого задания требовалось исследовать производительность вычислительной системы при решении плотной системы линейных алгебраических уравнений и сопоставить результаты собственной реализации с эталонным тестом LINPACK. Для достижения этой цели были поставлены следующие задачи:
\begin{enumerate}
\item изучить подходы к оценке производительности вычислительных систем;
\item разработать собственную CUDA-реализацию LINPACK-подобного теста;
\item выполнить экспериментальные запуски на вычислительном узле СКЦ Политехнический;
\item сравнить результаты собственной программы и стандартного Intel LINPACK.
\end{enumerate}
В данной работе все скриншоты и вычислительные эксперименты выполнялись под учётной записью \texttt{tm3u21}. Этот логин должен быть виден на скриншоте входа в систему и на терминальных снимках, приложенных к отчёту.
\subsection{Математическое описание}
Тест LINPACK применяется для оценки производительности вычислительных систем при решении плотной системы линейных уравнений \cite{dongarra2003linpack}. Рассматривается задача
\begin{equation}
A x = b,
\end{equation}
где $A \in \mathbb{R}^{n \times n}$ --- плотная квадратная матрица, $x \in \mathbb{R}^{n}$ --- искомый вектор решения, $b \in \mathbb{R}^{n}$ --- вектор правой части.
В классическом варианте LINPACK обычно применяются прямые методы, основанные на LU-разложении \cite{golub2013matrix}. В собственной реализации для первого задания использован итерационный метод Якоби, так как он хорошо распараллеливается на GPU: каждая строка матрицы может обрабатываться независимо \cite{saad2003iterative}.
Для метода Якоби очередное приближение вычисляется по формуле
\begin{equation}
x_i^{(k+1)} = \frac{1}{a_{ii}} \left( b_i - \sum\limits_{j \ne i} a_{ij} x_j^{(k)} \right), \quad i = 1, 2, \dots, n.
\end{equation}
Критерий остановки выбран в виде
\begin{equation}
\max_i \left| x_i^{(k+1)} - x_i^{(k)} \right| \le \varepsilon.
\end{equation}
Чтобы обеспечить сходимость метода, в программе формируется строго диагонально доминирующая матрица. Для контроля качества решения дополнительно вычисляются:
\begin{equation}
\| A x - b \|_{\infty},
\end{equation}
\begin{equation}
\| x - x_{true} \|_{\infty},
\end{equation}
где $x_{true}$ --- заранее известное опорное решение, использованное при построении тестовой системы.
Для приближённой оценки производительности используется LINPACK-подобная метрика
\begin{equation}
R = \frac{\frac{2}{3} n^3}{t},
\end{equation}
где $t$ --- время решения, измеренное в секундах. В отчёте далее используется величина $R$ в GFLOPS.
\subsection{Особенности реализации}
Собственная программа реализована на CUDA C++ и находится в файле \texttt{task1/src/main.cu}. В реализации приняты следующие решения:
\begin{itemize}
\item для каждой строки матрицы запускается отдельный поток CUDA, который вычисляет новое значение одной компоненты вектора решения;
\item матрица $A$ и вектор $b$ один раз копируются на устройство, а далее итерационный процесс выполняется на GPU;
\item завершение итераций контролируется через флаг \texttt{converged}, который может быть сброшен любым потоком, если изменение соответствующей компоненты превысило $\varepsilon$;
\item после завершения расчёта на стороне CPU вычисляются невязка и ошибка относительно заранее известного решения;
\item для удобства дальнейшего анализа программа может сохранять результаты в CSV-файл.
\end{itemize}
Такой вариант не является буквальной реализацией классического LU-LINPACK, однако решает ту же прикладную задачу --- измерение производительности при решении плотной СЛАУ --- и позволяет исследовать эффективность распараллеливания на GPU.
\subsection{Сборка и запуск}
Подготовленные файлы для выполнения задания расположены в каталоге \texttt{task1/}. Сборка и запуск на СКЦ выполняются по шагам:
\begin{lstlisting}
scp -r task1 polytech:~/supercomputers/
ssh polytech
cd ~/supercomputers/task1
sbatch scripts/run_cuda.slurm
\end{lstlisting}
Скрипт \texttt{scripts/run\_cuda.slurm} автоматически:
\begin{itemize}
\item загружает модули \texttt{compiler/gcc/11} и \texttt{nvidia/cuda/11.6u2};
\item собирает программу через \texttt{nvcc};
\item печатает в лог данные учётной записи, имя узла, дату, параметры Slurm и конфигурацию узла;
\item запускает набор экспериментов и сохраняет CSV с численными результатами.
\end{itemize}
Для запуска эталонного CPU-варианта Intel LINPACK используется отдельный пакетный скрипт:
\begin{lstlisting}
скачать архив Intel oneMKL Benchmarks Suite for Linux с официального сайта Intel
scp linpack.tgz polytech:~/linpack.tgz
ssh polytech
mkdir -p ~/LINPACK
tar -xzf ~/linpack.tgz -C ~/LINPACK
find ~/LINPACK -name xlinpack_xeon64 2>/dev/null
cd <каталог_с_xlinpack_xeon64>
mkdir -p stdio
chmod +x *
chmod -x *.*
cd ~/supercomputers/task1
sbatch --export=ALL,LINPACK_DIR=<каталог_с_xlinpack_xeon64> \
/home/ipmmstudy1/tm3u21/supercomputers/task1/scripts/run_intel_linpack.slurm
\end{lstlisting}
При этом в пакетном сценарии используется собственный входной файл \texttt{task1/intel/lininput\_report\_xeon64}, в котором заданы те же размеры задач, что и для CUDA-реализации: $1000$, $1500$, $2000$, $2500$, $3000$, $3500$. Это позволяет напрямую перенести результаты Intel LINPACK в сравнительную таблицу.
Сведения о завершённых заданиях рекомендуется получать командой:
\begin{lstlisting}
sacct -j <job_id> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNodes,AllocTRES%40,NodeList,ExitCode
\end{lstlisting}
Именно эти данные затем используются в отчёте как подтверждение времени выполнения, количества задействованных узлов и их идентификаторов.
\subsection{Результаты эксперимента}
Для корректного оформления отчёта необходимо приложить скриншоты, подтверждающие, что эксперименты выполнялись именно в учётной записи \texttt{tm3u21}. В подготовленном шаблоне отчёта для этого предусмотрены следующие изображения:
\begin{itemize}
\item скрин входа в систему с командами \texttt{whoami}, \texttt{hostname}, \texttt{date};
\item скрин конфигурации узла и GPU из лога CUDA-задания;
\item скрин таблицы результатов собственной CUDA-реализации;
\item скрин \texttt{sacct} для CUDA-задания;
\item скрин запуска и итогов Intel LINPACK;
\item скрин \texttt{sacct} для Intel LINPACK.
\end{itemize}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-login.png}
\caption{Подключение к СКЦ Политехнический под учётной записью \texttt{tm3u21}}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-cuda-node.png}
\caption{Конфигурация узла и графического ускорителя, использованных для CUDA-эксперимента}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-cuda-run.png}
\caption{Вывод собственной CUDA-реализации теста}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-cuda-sacct.png}
\caption{Сведения Slurm о выполнении собственной CUDA-реализации}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-intel-run.png}
\caption{Запуск и результаты стандартного Intel LINPACK}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-intel-sacct.png}
\caption{Сведения Slurm о выполнении Intel LINPACK}
\end{figure}
На момент подготовки отчёта успешно выполнен CUDA-запуск задания \texttt{6616336} на узле \texttt{n02p009}. Для него получены корректные значения времени, производительности и точности решения. Попытка запуска Intel LINPACK заданием \texttt{6616338} завершилась неуспешно из-за отсутствия бинарного файла \texttt{xlinpack\_xeon64} по ожидаемому пути; после уточнения реального расположения пакета на кластере столбцы Intel LINPACK могут быть заполнены без изменения остальной структуры отчёта.
Численные результаты удобно свести в таблицу \ref{tab:task1-results}. Значения для столбцов CUDA берутся из файла \texttt{results/task1-cuda-6616336.csv}, а значения для столбцов Intel LINPACK --- из секции \texttt{Performance Summary} в выходном файле CPU-задания после успешного запуска.
\begin{table}[H]
\centering
\caption{Сравнение собственной CUDA-реализации и Intel LINPACK}
\label{tab:task1-results}
\begin{tabular}{cccccccc}
\toprule
$N$ & $t_{CUDA}$, мс & Iter & $\|Ax-b\|_{\infty}$ & $R_{CUDA}$, GFLOPS & $t_{Intel}$, c & $R_{Intel}$, GFLOPS & $S_t$ \\
\midrule
1000 & 5.0083 & 6 & $2.242 \cdot 10^{-6}$ & 133.114 & -- & -- & -- \\
1500 & 7.4931 & 6 & $1.107 \cdot 10^{-6}$ & 300.277 & -- & -- & -- \\
2000 & 8.3563 & 5 & $2.443 \cdot 10^{-5}$ & 638.244 & -- & -- & -- \\
2500 & 10.4837 & 5 & $1.593 \cdot 10^{-5}$ & 993.608 & -- & -- & -- \\
3000 & 12.6709 & 5 & $1.288 \cdot 10^{-5}$ & 1420.573 & -- & -- & -- \\
3500 & 14.8861 & 5 & $9.516 \cdot 10^{-6}$ & 1920.138 & -- & -- & -- \\
\bottomrule
\end{tabular}
\end{table}
По уже полученным данным CUDA-реализации можно сделать предварительные наблюдения:
\begin{itemize}
\item все тестовые случаи для размеров от $1000$ до $3500$ успешно сошлись за $5$--$6$ итераций;
\item время решения возрастает плавно: от $5.0083$ мс при $N = 1000$ до $14.8861$ мс при $N = 3500$;
\item производительность в GFLOPS монотонно увеличивается и достигает $1920.138$ GFLOPS на размере $N = 3500$;
\item ошибка по известному решению остаётся на уровне порядка $10^{-9}$--$10^{-8}$, а невязка --- на уровне $10^{-6}$--$10^{-5}$, что подтверждает корректность полученного решения.
\end{itemize}
\subsection{Выводы}
В рамках первого задания была подготовлена собственная CUDA-реализация LINPACK-подобного теста для решения плотной СЛАУ методом Якоби. Программа поддерживает запуск серии экспериментов, измерение времени выполнения, оценку производительности в GFLOPS, а также вычисление невязки и ошибки относительно известного точного решения.
Дополнительно были подготовлены сценарии пакетного запуска на СКЦ Политехнический: отдельный скрипт для собственной CUDA-реализации и отдельный скрипт для стандартного Intel LINPACK. Это позволяет провести воспроизводимое сравнение двух подходов и получить необходимые для отчёта доказательства выполнения работы: логин пользователя, конфигурацию узла, время выполнения и число задействованных узлов.
На текущем этапе можно зафиксировать, что собственная CUDA-реализация корректно работает на узле \texttt{tornado-k40}, обеспечивает сходимость на всём исследованном диапазоне размеров и достигает производительности до $1920.138$ GFLOPS. После успешного запуска Intel LINPACK останется дополнить сравнительную часть таблицы \ref{tab:task1-results} и окончательно сформулировать вывод о преимуществе или проигрыше GPU-варианта относительно эталонного CPU-теста.
\section{Задача 2}
\subsection{Постановка задачи}
\newpage
\section*{Заключение}
\addcontentsline{toc}{section}{Заключение}
\newpage
\printbibliography[heading=bibintoc]
\end{document}