diff --git a/Ivan_Shamanaev/Ivan_Shamanaev_report.tex b/Ivan_Shamanaev/Ivan_Shamanaev_report.tex new file mode 100644 index 0000000..b61f5b8 --- /dev/null +++ b/Ivan_Shamanaev/Ivan_Shamanaev_report.tex @@ -0,0 +1,355 @@ +% Данный файл распространяетсяя под лицензией CC BY 4.0. Текст лицензии размещён на https://creativecommons.org/licenses/by/4.0/ +% (c) Кафедра системного программирования, 2025 + +\documentclass[a4paper]{article} + +\usepackage[a4paper, top=8mm, bottom=8mm, left=8mm, right=8mm]{geometry} + +\usepackage{polyglossia} +\setdefaultlanguage[babelshorthands=true]{russian} +\setotherlanguage{english} + +\usepackage{fontspec} +\setmainfont{FreeSerif} +\newfontfamily{\russianfonttt}[Scale=0.7]{DejaVuSansMono} + +\usepackage[tiny, compact]{titlesec} + +\usepackage{titling} +\setlength{\droptitle}{-1cm} +\pretitle{\begin{center}\begin{bfseries}\Large} +\posttitle{\par\end{bfseries}\end{center}} +\preauthor{\begin{center}\normalsize} +\postauthor{\par\end{center}\vspace{-1.8cm}} + +\usepackage{hyperref} +\usepackage{bookmark} +\usepackage{csquotes} +\usepackage{booktabs} +\usepackage{longtable} +\usepackage{multirow} + +\title{Реализация алгоритмов поиска кратчайшего пути в графе на основе GraphBLAS API} + +\author{Шаманаев Иван Сергеевич} + +\date{} + +\begin{document} + +\maketitle + +\begin{flushright} + Группа: \emph{2025.Б72-мм} + + Кафедра: \emph{кафедра системного программирования} + + Научный руководитель: \emph{Григорьев Семён Вячеславович,}\\ + \emph{доцент кафедры системного программирования,}\\ + \emph{кандидат физико-математических наук} + + Номер семестра практики: \emph{2} +\end{flushright} + + +\section{Постановка задачи} +Работа выполнялась в рамках учебной ознакомительной практики и направлена на знакомство с GraphBLAS API (стандарт API для графовых операций через линейную алгебру) и сравнительный анализ производительности реализаций алгоритмов поиска кратчайшего пути на языке C. + +\textbf{Целью работы является} реализация алгоритмов поиска кратчайшего пути в графе на основе GraphBLAS API, экспериментальное сравнение собственных реализаций между собой, а также с готовой реализацией из библиотеки LAGraph. + +Для достижения поставленной цели были решены следующие задачи: +\begin{itemize} + \item выполнить обзор подходов к интеграции GraphBLAS API на языке C; + \item реализовать алгоритмы поиска кратчайшего пути с использованием SuiteSparse:GraphBLAS; + \item провести замеры производительности разработанных решений и готовых реализаций из LAGraph. +\end{itemize} +\section{Описание предлагаемого решения} + +Проект представляет собой сравнительное тестирование для анализа трёх алгоритмов SSSP (Single-Source Shortest Path~--- поиск кратчайшего пути из одной вершины), реализованных с использованием библиотек SuiteSparse:GraphBLAS и LAGraph на языке C.\footnote{URL: \url{https://github.com/DrTimothyAldenDavis/GraphBLAS} (дата обращения: 30.07.2026).}\footnote{URL: \url{https://github.com/DrTimothyAldenDavis/LAGraph} (дата обращения: 30.07.2026).} + +Алгоритм \textbf{Delta-Stepping} реализован через готовую функцию библиотеки LAGraph +\texttt{LAGr\_SingleSourceShortestPath} с параметром $\delta$, определяющим ширину +«шага» для группировки вершин. Не поддерживает отрицательные веса рёбер. + +Алгоритм \textbf{Algebraic Bellman-Ford} реализован на чистом GraphBLAS с +использованием min-plus полукольца: моноид \texttt{GrB\_MIN\_FP64} и операция +\texttt{GrB\_PLUS\_FP64}. За $n-1$ итерацию выполняется умножение вектора расстояний +на матрицу смежности через \texttt{GrB\_vxm}. Поддерживает отрицательные веса +(при отсутствии отрицательных циклов). + +Алгоритм \textbf{Дейкстры} реализован на чистом GraphBLAS с самописной приоритетной +очередью (бинарная куча). На каждом шаге выбирается вершина с минимальным расстоянием, +после чего выполняется релаксация смежных рёбер через \texttt{GrB\_vxm}. +Только для неотрицательных весов. + +\section{Эксперименты} + +Для сравнения производительности реализованных алгоритмов были проведены следующие испытания. + +\textbf{Среда выполнения.} +Сборка и тестирование выполнялись на ноутбуке Asus ROG Flow x16 с процессором Intel Core i9-13900H и 32~ГБ оперативной памяти частотой 4800~МГц. +При замерах для более стабильного результата выполнялось по 40 запусков для каждого графа; первые 10 считались прогревочными и не учитывались в результатах. Во время замеров был включён производительный режим, фоновые приложения отключены. Питание ноутбука было от сети с полным зарядом. +Окружения, в которых производилось тестирование производительности: +\begin{itemize} + \item Fedora 43; + \item MSYS2 / MinGW64 под Windows. +\end{itemize} + + +Для каждой платформы требуется установка SuiteSparse GraphBLAS 10.3.1 и LAGraph 1.2.1. + +Характеристики графов, использованных для тестирования, приведены в +таблице~\ref{tab:datasets}. Все графы взяты из коллекции SuiteSparse Matrix +Collection.\footnote{URL: \url{https://sparse.tamu.edu} (дата обращения: 30.07.2026).} + +\begin{table}[h!] + \centering + \caption{Используемые наборы данных} + \label{tab:datasets} + \begin{tabular}{lrr} + \toprule + \textbf{Граф} & \textbf{Вершины} & \textbf{Рёбра} \\ + \midrule + amazon0601 & 403\,394 & 3\,387\,388 \\ + com-Amazon & 334\,863 & 925\,872 \\ + com-Orkut & 3\,072\,441 & 117\,185\,083 \\ + NLR & 4\,163\,763 & 12\,487\,976 \\ + roadNet-CA & 1\,971\,281 & 2\,766\,607 \\ + web-Google & 916\,428 & 5\,105\,039 \\ + wiki-topcats & 1\,791\,489 & 28\,511\,807 \\ + sinc18 & 16\,428 & 973\,826 \\ + \bottomrule + \end{tabular} +\end{table} + +\textbf{Сравнительное тестирование.} Основная программа (\texttt{bin/sssp\_benchmark}) последовательно +запускает все три алгоритма на загруженном графе, замеряя время выполнения каждого +через \texttt{LAGraph\_WallClockTime()}. Для Delta-Stepping варьировался параметр $\delta$ +(0.5, 1, 2, 3, 5, 10). Диапазон выбран так, чтобы покрыть малые значения +(при которых алгоритм приближается к обычному Bellman-Ford) и большие +(при которых увеличиваются размеры «шагов», но снижается точность группировки). +Значения, кратные 1, удобны для интерпретации; 0.5 добавлено для проверки +поведения при дробном шаге; 10 выбрано как верхняя граница, после которой +выигрыш в производительности на тестовых графах перестаёт расти. +Для каждого графа и каждого алгоритма выполнялось 30 замеров, результаты +усреднялись. Для каждого набора замеров вычислялось стандартное отклонение +(Std), показывающее разброс времени выполнения относительно среднего. +В столбце «Время (мс)» после $\pm$ указан 95~\% доверительный интервал +среднего (95~\% CI). + +Для графов с отрицательными весами рёбер (sinc18) Delta-Stepping (LAGraph) и Dijkstra +автоматически пропускаются, выполняется только Algebraic Bellman-Ford, +поддерживающий такие графы. + +\textbf{Валидация результатов.} После выполнения всех алгоритмов производится +попарное сравнение векторов расстояний с погрешностью $10^{-6}$ +(\texttt{VALIDATOR\_EPSILON}). Если результаты расходятся, выводится +предупреждение. Для графа без отрицательных весов все три алгоритма должны +давать одинаковые расстояния. + +Результаты замеров на Linux (Fedora~43) представлены в таблице~\ref{tab:bench-linux}, +на Windows~(MSYS2 / MinGW64)~--- в таблице~\ref{tab:bench-win}. + + +\begin{table}[h!] +\centering +\begin{minipage}{0.48\textwidth} +\centering +\footnotesize +\caption{Результаты тестирования (Linux, Fedora~43)} +\label{tab:bench-linux} +\begin{tabular}{llcc} +\toprule +\textbf{Граф} & \textbf{Конфигурация} & \textbf{Время (мс)} & \textbf{Std (\%)} \\ +\midrule +\multirow{8}{*}{amazon0601} + & Alg. BF & $58.40 \pm 0.41$ & 1.90 \\ + & Dijkstra & $1383.84 \pm 2.66$ & 0.52 \\ + & DS $\delta=0.5$ & $37.09 \pm 0.20$ & 1.46 \\ + & DS $\delta=1$ & $37.74 \pm 0.30$ & 2.12 \\ + & DS $\delta=2$ & $48.00 \pm 0.31$ & 1.73 \\ + & DS $\delta=3$ & $54.79 \pm 0.53$ & 2.57 \\ + & DS $\delta=5$ & $53.87 \pm 0.45$ & 2.23 \\ + & DS $\delta=10$ & $51.68 \pm 0.29$ & 1.51 \\ +\midrule +\multirow{8}{*}{com-Amazon} + & Alg. BF & $48.21 \pm 0.46$ & 2.57 \\ + & Dijkstra & $886.93 \pm 10.83$ & 3.27 \\ + & DS $\delta=0.5$ & $33.97 \pm 0.37$ & 2.94 \\ + & DS $\delta=1$ & $37.60 \pm 0.31$ & 2.23 \\ + & DS $\delta=2$ & $43.55 \pm 0.29$ & 1.81 \\ + & DS $\delta=3$ & $47.32 \pm 0.24$ & 1.37 \\ + & DS $\delta=5$ & $49.57 \pm 0.51$ & 2.74 \\ + & DS $\delta=10$ & $47.36 \pm 0.31$ & 1.77 \\ +\midrule +\multirow{8}{*}{com-Orkut} + & Alg. BF & $798.47 \pm 1.36$ & 0.46 \\ + & Dijkstra & $20240.79 \pm 163.35$ & 2.16 \\ + & DS $\delta=0.5$ & $125.05 \pm 0.57$ & 1.23 \\ + & DS $\delta=1$ & $128.57 \pm 0.92$ & 1.91 \\ + & DS $\delta=2$ & $137.64 \pm 1.12$ & 2.18 \\ + & DS $\delta=3$ & $140.85 \pm 0.85$ & 1.62 \\ + & DS $\delta=5$ & $113.95 \pm 0.88$ & 2.08 \\ + & DS $\delta=10$ & $95.62 \pm 1.10$ & 3.07 \\ +\midrule +\multirow{8}{*}{NLR} + & Alg. BF & $14217.48 \pm 9.95$ & 0.19 \\ + & Dijkstra & $22731.97 \pm 144.84$ & 1.71 \\ + & DS $\delta=0.5$ & $1315.01 \pm 9.42$ & 1.92 \\ + & DS $\delta=1$ & $1563.72 \pm 4.75$ & 0.81 \\ + & DS $\delta=2$ & $1455.72 \pm 6.63$ & 1.22 \\ + & DS $\delta=3$ & $1410.03 \pm 2.08$ & 0.40 \\ + & DS $\delta=5$ & $1360.90 \pm 1.71$ & 0.34 \\ + & DS $\delta=10$ & $1325.95 \pm 1.24$ & 0.25 \\ +\midrule +\multirow{8}{*}{roadNet-CA} + & Alg. BF & $277.17 \pm 1.41$ & 1.36 \\ + & Dijkstra & $3894.41 \pm 39.73$ & 2.73 \\ + & DS $\delta=0.5$ & $50.53 \pm 0.73$ & 3.86 \\ + & DS $\delta=1$ & $47.32 \pm 0.44$ & 2.49 \\ + & DS $\delta=2$ & $43.33 \pm 0.72$ & 4.43 \\ + & DS $\delta=3$ & $41.48 \pm 0.52$ & 3.38 \\ + & DS $\delta=5$ & $38.69 \pm 0.43$ & 3.00 \\ + & DS $\delta=10$ & $35.74 \pm 0.24$ & 1.79 \\ +\midrule +\multirow{8}{*}{web-Google} + & Alg. BF & $108.28 \pm 0.74$ & 1.83 \\ + & Dijkstra & $2616.09 \pm 22.83$ & 2.34 \\ + & DS $\delta=0.5$ & $49.21 \pm 0.50$ & 2.74 \\ + & DS $\delta=1$ & $51.10 \pm 0.48$ & 2.50 \\ + & DS $\delta=2$ & $65.87 \pm 0.56$ & 2.29 \\ + & DS $\delta=3$ & $73.14 \pm 0.47$ & 1.72 \\ + & DS $\delta=5$ & $75.51 \pm 0.44$ & 1.55 \\ + & DS $\delta=10$ & $72.88 \pm 0.41$ & 1.50 \\ +\midrule +\multirow{8}{*}{wiki-topcats} + & Alg. BF & $3194.51 \pm 11.61$ & 0.97 \\ + & Dijkstra & $8674.19 \pm 73.08$ & 2.26 \\ + & DS $\delta=0.5$ & $114.34 \pm 0.69$ & 1.62 \\ + & DS $\delta=1$ & $95.07 \pm 0.73$ & 2.06 \\ + & DS $\delta=2$ & $95.20 \pm 0.80$ & 2.25 \\ + & DS $\delta=3$ & $98.49 \pm 0.58$ & 1.57 \\ + & DS $\delta=5$ & $91.69 \pm 0.70$ & 2.05 \\ + & DS $\delta=10$ & $63.73 \pm 1.03$ & 4.33 \\ +\midrule +\multirow{1}{*}{sinc18$^*$} + & Alg. BF & $3495.55 \pm 34.33$ & 2.63 \\ +\bottomrule +\end{tabular} +\smallskip + +\noindent\emph{$^*$~--- sinc18 содержит отрицательные веса, поэтому Dijkstra и Delta-Stepping не запускались.} +\end{minipage} +\hfill +\begin{minipage}{0.48\textwidth} +\centering +\footnotesize +\caption{Результаты тестирования (Windows, MSYS2 / MinGW64)} +\label{tab:bench-win} +\begin{tabular}{llcc} +\toprule +\textbf{Граф} & \textbf{Конфигурация} & \textbf{Время (мс)} & \textbf{Std (\%)} \\ +\midrule +\multirow{8}{*}{amazon0601} + & Alg. BF & $221.67 \pm 14.39$ & 17.39 \\ + & Dijkstra & $7763.40 \pm 15.88$ & 0.55 \\ + & DS $\delta=0.5$ & $86.80 \pm 3.10$ & 9.56 \\ + & DS $\delta=1$ & $85.80 \pm 2.11$ & 6.60 \\ + & DS $\delta=2$ & $91.90 \pm 2.36$ & 6.89 \\ + & DS $\delta=3$ & $93.23 \pm 2.29$ & 6.58 \\ + & DS $\delta=5$ & $92.77 \pm 2.74$ & 7.92 \\ + & DS $\delta=10$ & $83.93 \pm 1.34$ & 4.29 \\ +\midrule +\multirow{8}{*}{com-Amazon} + & Alg. BF & $134.33 \pm 0.92$ & 1.84 \\ + & Dijkstra & $4920.80 \pm 30.95$ & 1.68 \\ + & DS $\delta=0.5$ & $74.63 \pm 2.21$ & 7.95 \\ + & DS $\delta=1$ & $76.40 \pm 2.12$ & 7.45 \\ + & DS $\delta=2$ & $75.30 \pm 1.88$ & 6.68 \\ + & DS $\delta=3$ & $78.80 \pm 2.70$ & 9.16 \\ + & DS $\delta=5$ & $76.67 \pm 1.28$ & 4.47 \\ + & DS $\delta=10$ & $71.70 \pm 2.27$ & 8.49 \\ +\midrule +\multirow{8}{*}{com-Orkut} + & Alg. BF & $966.30 \pm 5.14$ & 1.43 \\ + & Dijkstra & $70873.00 \pm 1494.83$ & 5.65 \\ + & DS $\delta=0.5$ & $224.77 \pm 2.08$ & 2.48 \\ + & DS $\delta=1$ & $233.83 \pm 4.19$ & 4.80 \\ + & DS $\delta=2$ & $232.03 \pm 1.84$ & 2.12 \\ + & DS $\delta=3$ & $231.13 \pm 1.16$ & 1.35 \\ + & DS $\delta=5$ & $217.03 \pm 3.29$ & 4.05 \\ + & DS $\delta=10$ & $178.23 \pm 1.84$ & 2.77 \\ +\midrule +\multirow{8}{*}{NLR} + & Alg. BF & $30267.10 \pm 108.68$ & 0.96 \\ + & Dijkstra & $82856.93 \pm 319.52$ & 1.03 \\ + & DS $\delta=0.5$ & $1886.17 \pm 19.87$ & 2.82 \\ + & DS $\delta=1$ & $2017.40 \pm 28.14$ & 3.74 \\ + & DS $\delta=2$ & $1714.60 \pm 17.81$ & 2.78 \\ + & DS $\delta=3$ & $1623.07 \pm 13.16$ & 2.17 \\ + & DS $\delta=5$ & $1522.53 \pm 12.50$ & 2.20 \\ + & DS $\delta=10$ & $1488.80 \pm 12.80$ & 2.30 \\ +\midrule +\multirow{8}{*}{roadNet-CA} + & Alg. BF & $966.47 \pm 7.76$ & 2.15 \\ + & Dijkstra & $7377.90 \pm 81.33$ & 2.95 \\ + & DS $\delta=0.5$ & $135.17 \pm 0.68$ & 1.35 \\ + & DS $\delta=1$ & $112.47 \pm 1.00$ & 2.38 \\ + & DS $\delta=2$ & $92.63 \pm 1.92$ & 5.56 \\ + & DS $\delta=3$ & $87.73 \pm 2.37$ & 7.24 \\ + & DS $\delta=5$ & $71.50 \pm 1.09$ & 4.10 \\ + & DS $\delta=10$ & $64.80 \pm 1.35$ & 5.57 \\ +\midrule +\multirow{8}{*}{web-Google} + & Alg. BF & $277.60 \pm 4.99$ & 4.82 \\ + & Dijkstra & $11998.30 \pm 22.37$ & 0.50 \\ + & DS $\delta=0.5$ & $120.97 \pm 1.59$ & 3.51 \\ + & DS $\delta=1$ & $121.93 \pm 1.59$ & 3.50 \\ + & DS $\delta=2$ & $129.07 \pm 1.15$ & 2.38 \\ + & DS $\delta=3$ & $131.27 \pm 0.98$ & 2.00 \\ + & DS $\delta=5$ & $130.07 \pm 1.91$ & 3.94 \\ + & DS $\delta=10$ & $120.77 \pm 3.80$ & 8.44 \\ +\midrule +\multirow{8}{*}{wiki-topcats} + & Alg. BF & $7509.20 \pm 81.29$ & 2.90 \\ + & Dijkstra & $36262.53 \pm 102.93$ & 0.76 \\ + & DS $\delta=0.5$ & $299.27 \pm 1.34$ & 1.20 \\ + & DS $\delta=1$ & $265.47 \pm 3.26$ & 3.29 \\ + & DS $\delta=2$ & $250.80 \pm 7.24$ & 7.73 \\ + & DS $\delta=3$ & $250.97 \pm 1.76$ & 1.88 \\ + & DS $\delta=5$ & $227.73 \pm 2.57$ & 3.02 \\ + & DS $\delta=10$ & $169.43 \pm 1.56$ & 2.47 \\ +\midrule +\multirow{1}{*}{sinc18$^*$} + & Alg. BF & $7845.23 \pm 246.55$ & 8.42 \\ +\bottomrule +\end{tabular} +\smallskip + +\noindent\emph{$^*$~--- sinc18 содержит отрицательные веса, поэтому Dijkstra и Delta-Stepping не запускались.} +\end{minipage} +\end{table} + +Из результатов видно, что Delta-Stepping (DS) стабильно превосходит Algebraic Bellman-Ford +на всех графах, особенно на крупных (NLR~--- в ~10 раз, wiki-topcats~--- в ~30--50 раз). +Dijkstra на чистом GraphBLAS с самописной очередью значительно уступает обоим +алгоритмам, что связано с накладными расходами на извлечение элементов из +GraphBLAS-векторов на каждой итерации. Оптимальное значение $\delta$ зависит от +структуры графа: для разреженных графов (roadNet-CA) лучше большие $\delta$, +для плотных (com-Orkut)~--- малые. + +\section{Заключение} + +В ходе выполнения работы получены следующие результаты: + +\begin{itemize} + \item выполнен обзор подходов к интеграции GraphBLAS API на языке C, выбрана библиотека SuiteSparse:GraphBLAS; + \item реализованы алгоритмы поиска кратчайшего пути (Algebraic Bellman-Ford, Дейкстра) с использованием SuiteSparse:GraphBLAS; + \item проведены замеры производительности разработанных решений и готовых реализаций из LAGraph: Algebraic Bellman-Ford в большинстве случаев уступает по производительности Delta-Stepping, реализованному в LAGraph, и сильно превосходит алгоритм Дейкстры. +\end{itemize} + +Репозиторий с реализацией: \url{https://github.com/IvRevver/graph_blas_sssp}. + +Скрипты для подготовки окружения и запуска замеров, инструкции по сборке и воспроизведению результатов представлены в файле \texttt{README.md} репозитория. + +\end{document} \ No newline at end of file diff --git a/main.tex b/main.tex index ee98d5e..ddc2508 100644 --- a/main.tex +++ b/main.tex @@ -64,4 +64,7 @@ \includepdf[pages=-, addtotoc={1, section, 1, {Горбузова Мария Романовна, Реализация свёртки изображений}, gorbuzova_maria}] {Maria_Gorbuzova/Maria_Gorbuzova_report.pdf} +\includepdf[pages=-, + addtotoc={1, section, 1, {Шаманаев Иван Сергеевич, Реализация алгоритмов поиска кратчайшего пути в графе на основе GraphBLAS API}, shamanaev_ivan}] +{Ivan_Shamanaev/Ivan_Shamanaev_report.pdf} \end{document}