Skip to content

Added report - #14

Open
rmnsmnsk wants to merge 17 commits into
gsvgit:mainfrom
rmnsmnsk:main
Open

Added report#14
rmnsmnsk wants to merge 17 commits into
gsvgit:mainfrom
rmnsmnsk:main

Conversation

@rmnsmnsk

@rmnsmnsk rmnsmnsk commented Jun 7, 2026

Copy link
Copy Markdown

No description provided.


\textbf{Целью работы является} сравнительный анализ производительности двух подходов к хранению и обработке разреженных матриц: собственной реализации на языке C с использованием формата COO (Coordinate List) и эталонной реализации на языке F\# с использованием иерархической структуры QuadTree (библиотека \texttt{QTreeFSharp}\footnote{URL: \url{https://github.com/Lamagraph/QTreeFSharp} (дата обращения: май 2026)}).

Результаты работы необходимы для обоснования выбора архитектурных решений при разработке высокопроизводительных вычислительных систем. Для конечных пользователей (разработчиков численных методов, инженеров по оптимизации) это полезно пониманием компромиссов между простотой реализации и производительностью. В выполнении работы заинтересована кафедра системного программирования.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну, при сравнении F# и C Вы вряд ли что-то обосновать сможете....


\section{Описание предлагаемого решения}

Сравнение проводилось между двумя подходами к хранению разреженных матриц:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

При таком оформлении тут точка в конце. Воообще, с точкой --- самый безопасный вариант.

\begin{itemize}
\item \textbf{C (COO Format)}: собственная реализация на языке C, использующая формат (COO) с тремя плоскими массивами (индексы строк, индексы столбцов, значения). Управление памятью осуществляется вручную через \texttt{malloc}/\texttt{free}, аллокация производится единовременно при создании матрицы. Алгоритмы оптимизированы под последовательный доступ к памяти.

