Added report - #14
Conversation
|
|
||
| \textbf{Целью работы является} сравнительный анализ производительности двух подходов к хранению и обработке разреженных матриц: собственной реализации на языке C с использованием формата COO (Coordinate List) и эталонной реализации на языке F\# с использованием иерархической структуры QuadTree (библиотека \texttt{QTreeFSharp}\footnote{URL: \url{https://github.com/Lamagraph/QTreeFSharp} (дата обращения: май 2026)}). | ||
|
|
||
| Результаты работы необходимы для обоснования выбора архитектурных решений при разработке высокопроизводительных вычислительных систем. Для конечных пользователей (разработчиков численных методов, инженеров по оптимизации) это полезно пониманием компромиссов между простотой реализации и производительностью. В выполнении работы заинтересована кафедра системного программирования. |
There was a problem hiding this comment.
Ну, при сравнении F# и C Вы вряд ли что-то обосновать сможете....
|
|
||
| \section{Описание предлагаемого решения} | ||
|
|
||
| Сравнение проводилось между двумя подходами к хранению разреженных матриц: |
There was a problem hiding this comment.
При таком оформлении тут точка в конце. Воообще, с точкой --- самый безопасный вариант.
| \begin{itemize} | ||
| \item \textbf{C (COO Format)}: собственная реализация на языке C, использующая формат (COO) с тремя плоскими массивами (индексы строк, индексы столбцов, значения). Управление памятью осуществляется вручную через \texttt{malloc}/\texttt{free}, аллокация производится единовременно при создании матрицы. Алгоритмы оптимизированы под последовательный доступ к памяти. | ||
|
|
||
| \item \textbf{F\# (QuadTree)}: эталонная библиотека \texttt{QTreeFSharp}, использующая иерархическую структуру QuadTree. Операции реализованы рекурсивно, управление памятью автоматическое (Garbage Collector), что приводит к созданию множества временных объектов в процессе вычислений. |
There was a problem hiding this comment.
Сам по себе 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. |
There was a problem hiding this comment.
Эээ. Ну на 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. |
There was a problem hiding this comment.
Хто такой BDN? Не надо странных сокращений.
|
|
||
| \begin{enumerate} | ||
| \item C-реализация опережает F\# в \textbf{5--2000 раз} на идентичных данных в зависимости от операции и размера матрицы. | ||
| \item Реализация на F\# создаёт тысячи временных объектов в куче (аллокации 62--403 КБ), что генерирует нагрузку на GC (Gen0: 10--65 на 1000 операций) и приводит к непредсказуемым паузам. |
There was a problem hiding this comment.
А непредсказуемые паузы точно бывают? Сборщики мусора разные встречаются...
|
|
||
| \section{Заключение} | ||
|
|
||
| В ходе выполнения работы получены следующие результаты: |
|
|
||
| \begin{itemize} | ||
| \item Реализована собственная библиотека разреженной линейной алгебры на языке C в формате COO с операциями умножения матриц и матрицы на вектор. | ||
| \item Проведён сравнительный бенчмаркинг с эталонной реализацией на F\# (QuadTree) на синтетических и реальных матрицах. |
| \begin{itemize} | ||
| \item Реализована собственная библиотека разреженной линейной алгебры на языке C в формате COO с операциями умножения матриц и матрицы на вектор. | ||
| \item Проведён сравнительный бенчмаркинг с эталонной реализацией на F\# (QuadTree) на синтетических и реальных матрицах. | ||
| \item Продемонстрировано преимущество плоских форматов хранения: ускорение в 5--2000 раз, отсутствие проблем с переполнением стека, предсказуемое потребление памяти. |
| \item Исследована проблема Stack Overflow в эталонной библиотеке, даны рекомендации по диагностике различий в поведении кода в разных средах. | ||
| \end{itemize} | ||
|
|
||
| Материалы, иллюстрирующие выполнение работы, размещены по адресу: \url{https://github.com/rmnsmnsk/implementation-of-linear-algebra-primitives} (исходный код, скрипты бенчмарков, README). |
There was a problem hiding this comment.
CI сгенерированный нейронкой в порядок приведите. А то там там такого позора понаписано...
|
Ну да. И конфликты разрешите. |
gsvgit
left a comment
There was a problem hiding this comment.
Ну и вёрска перечислений. Жду улучшения промта.
|
|
||
| Умножение матрицы на вектор выполняется с использованием плотного промежуточного массива: вектор разворачивается в плотную форму, затем выполняется накопление результатов в плотном массиве, который в конце преобразуется обратно в разреженный формат COO. Аналогичным образом реализовано умножение вектора-строки на матрицу. | ||
|
|
||
| Такой подход обеспечивает простоту реализации и наглядность кода, однако сопровождается значительными накладными расходами: квадратичная сортировка, линейный поиск при добавлении элементов и многократные преобразования между разреженным и плотным представлениями создают дополнительную вычислительную нагрузку. |
There was a problem hiding this comment.
а за n logn не умеете сортировать?
There was a problem hiding this comment.
А добавление в неупорядоченный что ли? Не понятно, откуда линейнй поиск. Может таки тогда словарь использовать?
| \label{tab:accel_vec} | ||
| \begin{tabular}{lrrr} | ||
| \toprule | ||
| Матрица & NNZ & Плотность, \% & Ускорение, раз \\ |
There was a problem hiding this comment.
А зачем столько таблиц с кучей дублирующейся информации?
|
|
||
| \begin{itemize} | ||
|
|
||
| \item при умножении матриц в COO выполняется предварительная сортировка элементов для упорядочивания данных, что само по себе требует дополнительного времени. Затем происходит полный перебор всех пар ненулевых элементов обеих матриц. Для каждого совпадения индексов выполняется линейный поиск по уже накопленному массиву результата, чтобы проверить, не добавлялся ли уже элемент с такими координатами. По мере заполнения результата время этого поиска возрастает. CSparse использует специализированные алгоритмы, которые избегают таких линейных поисков за счёт эффективной структуры данных. |
There was a problem hiding this comment.
"эффективной структуры данных" Какой? А что Вам помешало её применить?
|
|
||
| \item при умножении матриц в COO выполняется предварительная сортировка элементов для упорядочивания данных, что само по себе требует дополнительного времени. Затем происходит полный перебор всех пар ненулевых элементов обеих матриц. Для каждого совпадения индексов выполняется линейный поиск по уже накопленному массиву результата, чтобы проверить, не добавлялся ли уже элемент с такими координатами. По мере заполнения результата время этого поиска возрастает. CSparse использует специализированные алгоритмы, которые избегают таких линейных поисков за счёт эффективной структуры данных. | ||
|
|
||
| \item при умножении матрицы на вектор в COO разреженный вектор сначала разворачивается в плотный массив, затем создаётся временный массив для накопления результата, который в конце снова упаковывается в разреженный формат COO. Эти многократные преобразования создают существенные накладные расходы. |
|
|
||
| \begin{itemize} | ||
|
|
||
| \item при умножении матриц в COO выполняется предварительная сортировка элементов для упорядочивания данных, что само по себе требует дополнительного времени. Затем происходит полный перебор всех пар ненулевых элементов обеих матриц. Для каждого совпадения индексов выполняется линейный поиск по уже накопленному массиву результата, чтобы проверить, не добавлялся ли уже элемент с такими координатами. По мере заполнения результата время этого поиска возрастает. CSparse использует специализированные алгоритмы, которые избегают таких линейных поисков за счёт эффективной структуры данных. |
There was a problem hiding this comment.
Зачем ещё раз описывать алгоритм?
No description provided.