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