Skip to content

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

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

Conversation

@Anrey-Baranov
Copy link
Copy Markdown
Contributor

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

Описание

Была реализована универсальная (ALL) версия алгоритма Фокса для умножения плотных квадратных матриц с элементами типа double, объединяющая все технологии параллелизма (SEQ, OMP, TBB, STL) с автоматическим выбором оптимальной технологии.

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

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

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

  1. Валидация входных данных: Проверка корректности размера матрицы и соответствия длины векторов
  2. Инициализация: Выделение памяти под результирующую матрицу и определение оптимального размера блока
  3. Блочное разбиение: Разделение исходных матриц A и B на блоки оптимального размера
  4. Автоматический выбор технологии:
    • Приоритет выбора: TBB → OpenMP → STL потоки → SEQ
    • Использование директив препроцессора для определения доступных технологий
    • Автоматическое переключение между реализациями без изменения кода
  5. Параллельное умножение в зависимости от выбранной технологии:
    • TBB: Использование tbb::parallel_for для параллельного выполнения циклов
    • OpenMP: Использование директив #pragma omp parallel for для распараллеливания
    • STL: Использование std::for_each с std::execution::par и std::thread
    • SEQ: Последовательное выполнение для обратной совместимости
  6. Сборка результата: Объединение блоков в результирующую матрицу
  7. Возврат результата: Результирующая матрица в плоском представлении

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

  • Плоское представление: Матрицы хранятся в виде одномерного вектора для эффективного доступа к памяти и кэш-локальности
  • Автоматический выбор технологии: Приоритет TBB > OpenMP > STL потоки > SEQ
  • Адаптивный размер блока: Размер блока (64 элемента) подбирается автоматически в зависимости от размера матрицы
  • Отсутствие гонок данных: Каждый элемент результирующей матрицы обновляется только одним потоком для конкретной пары блоков
  • Кроссплатформенность: Поддержка Windows, Linux, macOS
  • Поддержка типа double: Все вычисления выполняются с двойной точностью
  • Валидация: Проверка размера > 0 и соответствия длины векторов ожидаемому размеру
  • Модульность: Разделение логики для каждой технологии в отдельные функции
  • Единый интерфейс: Одинаковый API для всех технологий параллелизма

Тесты

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

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

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

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

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

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

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

Чек-лист

  • Статус 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 14, 2026

Codecov Report

❌ Patch coverage is 56.45646% with 145 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.26%. Comparing base (f7f3d46) to head (353d316).

Files with missing lines Patch % Lines
...ks/barkalova_m_mult_matrix_ccs/stl/src/ops_stl.cpp 0.00% 77 Missing ⚠️
...ks/barkalova_m_mult_matrix_ccs/tbb/src/ops_tbb.cpp 0.00% 44 Missing ⚠️
...ov_a_mult_matrix_fox_algorithm/all/src/ops_all.cpp 78.02% 17 Missing and 3 partials ⚠️
...ov_a_mult_matrix_fox_algorithm/stl/src/ops_stl.cpp 96.10% 1 Missing and 2 partials ⚠️
...ov_a_mult_matrix_fox_algorithm/tbb/src/ops_tbb.cpp 97.72% 1 Missing ⚠️

❌ Your patch status has failed because the patch coverage (56.45%) 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     #649      +/-   ##
==========================================
- Coverage   82.27%   81.26%   -1.01%     
==========================================
  Files         497      502       +5     
  Lines       21191    21524     +333     
  Branches     8691     8810     +119     
==========================================
+ Hits        17434    17491      +57     
- Misses       2614     2896     +282     
+ Partials     1143     1137       -6     

☔ 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