\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}, раздел \texttt{tornado-k40}) и стандартный Intel LINPACK (задание \texttt{6616818}, узел \texttt{n01p090}, раздел \texttt{tornado}). Для Intel LINPACK использовался отдельный входной файл, содержащий те же размеры задач, что и в CUDA-реализации.

Численные результаты сведены в таблицу \ref{tab:task1-results}. Для столбцов CUDA использованы значения из файла \texttt{results/task1-cuda-6616336.csv}. Для Intel LINPACK в таблицу внесены минимальное время из серии прогонов и максимальная производительность из секции \texttt{Performance Summary}.

\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 & 0.010 & 67.331 & 2.00 \\
        1500 & 7.4931 & 6 & $1.107 \cdot 10^{-6}$ & 300.277 & 0.020 & 114.360 & 2.67 \\
        2000 & 8.3563 & 5 & $2.443 \cdot 10^{-5}$ & 638.244 & 0.028 & 193.276 & 3.35 \\
        2500 & 10.4837 & 5 & $1.593 \cdot 10^{-5}$ & 993.608 & 0.042 & 250.731 & 4.01 \\
        3000 & 12.6709 & 5 & $1.288 \cdot 10^{-5}$ & 1420.573 & 0.069 & 260.451 & 5.45 \\
        3500 & 14.8861 & 5 & $9.516 \cdot 10^{-6}$ & 1920.138 & 0.100 & 286.264 & 6.72 \\
        \bottomrule
    \end{tabular}
\end{table}

По полученным результатам можно сделать следующие наблюдения:
\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}$, что подтверждает корректность полученного решения;
    \item на всех рассмотренных размерах задач собственная CUDA-реализация оказывается быстрее Intel LINPACK, а ускорение по времени $S_t$ возрастает от $2.00$ до $6.72$.
\end{itemize}

\subsection{Выводы}

В рамках первого задания была подготовлена собственная CUDA-реализация LINPACK-подобного теста для решения плотной СЛАУ методом Якоби. Программа поддерживает запуск серии экспериментов, измерение времени выполнения, оценку производительности в GFLOPS, а также вычисление невязки и ошибки относительно известного точного решения.

Дополнительно были подготовлены сценарии пакетного запуска на СКЦ Политехнический: отдельный скрипт для собственной CUDA-реализации и отдельный скрипт для стандартного Intel LINPACK. Это позволяет провести воспроизводимое сравнение двух подходов и получить необходимые для отчёта доказательства выполнения работы: логин пользователя, конфигурацию узла, время выполнения и число задействованных узлов.

На текущем этапе можно зафиксировать, что собственная CUDA-реализация корректно работает на узле \texttt{tornado-k40}, обеспечивает сходимость на всём исследованном диапазоне размеров и достигает производительности до $1920.138$ GFLOPS. В сопоставлении со стандартным Intel LINPACK на CPU она показывает меньшее время решения на всех исследованных размерах: ускорение возрастает от $2.00$ при $N = 1000$ до $6.72$ при $N = 3500$, а достигнутая производительность существенно выше во всём рассмотренном диапазоне.


\section{Задача 2}

\subsection{Постановка задачи}

\newpage
\section*{Заключение}
\addcontentsline{toc}{section}{Заключение}

\newpage
\printbibliography[heading=bibintoc]


\end{document}