\item \textbf{F\# (QuadTree)}: эталонная библиотека \texttt{QTreeFSharp}, использующая иерархическую структуру QuadTree. Операции реализованы рекурсивно, управление памятью автоматическое (Garbage Collector), что приводит к созданию множества временных объектов в процессе вычислений.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сам по себе GC (да и автоматическое управление в целом) к созданию множества объектов не приводит.

\item \textbf{F\# (QuadTree)}: эталонная библиотека \texttt{QTreeFSharp}, использующая иерархическую структуру QuadTree. Операции реализованы рекурсивно, управление памятью автоматическое (Garbage Collector), что приводит к созданию множества временных объектов в процессе вычислений.
\end{itemize}

Реализация решения осуществлялась с использованием языка C (стандарт C11, компилятор GCC 13), языка F\# (.NET 8.0), системы сборки CMake для C-части и .NET SDK для F\#-части. Для автоматизации бенчмарков использовались скрипты на Python 3.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эээ. Ну на F# Вы же ничего не реализовывали.... Вроде...

\item \textbf{Инструменты замеров}:
\begin{itemize}
\item C: POSIX-таймер \texttt{gettimeofday()} с точностью до микросекунд, усреднение по 5 запускам.
\item F\#: для малых размеров (10--20) --- библиотека \texttt{BenchmarkDotNet} для получения статистики аллокаций и учёта влияния GC; для больших размеров (100--2000) --- \texttt{System.Diagnostics.Stopwatch}, так как код завершается с ошибкой до начала итераций BDN.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хто такой BDN? Не надо странных сокращений.


\begin{enumerate}
\item C-реализация опережает F\# в \textbf{5--2000 раз} на идентичных данных в зависимости от операции и размера матрицы.
\item Реализация на F\# создаёт тысячи временных объектов в куче (аллокации 62--403 КБ), что генерирует нагрузку на GC (Gen0: 10--65 на 1000 операций) и приводит к непредсказуемым паузам.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А непредсказуемые паузы точно бывают? Сборщики мусора разные встречаются...


\section{Заключение}

В ходе выполнения работы получены следующие результаты:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Точка.


\begin{itemize}
\item Реализована собственная библиотека разреженной линейной алгебры на языке C в формате COO с операциями умножения матриц и матрицы на вектор.
\item Проведён сравнительный бенчмаркинг с эталонной реализацией на F\# (QuadTree) на синтетических и реальных матрицах.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Жаргон.

\begin{itemize}
\item Реализована собственная библиотека разреженной линейной алгебры на языке C в формате COO с операциями умножения матриц и матрицы на вектор.
\item Проведён сравнительный бенчмаркинг с эталонной реализацией на F\# (QuadTree) на синтетических и реальных матрицах.
\item Продемонстрировано преимущество плоских форматов хранения: ускорение в 5--2000 раз, отсутствие проблем с переполнением стека, предсказуемое потребление памяти.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет.

\item Исследована проблема Stack Overflow в эталонной библиотеке, даны рекомендации по диагностике различий в поведении кода в разных средах.
\end{itemize}

Материалы, иллюстрирующие выполнение работы, размещены по адресу: \url{https://github.com/rmnsmnsk/implementation-of-linear-algebra-primitives} (исходный код, скрипты бенчмарков, README).

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI сгенерированный нейронкой в порядок приведите. А то там там такого позора понаписано...

@gsvgit

gsvgit commented Jun 12, 2026

Copy link
Copy Markdown
Owner

Ну да. И конфликты разрешите.

@gsvgit gsvgit left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну и вёрска перечислений. Жду улучшения промта.


Умножение матрицы на вектор выполняется с использованием плотного промежуточного массива: вектор разворачивается в плотную форму, затем выполняется накопление результатов в плотном массиве, который в конце преобразуется обратно в разреженный формат COO. Аналогичным образом реализовано умножение вектора-строки на матрицу.

Такой подход обеспечивает простоту реализации и наглядность кода, однако сопровождается значительными накладными расходами: квадратичная сортировка, линейный поиск при добавлении элементов и многократные преобразования между разреженным и плотным представлениями создают дополнительную вычислительную нагрузку.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а за n logn не умеете сортировать?

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А добавление в неупорядоченный что ли? Не понятно, откуда линейнй поиск. Может таки тогда словарь использовать?

\label{tab:accel_vec}
\begin{tabular}{lrrr}
\toprule
Матрица & NNZ & Плотность, \% & Ускорение, раз \\

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А зачем столько таблиц с кучей дублирующейся информации?


\begin{itemize}

\item при умножении матриц в COO выполняется предварительная сортировка элементов для упорядочивания данных, что само по себе требует дополнительного времени. Затем происходит полный перебор всех пар ненулевых элементов обеих матриц. Для каждого совпадения индексов выполняется линейный поиск по уже накопленному массиву результата, чтобы проверить, не добавлялся ли уже элемент с такими координатами. По мере заполнения результата время этого поиска возрастает. CSparse использует специализированные алгоритмы, которые избегают таких линейных поисков за счёт эффективной структуры данных.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"эффективной структуры данных" Какой? А что Вам помешало её применить?


\item при умножении матриц в COO выполняется предварительная сортировка элементов для упорядочивания данных, что само по себе требует дополнительного времени. Затем происходит полный перебор всех пар ненулевых элементов обеих матриц. Для каждого совпадения индексов выполняется линейный поиск по уже накопленному массиву результата, чтобы проверить, не добавлялся ли уже элемент с такими координатами. По мере заполнения результата время этого поиска возрастает. CSparse использует специализированные алгоритмы, которые избегают таких линейных поисков за счёт эффективной структуры данных.

\item при умножении матрицы на вектор в COO разреженный вектор сначала разворачивается в плотный массив, затем создаётся временный массив для накопления результата, который в конце снова упаковывается в разреженный формат COO. Эти многократные преобразования создают существенные накладные расходы.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так может стоит этого избежать?


\begin{itemize}

\item при умножении матриц в COO выполняется предварительная сортировка элементов для упорядочивания данных, что само по себе требует дополнительного времени. Затем происходит полный перебор всех пар ненулевых элементов обеих матриц. Для каждого совпадения индексов выполняется линейный поиск по уже накопленному массиву результата, чтобы проверить, не добавлялся ли уже элемент с такими координатами. По мере заполнения результата время этого поиска возрастает. CSparse использует специализированные алгоритмы, которые избегают таких линейных поисков за счёт эффективной структуры данных.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем ещё раз описывать алгоритм?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants