Skip to content

Синев Тимур. Технология OMP. Умножение плотных матриц. Элементы типа double. Блочная схема, алгоритм Кэннона. Вариант 1#370

Closed
Tsinev wants to merge 45 commits intolearning-process:masterfrom
Tsinev:timur_a_cannon_omp

Conversation

@Tsinev
Copy link
Contributor

@Tsinev Tsinev commented Mar 16, 2026

  • Задача: Умножение плотных матриц. Элементы типа double. Блочная схема, алгоритм Кэннона.
  • Вариант: 1
  • Технология: OMP
  • Реализация: последовательная версия умножения матриц по алгоритму Кэннона с автоматическим выбором размера блока

Описание

В данной работе реализована параллельная версия алгоритма Кэннона для перемножения квадратных матриц с использованием технологии OpenMP. Алгоритм базируется на разбиении данных на блоки и их циклическом перемещении, что позволяет эффективно распределить вычислительную нагрузку между потоками и оптимизировать работу с кэш-памятью.

Основные детали решения

  1. Параллельное блочное представление Исходные матрицы $A$ и $B$ преобразуются в четырехмерные структуры (сетки блоков). В отличие от последовательной версии, распределение данных (DistributeData) выполняется параллельно с помощью директивы #pragma omp parallel for collapse(2). Это позволяет одновременно заполнять блоки для разных позиций сетки, ускоряя инициализацию.

  2. Начальное распределение (Initial Alignment)
    Перед началом вычислений выполняется предварительный сдвиг блоков:

  • блок A(i, j) выбирается с учётом смещения по строке;
  • блок B(i, j) — с учётом смещения по столбцу.
    Параллельная реализация этого этапа гарантирует, что каждый поток подготавливает свою часть данных для первого шага вычислений без конфликтов записи.
  1. Итеративный процесс и многопоточное умножение
    Основной цикл вычислений состоит из q шагов (где q = n block_size):
  • Параллельное умножение блоков: На каждом шаге используется #pragma omp parallel for collapse(2), что позволяет распределить вычисления пар блоков (i, j) между доступными ядрами процессора.
  • Локальная оптимизация: Внутри функции BlockMultiplyAccumulate сохраняется эффективный порядок обхода i–k–j, что критически важно для производительности в многопоточном режиме, так как уменьшает нагрузку на шину памяти.
  • Параллельная ротация: После перемножения блоки матрицы A сдвигаются влево, а матрицы B — вверх. Эти операции также распараллелены, что минимизирует простои потоков между вычислительными фазами.
  1. Синхронизация и управление памятью
  • Безопасность потоков: Использование default(none) и явное указание shared переменных в директивах OpenMP гарантирует отсутствие состояний гонки (race conditions).
  • Zero-copy подход: Для ротации блоков применяется std::move. В сочетании с OpenMP это позволяет быстро перераспределять указатели на блоки между итерациями, не нагружая систему лишним копированием данных в памяти.
  • Сборка результата: Финальная матрица формируется параллельно в методе CollectResult, где каждый поток копирует вычисленные блоки в соответствующие области результирующего массива.
  1. Валидация
  • Программа выполняет проверку входных параметров перед запуском параллельной секции:
  • Проверка на квадратную форму и кратность размера матрицы размеру блока.
  • Контроль корректности выделения памяти под сетку блоков для предотвращения сбоев в многопоточной среде.

Чек-лист

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

@codecov-commenter
Copy link

codecov-commenter commented Mar 17, 2026

Codecov Report

❌ Patch coverage is 80.00000% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.17%. Comparing base (97dd371) to head (e4cad3a).

Files with missing lines Patch % Lines
tasks/timur_a_cannon/omp/src/ops_omp.cpp 79.48% 8 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #370      +/-   ##
==========================================
+ Coverage   79.16%   79.17%   +0.01%     
==========================================
  Files         267      269       +2     
  Lines        9325     9365      +40     
  Branches     3963     3979      +16     
==========================================
+ Hits         7382     7415      +33     
- Misses       1374     1382       +8     
+ Partials      569      568       -1     

☔ 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.

@Tsinev Tsinev closed this Mar 19, 2026
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