This commit is contained in:
2026-03-16 19:48:50 +03:00
parent a9369a1801
commit 32f8e92bcb
14 changed files with 249 additions and 74 deletions

View File

@@ -55,17 +55,7 @@
\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}%
}%
}%
}%
\includegraphics[width=#1]{#2}%
}
@@ -197,9 +187,8 @@
Все вычислительные эксперименты проводились на вычислительном кластере Суперкомпьютерного центра Политехнического университета (СКЦ Политехнический). Доступ к вычислительным ресурсам осуществлялся через удалённое подключение по протоколу SSH. Для выполнения экспериментов использовалась учётная запись \texttt{tm3u21}, вход на кластер производился через узел доступа \texttt{login1.hpc.spbstu.ru}.
Полученные в ходе работы результаты позволяют оценить влияние различных технологий параллельных вычислений на производительность алгоритмов решения вычислительных задач и сравнить эффективность использования различных вычислительных архитектур.
\newpage
\section{Задача 1}
\subsection{Постановка задачи}
@@ -212,7 +201,15 @@
\item сравнить результаты собственной программы и стандартного Intel LINPACK.
\end{enumerate}
В данной работе все скриншоты и вычислительные эксперименты выполнялись под учётной записью \texttt{tm3u21}. Этот логин должен быть виден на скриншоте входа в систему и на терминальных снимках, приложенных к отчёту.
\begin{lstlisting}[caption={Фрагмент файла \texttt{\~{}/.ssh/config}}, label={lst:ssh-config}]
Host polytech
HostName login1.hpc.spbstu.ru
User tm3u21
IdentityFile ~/.ssh/09
ForwardAgent yes
\end{lstlisting}
Для подключения к СКЦ Политехнический в файл \texttt{\~{}/.ssh/config} была добавлена запись, приведённая в листинге~\ref{lst:ssh-config}. После этого вход на кластер выполнялся командой \texttt{ssh polytech}. Подтверждение входа под учётной записью \texttt{tm3u21} приведено на рис.~\ref{fig:task1-login}.
\subsection{Математическое описание}
@@ -261,106 +258,69 @@
\end{itemize}
Такой вариант не является буквальной реализацией классического LU-LINPACK, однако решает ту же прикладную задачу --- измерение производительности при решении плотной СЛАУ --- и позволяет исследовать эффективность распараллеливания на GPU.
Полный текст исходного кода CUDA-реализации приведён в приложении А.
\subsection{Сборка и запуск}
Подготовленные файлы для выполнения задания расположены в каталоге \texttt{task1/}. Сборка и запуск на СКЦ выполняются по шагам:
Подготовленные файлы для выполнения задания были размещены в каталоге \texttt{/home/ipmmstudy1/tm3u21/supercomputers/task1}. Запуск собственной CUDA-реализации выполнялся пакетным файлом \texttt{task1/scripts/run\_cuda.slurm}, который загружал модули \texttt{compiler/gcc/11} и \texttt{nvidia/cuda/11.6u2}, собирал программу через \texttt{nvcc} и запускал серию вычислительных экспериментов. Полный текст данного файла приведён в приложении Б.
\begin{lstlisting}
scp -r task1 polytech:~/supercomputers/
ssh polytech
cd ~/supercomputers/task1
sbatch scripts/run_cuda.slurm
\end{lstlisting}
Эталонный CPU-вариант Intel LINPACK запускался из архива Intel oneMKL Benchmarks Suite for Linux, предварительно распакованного в каталог \\ \texttt{/home/ipmmstudy1/tm3u21/LINPACK}. В результате файл \texttt{xlinpack\_xeon64} был получен по пути \texttt{LINPACK/benchmarks\_2025.3/linux/share/mkl/benchmarks/linpack}. Для запуска использовался пакетный файл \texttt{task1/scripts/run\_intel\_linpack.slurm}, полный текст которого приведён в приложении В.
Скрипт \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}
Именно эти данные затем используются в отчёте как подтверждение времени выполнения, количества задействованных узлов и их идентификаторов.
Для Intel LINPACK был подготовлен отдельный входной файл \texttt{lininput\_report\_xeon64}, в котором зафиксированы те же размеры задач, что и для CUDA-реализации: $1000$, $1500$, $2000$, $2500$, $3000$, $3500$. Полный текст этого файла приведён в приложении Г.
\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}}
\label{fig:task1-login}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-cuda-node.png}
\caption{Конфигурация узла и графического ускорителя, использованных для CUDA-эксперимента}
\label{fig:task1-cuda-node}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-cuda-run.png}
\caption{Вывод собственной CUDA-реализации теста}
\caption{Терминальный вывод собственной CUDA-реализации теста}
\label{fig:task1-cuda-run}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-cuda-sacct.png}
\caption{Сведения Slurm о выполнении собственной CUDA-реализации}
\label{fig:task1-cuda-sacct}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-intel-run.png}
\caption{Запуск и результаты стандартного Intel LINPACK}
\caption{Терминальный вывод стандартного Intel LINPACK}
\label{fig:task1-intel-run}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-intel-sacct.png}
\caption{Сведения Slurm о выполнении Intel LINPACK}
\label{fig:task1-intel-sacct}
\end{figure}
Для сравнения были использованы два фактических запуска на СКЦ Политехнический: собственная CUDA-реализация (задание \texttt{6616336}, узел \texttt{n02p009}, раздел \texttt{tornado-k40}) и стандартный Intel LINPACK (задание \texttt{6616818}, узел \texttt{n01p090}, раздел \texttt{tornado}). Для Intel LINPACK использовался отдельный входной файл, содержащий те же размеры задач, что и в CUDA-реализации.
Подключение к кластеру под учётной записью \texttt{tm3u21} показано на рис.~\ref{fig:task1-login}. Конфигурация вычислительного узла и графических ускорителей, задействованных при CUDA-эксперименте, приведена на рис.~\ref{fig:task1-cuda-node}. Терминальный вывод собственной CUDA-реализации и сведения Slurm о её выполнении приведены на рис.~\ref{fig:task1-cuda-run} и рис.~\ref{fig:task1-cuda-sacct}. Аналогичные материалы для эталонного CPU-запуска Intel LINPACK приведены на рис.~\ref{fig:task1-intel-run} и рис.~\ref{fig:task1-intel-sacct}.
Численные результаты сведены в таблицу \ref{tab:task1-results}. Для столбцов CUDA использованы значения из файла \texttt{results/task1-cuda-6616336.csv}. Для Intel LINPACK в таблицу внесены минимальное время из серии прогонов и максимальная производительность из секции \texttt{Performance Summary}.
\begin{table}[H]
\centering
\small
\caption{Сравнение собственной CUDA-реализации и Intel LINPACK}
\label{tab:task1-results}
\begin{tabular}{cccccccc}
@@ -377,6 +337,22 @@ sacct -j <job_id> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNode
\end{tabular}
\end{table}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-time-comparison.png}
\caption{Сравнение времени решения эталонной и собственной реализаций}
\label{fig:task1-time-comparison}
\end{figure}
\begin{figure}[H]
\centering
\imgplaceholder{img/task1-gflops-comparison.png}
\caption{Сравнение производительности эталонной и собственной реализаций}
\label{fig:task1-gflops-comparison}
\end{figure}
Графическое сравнение времени решения приведено на рис.~\ref{fig:task1-time-comparison}, а сравнение достигнутой производительности --- на рис.~\ref{fig:task1-gflops-comparison}. Скрипт, использованный для построения этих графиков, приведён в приложении Д.
По полученным результатам можно сделать следующие наблюдения:
\begin{itemize}
\item все тестовые случаи для размеров от $1000$ до $3500$ успешно сошлись за $5$--$6$ итераций;
@@ -390,11 +366,12 @@ sacct -j <job_id> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNode
В рамках первого задания была подготовлена собственная CUDA-реализация LINPACK-подобного теста для решения плотной СЛАУ методом Якоби. Программа поддерживает запуск серии экспериментов, измерение времени выполнения, оценку производительности в GFLOPS, а также вычисление невязки и ошибки относительно известного точного решения.
Дополнительно были подготовлены сценарии пакетного запуска на СКЦ Политехнический: отдельный скрипт для собственной CUDA-реализации и отдельный скрипт для стандартного Intel LINPACK. Это позволяет провести воспроизводимое сравнение двух подходов и получить необходимые для отчёта доказательства выполнения работы: логин пользователя, конфигурацию узла, время выполнения и число задействованных узлов.
Дополнительно были подготовлены пакетные файлы запуска для собственной CUDA-реализации и для стандартного Intel LINPACK. Полные тексты этих файлов приведены в приложениях Б и В.
На текущем этапе можно зафиксировать, что собственная CUDA-реализация корректно работает на узле \texttt{tornado-k40}, обеспечивает сходимость на всём исследованном диапазоне размеров и достигает производительности до $1920.138$ GFLOPS. В сопоставлении со стандартным Intel LINPACK на CPU она показывает меньшее время решения на всех исследованных размерах: ускорение возрастает от $2.00$ при $N = 1000$ до $6.72$ при $N = 3500$, а достигнутая производительность существенно выше во всём рассмотренном диапазоне.
\newpage
\section{Задача 2}
\subsection{Постановка задачи}
@@ -406,5 +383,35 @@ sacct -j <job_id> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNode
\newpage
\printbibliography[heading=bibintoc]
\newpage
\section*{Приложение А}
\addcontentsline{toc}{section}{Приложение А}
\label{app:task1-cuda-source}
\lstinputlisting[caption={Файл \texttt{task1/src/main.cu}}, label={lst:task1-main}]{../task1/src/main.cu}
\newpage
\section*{Приложение Б}
\addcontentsline{toc}{section}{Приложение Б}
\label{app:task1-cuda-slurm}
\lstinputlisting[caption={Файл \texttt{task1/scripts/run\_cuda.slurm}}, label={lst:task1-cuda-slurm}]{../task1/scripts/run_cuda.slurm}
\newpage
\section*{Приложение В}
\addcontentsline{toc}{section}{Приложение В}
\label{app:task1-intel-slurm}
\lstinputlisting[caption={Файл \texttt{task1/scripts/run\_intel\_linpack.slurm}}, label={lst:task1-intel-slurm}]{../task1/scripts/run_intel_linpack.slurm}
\newpage
\section*{Приложение Г}
\addcontentsline{toc}{section}{Приложение Г}
\label{app:task1-intel-input}
\lstinputlisting[caption={Файл \texttt{task1/intel/lininput\_report\_xeon64}}, label={lst:task1-intel-input}]{../task1/intel/lininput_report_xeon64}
\newpage
\section*{Приложение Д}
\addcontentsline{toc}{section}{Приложение Д}
\label{app:task1-plot-script}
\lstinputlisting[caption={Файл \texttt{task1/scripts/plot\_task1\_results.py}}, label={lst:task1-plot-script}]{../task1/scripts/plot_task1_results.py}
\end{document}