Skip to content

Баранов Андрей. Технология STL. Умножение плотных матриц. Элементы типа double. Блочная схема, алгоритм Фокса. Вариант 2.#573

Open
Anrey-Baranov wants to merge 10 commits intolearning-process:masterfrom
Anrey-Baranov:baranov_a_mult_matrix_fox_algorithm_stl

Conversation

@Anrey-Baranov
Copy link
Copy Markdown
Contributor

@Anrey-Baranov Anrey-Baranov commented Apr 5, 2026

Описание

Была реализована параллельная версия алгоритма Фокса для умножения плотных квадратных матриц с элементами типа double с использованием параллельных алгоритмов STL (C++17 Parallel Algorithms).

  • Задача: Умножение плотных матриц. Элементы типа double. Блочная схема, алгоритм Фокса
  • Вариант: Плоское представление (std::vector) для хранения матриц
  • Технология: STL (std::execution::par)
  • Описание: Реализовано параллельное умножение плотных квадратных матриц C = A × B с использованием блочной схемы алгоритма Фокса. Алгоритм разбивает матрицы на блоки и распределяет вычисления между несколькими потоками с помощью параллельных алгоритмов STL для достижения ускорения.

Описание алгоритма

Параллельная реализация алгоритма Фокса выполняет блочное умножение матриц с распределением нагрузки между потоками с использованием параллельных алгоритмов STL:

  1. Валидация входных данных: Проверка корректности размера матрицы и соответствия длины векторов
  2. Инициализация: Выделение памяти под результирующую матрицу и определение оптимального размера блока
  3. Блочное разбиение: Разделение исходных матриц A и B на блоки оптимального размера
  4. Параллельное умножение:
    • Использование std::for_each с std::execution::par для параллельного выполнения циклов
    • Использование std::fill с std::execution::par для параллельного обнуления матрицы
    • Применение алгоритма Фокса с циклической рассылкой блоков между потоками
    • Линеаризация двумерной индексации блоков с помощью std::iota для эффективного распараллеливания
    • Автоматическое распределение нагрузки между потоками средствами STL
  5. Сборка результата: Объединение блоков в результирующую матрицу
  6. Возврат результата: Результирующая матрица в плоском представлении

Особенности реализации

  • Плоское представление: Матрицы хранятся в виде одномерного вектора для эффективного доступа к памяти и кэш-локальности
  • STL параллелизация: Использование std::execution::par для автоматического распараллеливания вычислений с оптимальным количеством потоков
  • Адаптивный размер блока: Размер блока (64 элемента) подбирается автоматически в зависимости от размера матрицы
  • Отсутствие гонок данных: Каждый элемент результирующей матрицы обновляется только одним потоком для конкретной пары блоков, что исключает необходимость в атомарных операциях
  • Линеаризация индексов: Преобразование двумерной индексации блоков в линейную с помощью std::iota для эффективного использования std::for_each
  • Поддержка типа double: Все вычисления выполняются с двойной точностью
  • Валидация: Проверка размера > 0 и соответствия длины векторов ожидаемому размеру
  • Стандартизированный подход: Использование стандартных алгоритмов C++17 для максимальной переносимости кода

Тесты

Реализация была подвергнута функциональному и производительному тестированию:

Функциональные тесты

Проверка корректности работы на матрицах размером от 1×1 до 128×128 с различными типами данных:

  • Простые числа: Тестирование на линейно возрастающих значениях
  • Единичные матрицы: Проверка умножения на единичную матрицу
  • Случайные числа: Тестирование на случайно сгенерированных значениях с разными seed
  • Экстремальные значения: Проверка работы с очень большими (1e6) и очень маленькими (1e-6) числами
  • Разреженные матрицы: Тестирование на матрицах с большим количеством нулей
  • Константные матрицы: Проверка на матрицах с постоянными значениями
  • Блочное умножение: Проверка на матрицах размером 16, 32, 64, 128 для тестирования блочной схемы

Тесты производительности

Проверка производительности на матрице размером 512×512:

  • Константные значения: Матрица A заполнена 1.5, матрица B заполнена 2.0
  • Ожидаемый результат: Каждая ячейка результирующей матрицы равна 3.0 × размер матрицы
  • Сравнение производительности: Проверка ускорения относительно последовательной версии при использовании параллельных алгоритмов STL

Чек-лист

  • Статус CI: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем <фамилия>_<первая_буква_имени>_<короткое_название_задачи>
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи
    (например, nesterov_a_vector_sum), а не в master
  • Правдивое содержание: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и
    достоверными

@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Apr 6, 2026

Codecov Report

❌ Patch coverage is 50.00000% with 79 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.69%. Comparing base (7fd1f6d) to head (09c275f).
⚠️ Report is 126 commits behind head on master.

Files with missing lines Patch % Lines
...ov_a_mult_matrix_fox_algorithm/stl/src/ops_stl.cpp 0.00% 77 Missing ⚠️
...ov_a_mult_matrix_fox_algorithm/omp/src/ops_omp.cpp 97.29% 1 Missing ⚠️
...ov_a_mult_matrix_fox_algorithm/tbb/src/ops_tbb.cpp 97.72% 1 Missing ⚠️

❌ Your patch status has failed because the patch coverage (50.00%) is below the target coverage (95.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #573      +/-   ##
==========================================
- Coverage   81.73%   81.69%   -0.04%     
==========================================
  Files         429      458      +29     
  Lines       17537    18744    +1207     
  Branches     7165     7636     +471     
==========================================
+ Hits        14333    15313     +980     
- Misses       2251     2416     +165     
- Partials      953     1015      +62     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants