task1
BIN
report/img/task1-cuda-node.png
Normal file
|
After Width: | Height: | Size: 324 KiB |
BIN
report/img/task1-cuda-run.png
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
report/img/task1-cuda-sacct.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
report/img/task1-gflops-comparison.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
report/img/task1-intel-run.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
report/img/task1-intel-sacct.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
report/img/task1-login.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
report/img/task1-time-comparison.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
@@ -55,17 +55,7 @@
|
|||||||
|
|
||||||
\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
|
\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
|
||||||
\newcommand{\imgplaceholder}[2][0.9\textwidth]{%
|
\newcommand{\imgplaceholder}[2][0.9\textwidth]{%
|
||||||
\IfFileExists{#2}{%
|
\includegraphics[width=#1]{#2}%
|
||||||
\includegraphics[width=#1]{#2}%
|
|
||||||
}{%
|
|
||||||
\fbox{%
|
|
||||||
\parbox[c][0.22\textheight][c]{0.82\textwidth}{%
|
|
||||||
\centering
|
|
||||||
Заглушка для изображения\\
|
|
||||||
\texttt{#2}%
|
|
||||||
}%
|
|
||||||
}%
|
|
||||||
}%
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -197,9 +187,8 @@
|
|||||||
|
|
||||||
Все вычислительные эксперименты проводились на вычислительном кластере Суперкомпьютерного центра Политехнического университета (СКЦ Политехнический). Доступ к вычислительным ресурсам осуществлялся через удалённое подключение по протоколу SSH. Для выполнения экспериментов использовалась учётная запись \texttt{tm3u21}, вход на кластер производился через узел доступа \texttt{login1.hpc.spbstu.ru}.
|
Все вычислительные эксперименты проводились на вычислительном кластере Суперкомпьютерного центра Политехнического университета (СКЦ Политехнический). Доступ к вычислительным ресурсам осуществлялся через удалённое подключение по протоколу SSH. Для выполнения экспериментов использовалась учётная запись \texttt{tm3u21}, вход на кластер производился через узел доступа \texttt{login1.hpc.spbstu.ru}.
|
||||||
|
|
||||||
Полученные в ходе работы результаты позволяют оценить влияние различных технологий параллельных вычислений на производительность алгоритмов решения вычислительных задач и сравнить эффективность использования различных вычислительных архитектур.
|
|
||||||
|
|
||||||
|
|
||||||
|
\newpage
|
||||||
\section{Задача 1}
|
\section{Задача 1}
|
||||||
|
|
||||||
\subsection{Постановка задачи}
|
\subsection{Постановка задачи}
|
||||||
@@ -212,7 +201,15 @@
|
|||||||
\item сравнить результаты собственной программы и стандартного Intel LINPACK.
|
\item сравнить результаты собственной программы и стандартного Intel LINPACK.
|
||||||
\end{enumerate}
|
\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{Математическое описание}
|
\subsection{Математическое описание}
|
||||||
|
|
||||||
@@ -261,106 +258,69 @@
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Такой вариант не является буквальной реализацией классического LU-LINPACK, однако решает ту же прикладную задачу --- измерение производительности при решении плотной СЛАУ --- и позволяет исследовать эффективность распараллеливания на GPU.
|
Такой вариант не является буквальной реализацией классического LU-LINPACK, однако решает ту же прикладную задачу --- измерение производительности при решении плотной СЛАУ --- и позволяет исследовать эффективность распараллеливания на GPU.
|
||||||
|
Полный текст исходного кода CUDA-реализации приведён в приложении А.
|
||||||
|
|
||||||
\subsection{Сборка и запуск}
|
\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}
|
Эталонный 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}, полный текст которого приведён в приложении В.
|
||||||
scp -r task1 polytech:~/supercomputers/
|
|
||||||
ssh polytech
|
|
||||||
cd ~/supercomputers/task1
|
|
||||||
sbatch scripts/run_cuda.slurm
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
Скрипт \texttt{scripts/run\_cuda.slurm} автоматически:
|
Для Intel LINPACK был подготовлен отдельный входной файл \texttt{lininput\_report\_xeon64}, в котором зафиксированы те же размеры задач, что и для CUDA-реализации: $1000$, $1500$, $2000$, $2500$, $3000$, $3500$. Полный текст этого файла приведён в приложении Г.
|
||||||
\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{Результаты эксперимента}
|
\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]
|
\begin{figure}[H]
|
||||||
\centering
|
\centering
|
||||||
\imgplaceholder{img/task1-login.png}
|
\imgplaceholder{img/task1-login.png}
|
||||||
\caption{Подключение к СКЦ Политехнический под учётной записью \texttt{tm3u21}}
|
\caption{Подключение к СКЦ Политехнический под учётной записью \texttt{tm3u21}}
|
||||||
|
\label{fig:task1-login}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\centering
|
\centering
|
||||||
\imgplaceholder{img/task1-cuda-node.png}
|
\imgplaceholder{img/task1-cuda-node.png}
|
||||||
\caption{Конфигурация узла и графического ускорителя, использованных для CUDA-эксперимента}
|
\caption{Конфигурация узла и графического ускорителя, использованных для CUDA-эксперимента}
|
||||||
|
\label{fig:task1-cuda-node}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\centering
|
\centering
|
||||||
\imgplaceholder{img/task1-cuda-run.png}
|
\imgplaceholder{img/task1-cuda-run.png}
|
||||||
\caption{Вывод собственной CUDA-реализации теста}
|
\caption{Терминальный вывод собственной CUDA-реализации теста}
|
||||||
|
\label{fig:task1-cuda-run}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\centering
|
\centering
|
||||||
\imgplaceholder{img/task1-cuda-sacct.png}
|
\imgplaceholder{img/task1-cuda-sacct.png}
|
||||||
\caption{Сведения Slurm о выполнении собственной CUDA-реализации}
|
\caption{Сведения Slurm о выполнении собственной CUDA-реализации}
|
||||||
|
\label{fig:task1-cuda-sacct}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\centering
|
\centering
|
||||||
\imgplaceholder{img/task1-intel-run.png}
|
\imgplaceholder{img/task1-intel-run.png}
|
||||||
\caption{Запуск и результаты стандартного Intel LINPACK}
|
\caption{Терминальный вывод стандартного Intel LINPACK}
|
||||||
|
\label{fig:task1-intel-run}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\centering
|
\centering
|
||||||
\imgplaceholder{img/task1-intel-sacct.png}
|
\imgplaceholder{img/task1-intel-sacct.png}
|
||||||
\caption{Сведения Slurm о выполнении Intel LINPACK}
|
\caption{Сведения Slurm о выполнении Intel LINPACK}
|
||||||
|
\label{fig:task1-intel-sacct}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Для сравнения были использованы два фактических запуска на СКЦ Политехнический: собственная CUDA-реализация (задание \texttt{6616336}, узел \texttt{n02p009}, раздел \texttt{tornado-k40}) и стандартный Intel LINPACK (задание \texttt{6616818}, узел \texttt{n01p090}, раздел \texttt{tornado}). Для Intel LINPACK использовался отдельный входной файл, содержащий те же размеры задач, что и в CUDA-реализации.
|
Для сравнения были использованы два фактических запуска на СКЦ Политехнический: собственная 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}.
|
Численные результаты сведены в таблицу \ref{tab:task1-results}. Для столбцов CUDA использованы значения из файла \texttt{results/task1-cuda-6616336.csv}. Для Intel LINPACK в таблицу внесены минимальное время из серии прогонов и максимальная производительность из секции \texttt{Performance Summary}.
|
||||||
|
|
||||||
\begin{table}[H]
|
\begin{table}[H]
|
||||||
\centering
|
\centering
|
||||||
|
\small
|
||||||
\caption{Сравнение собственной CUDA-реализации и Intel LINPACK}
|
\caption{Сравнение собственной CUDA-реализации и Intel LINPACK}
|
||||||
\label{tab:task1-results}
|
\label{tab:task1-results}
|
||||||
\begin{tabular}{cccccccc}
|
\begin{tabular}{cccccccc}
|
||||||
@@ -377,6 +337,22 @@ sacct -j <job_id> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNode
|
|||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{table}
|
\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}
|
\begin{itemize}
|
||||||
\item все тестовые случаи для размеров от $1000$ до $3500$ успешно сошлись за $5$--$6$ итераций;
|
\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-реализация 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$, а достигнутая производительность существенно выше во всём рассмотренном диапазоне.
|
На текущем этапе можно зафиксировать, что собственная CUDA-реализация корректно работает на узле \texttt{tornado-k40}, обеспечивает сходимость на всём исследованном диапазоне размеров и достигает производительности до $1920.138$ GFLOPS. В сопоставлении со стандартным Intel LINPACK на CPU она показывает меньшее время решения на всех исследованных размерах: ускорение возрастает от $2.00$ при $N = 1000$ до $6.72$ при $N = 3500$, а достигнутая производительность существенно выше во всём рассмотренном диапазоне.
|
||||||
|
|
||||||
|
|
||||||
|
\newpage
|
||||||
\section{Задача 2}
|
\section{Задача 2}
|
||||||
|
|
||||||
\subsection{Постановка задачи}
|
\subsection{Постановка задачи}
|
||||||
@@ -406,5 +383,35 @@ sacct -j <job_id> --format=JobID,JobName,Partition,State,Start,End,Elapsed,NNode
|
|||||||
\newpage
|
\newpage
|
||||||
\printbibliography[heading=bibintoc]
|
\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}
|
\end{document}
|
||||||
|
|||||||
60
task1.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
|
||||||
|
# Задание 1
|
||||||
|
## Постановка задачи
|
||||||
|
В рамках данной работы необходимо:
|
||||||
|
### 1. Изучить методы определения производительности вычислительных систем.
|
||||||
|
### 2. Разработать собственную реализацию теста LINPACK, применив уникальный метод распараллеливания вычислений.
|
||||||
|
### 3. С помощью собственной реализации и стандартного теста LINPACK исследовать производительность узла СКЦ .Политехнический.
|
||||||
|
|
||||||
|
Математическое описание
|
||||||
|
### 2.1 Задача решения СЛАУ
|
||||||
|
Дано:
|
||||||
|
a11x1 + a12x2 + ・ ・ ・ + a1nxN = b1
|
||||||
|
a21x1 + a22x2 + ・ ・ ・ + a2nxN = b2
|
||||||
|
. . .
|
||||||
|
aN1x1 + am2x2 + ・ ・ ・ + amnxN = bN
|
||||||
|
Ax = b — система N линейных уравнений с N неизвестными, где:
|
||||||
|
– A — матрица N × N коэффициентов
|
||||||
|
– x — вектор N неизвестных
|
||||||
|
– b — вектор N свободных членов уравнений
|
||||||
|
Найти:
|
||||||
|
Элементы вектора x, при которых |Ax − b| ≤ ϵ, где ϵ — точность найденного
|
||||||
|
решения.
|
||||||
|
Численные методы решения СЛАУ
|
||||||
|
Для решения СЛАУ применяют в основном два класса методов: прямые (выполняемые за заранее известное количество действий) и итерационные (обеспечивающие постепенную сходимость к корню уравнения, зависящую от многих
|
||||||
|
факторов).
|
||||||
|
### 2.2.1 Прямые методы
|
||||||
|
Прямые методы используют конечные соотношения (формулы) для вычисления неизвестных. К ним относятся: метод Гаусса, Крамера, метод прогонки и др.
|
||||||
|
Достоинства:
|
||||||
|
– дают решение после выполнения заранее известного числа операций
|
||||||
|
– сравнительно просты и наиболее универсальны (пригодны для решения широкого класса линейных систем).
|
||||||
|
Недостатки:
|
||||||
|
– необходимость хранения в оперативной памяти компьютера сразу всей матрицы,
|
||||||
|
– накапливание погрешностей в процессе решения.
|
||||||
|
В связи с этим прямые методы используют обычно для не слишком больших
|
||||||
|
(N ≤ 200) систем с плотно заполненной матрицей и не близким к нулю определителем. Для больших N используются итерационные методы.
|
||||||
|
### 2.2.2 Итерационные методы
|
||||||
|
Итерационные методы – это методы последовательных приближений. Среди
|
||||||
|
них: метод Якоби, метод Гаусса-Зейделя и др.
|
||||||
|
В итерационных методах необходимо задать некоторое приближённое решение – начальное приближение. После этого с помощью некоторого алгоритма
|
||||||
|
проводится один цикл вычислений, называемый итерацией. В результате итерации находят новое приближение. Итерации проводятся до получения решения с
|
||||||
|
требуемой точностью.
|
||||||
|
### 2.3 Метод Якоби
|
||||||
|
Пусть требуется численно решить систему линейных уравнений:
|
||||||
|
a11x1 + . . . + a1nxn = b1
|
||||||
|
. . .
|
||||||
|
an1x1 + . . . + annxn = bn
|
||||||
|
Предполагается, что aii ̸= 0, i ∈ {1, . . . , n} (иначе метод Якоби неприменим).
|
||||||
|
Выразим x1 через первое уравнение, x2 — через второе и т.д.:
|
||||||
|
В методе Якоби последовательность приближений x(k) строится следующим
|
||||||
|
образом. Выбирается первое приближение x(0), формула для остальных приближений имеет вид:
|
||||||
|
|
||||||
|
|
||||||
|
Постановка эксперимента
|
||||||
|
|
||||||
|
(Произведено исследование производительности с помощью реализации теста
|
||||||
|
от Intel - Intel High Performance Linpack, - и собственной реализации на CUDA.
|
||||||
|
Тестирование производилось для набора значений N от 1000 до 15000.)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1
task1/.gitignore
vendored
@@ -2,3 +2,4 @@ bin/
|
|||||||
results/*.out
|
results/*.out
|
||||||
results/*.err
|
results/*.err
|
||||||
results/*.csv
|
results/*.csv
|
||||||
|
*.pyc
|
||||||
@@ -103,15 +103,13 @@ tar -xzf ~/linpack.tgz -C ~/LINPACK
|
|||||||
find ~/LINPACK -name xlinpack_xeon64 2>/dev/null
|
find ~/LINPACK -name xlinpack_xeon64 2>/dev/null
|
||||||
```
|
```
|
||||||
|
|
||||||
Если команда вернёт, например, путь
|
В вашем случае по логам нужный каталог уже известен:
|
||||||
`/home/ipmmstudy1/tm3u21/LINPACK/benchmarks/linpack/xlinpack_xeon64`,
|
`/home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack`.
|
||||||
то нужный каталог для запуска:
|
|
||||||
`/home/ipmmstudy1/tm3u21/LINPACK/benchmarks/linpack`.
|
|
||||||
|
|
||||||
6. Подготовь этот каталог, как в примере:
|
6. Подготовь этот каталог, как в примере:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd <НУЖНЫЙ_КАТАЛОГ_С_XLINPACK>
|
cd /home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack
|
||||||
mkdir -p stdio
|
mkdir -p stdio
|
||||||
chmod +x *
|
chmod +x *
|
||||||
chmod -x *.*
|
chmod -x *.*
|
||||||
@@ -121,7 +119,7 @@ chmod -x *.*
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/supercomputers/task1
|
cd ~/supercomputers/task1
|
||||||
sbatch --export=ALL,LINPACK_DIR=<НУЖНЫЙ_КАТАЛОГ_С_XLINPACK> scripts/run_intel_linpack.slurm
|
sbatch --export=ALL,LINPACK_DIR=/home/ipmmstudy1/tm3u21/LINPACK/benchmarks_2025.3/linux/share/mkl/benchmarks/linpack scripts/run_intel_linpack.slurm
|
||||||
```
|
```
|
||||||
|
|
||||||
По умолчанию скрипт использует файл `task1/intel/lininput_report_xeon64`, где уже зафиксированы размеры
|
По умолчанию скрипт использует файл `task1/intel/lininput_report_xeon64`, где уже зафиксированы размеры
|
||||||
@@ -136,7 +134,7 @@ sacct -j <JOBID_INTEL> --format=JobID,JobName,Partition,State,Start,End,Elapsed,
|
|||||||
9. Посмотри вывод:
|
9. Посмотри вывод:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
less <НУЖНЫЙ_КАТАЛОГ_С_XLINPACK>/stdio/task1-intel-linpack-<JOBID_INTEL>.out
|
less ~/supercomputers/task1/stdio/task1-intel-linpack-<JOBID_INTEL>.out
|
||||||
```
|
```
|
||||||
|
|
||||||
В этом файле ищи строки с размерами `1000`, `1500`, `2000`, `2500`, `3000`, `3500`, а внизу --- секцию `Performance Summary`.
|
В этом файле ищи строки с размерами `1000`, `1500`, `2000`, `2500`, `3000`, `3500`, а внизу --- секцию `Performance Summary`.
|
||||||
|
|||||||
94
task1/scripts/plot_task1_results.py
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
|
||||||
|
N_VALUES = [1000, 1500, 2000, 2500, 3000, 3500]
|
||||||
|
|
||||||
|
CUDA_TIME_MS = [5.0083, 7.4931, 8.3563, 10.4837, 12.6709, 14.8861]
|
||||||
|
INTEL_TIME_S = [0.010, 0.020, 0.028, 0.042, 0.069, 0.100]
|
||||||
|
INTEL_TIME_MS = [value * 1000.0 for value in INTEL_TIME_S]
|
||||||
|
|
||||||
|
CUDA_GFLOPS = [133.114, 300.277, 638.244, 993.608, 1420.573, 1920.138]
|
||||||
|
INTEL_GFLOPS = [67.331, 114.360, 193.276, 250.731, 260.451, 286.264]
|
||||||
|
|
||||||
|
|
||||||
|
def configure_plot() -> None:
|
||||||
|
plt.style.use("seaborn-v0_8-whitegrid")
|
||||||
|
plt.rcParams["figure.figsize"] = (8.4, 5.2)
|
||||||
|
plt.rcParams["figure.dpi"] = 140
|
||||||
|
plt.rcParams["savefig.dpi"] = 220
|
||||||
|
plt.rcParams["font.size"] = 11
|
||||||
|
plt.rcParams["axes.labelsize"] = 11
|
||||||
|
plt.rcParams["axes.titlesize"] = 12
|
||||||
|
plt.rcParams["legend.fontsize"] = 10
|
||||||
|
|
||||||
|
|
||||||
|
def plot_time(output_path: Path) -> None:
|
||||||
|
plt.figure()
|
||||||
|
plt.plot(
|
||||||
|
N_VALUES,
|
||||||
|
INTEL_TIME_MS,
|
||||||
|
marker="o",
|
||||||
|
linewidth=2.2,
|
||||||
|
color="#1f77b4",
|
||||||
|
label="Intel LINPACK",
|
||||||
|
)
|
||||||
|
plt.plot(
|
||||||
|
N_VALUES,
|
||||||
|
CUDA_TIME_MS,
|
||||||
|
marker="s",
|
||||||
|
linewidth=2.2,
|
||||||
|
color="#d62728",
|
||||||
|
label="CUDA-реализация",
|
||||||
|
)
|
||||||
|
plt.xlabel("Размер матрицы N")
|
||||||
|
plt.ylabel("Время решения, мс")
|
||||||
|
plt.title("Сравнение времени решения")
|
||||||
|
plt.legend(loc="upper left")
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig(output_path, bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
|
||||||
|
|
||||||
|
def plot_gflops(output_path: Path) -> None:
|
||||||
|
plt.figure()
|
||||||
|
plt.plot(
|
||||||
|
N_VALUES,
|
||||||
|
INTEL_GFLOPS,
|
||||||
|
marker="o",
|
||||||
|
linewidth=2.2,
|
||||||
|
color="#1f77b4",
|
||||||
|
label="Intel LINPACK",
|
||||||
|
)
|
||||||
|
plt.plot(
|
||||||
|
N_VALUES,
|
||||||
|
CUDA_GFLOPS,
|
||||||
|
marker="s",
|
||||||
|
linewidth=2.2,
|
||||||
|
color="#d62728",
|
||||||
|
label="CUDA-реализация",
|
||||||
|
)
|
||||||
|
plt.xlabel("Размер матрицы N")
|
||||||
|
plt.ylabel("Производительность, GFLOPS")
|
||||||
|
plt.title("Сравнение производительности")
|
||||||
|
plt.legend(loc="upper left")
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.savefig(output_path, bbox_inches="tight")
|
||||||
|
plt.close()
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
configure_plot()
|
||||||
|
|
||||||
|
output_dir = Path(__file__).resolve().parents[2] / "report" / "img"
|
||||||
|
output_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
plot_time(output_dir / "task1-time-comparison.png")
|
||||||
|
plot_gflops(output_dir / "task1-gflops-comparison.png")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
15
task2.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# задание 2
|
||||||
|
|
||||||
|
## Постановка задачи
|
||||||
|
В рамках данной лабораторной работы необходимо решить следующие задачи:
|
||||||
|
1. Изучить технологию межпроцессного взаимодействия MPI.
|
||||||
|
2. Разработать параллельный масштабируемый алгоритм для решения вычислительной задачи.
|
||||||
|
3. Реализовать разработанный алгоритм с использованием технологии MPI.
|
||||||
|
4. Исследовать производительность реализации на 1, 2 и 4-х узлах СКЦ .Политехнический..
|
||||||
|
5. Сравнить время решения вычислительной задачи с использованием MPI и
|
||||||
|
CUDA.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Рис. 5: Зависимость времени вычисления от размера полигона P
|
||||||