Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
355 changes: 355 additions & 0 deletions Ivan_Shamanaev/Ivan_Shamanaev_report.tex
Original file line number Diff line number Diff line change
@@ -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}
Loading