Skip to content

Котельникова Анастасия. Технология OMP. Умножение разреженных матриц. Элементы типа double. Формат хранения матрицы – столбцовый (CCS). Вариант 5.#228

Merged
allnes merged 1 commit intolearning-process:masterfrom
KotelnikovaA:kotelnikova_a_double_matr_mult_css_omp
Mar 7, 2026

Conversation

@KotelnikovaA
Copy link
Copy Markdown
Contributor

@KotelnikovaA KotelnikovaA commented Mar 2, 2026

Описание

  • Задача: Умножение разреженных матриц. Элементы типа double. Формат хранения матрицы – столбцовый (CCS).
  • Вариант: 5
  • Технология: OMP

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

Реализовано параллельное умножение двух разреженных матриц, хранящихся в столбцовом формате CCS (Compressed Column Storage), с использованием технологий OpenMP. Использование разреженного формата позволяет эффективно работать с матрицами большой размерности, где большинство элементов равны нулю, значительно экономя память и вычислительные ресурсы за счет обработки только ненулевых элементов.

Принцип работы:

Матрица в формате CCS представляется тремя массивами:
values - хранит ненулевые значения матрицы в порядке обхода по столбцам
row_indices - для каждого значения хранит номер строки, где оно находится
col_ptrs - массив размера (количество столбцов + 1), где col_ptrs[j] указывает индекс в массивах values/row_indices, с которого начинается столбец j

Валидация:

Проверяется, что обе входные матрицы имеют корректную CCS структуру:

  1. Размеры матриц (rows, cols) неотрицательны;
  2. Размер массива col_ptrs равен cols + 1;
  3. Количество значений равно количеству индексов строк;
  4. Первый указатель col_ptrs[0] равен 0;
  5. Последний указатель col_ptrs[cols] равен общему количеству элементов;
  6. Указатели не убывают и неотрицательны;
  7. Индексы строк находятся в допустимом диапазоне [0, rows-1];
  8. Проверяется возможность умножения: количество столбцов первой матрицы должно равняться количеству строк второй матрицы.

Предобработка:

Создается результирующая матрица с размерами a.rows × b.cols. Подготавливаются структуры для параллельного выполнения.

Параллельное умножение:

Алгоритм реализован в два этапа с использованием OpenMP для распределения вычислений между потоками:

Первый этап - подсчет структуры результата:

  • Параллельно распределяются столбцы результирующей матрицы между потоками с динамическим распределением нагрузки (chunk size = 8)
  • Для каждого столбца j вычисляются значения с использованием временного вектора размером a.rows
  • Производится подсчет количества ненулевых элементов в столбце
    Результаты подсчета сохраняются в массиве col_start

Второй этап - заполнение значений:

  • На основе полученных данных вычисляются смещения для каждого столбца (col_ptr)
  • Выделяется память под результирующую матрицу точно известного размера
  • Параллельно заполняются значения столбцов по предварительно вычисленным смещениям

После обработки всех ненулевых элементов столбца:

  • Значения из временного вектора, превышающие порог epsilon = 1e-10, сохраняются в результат
  • Соответствующие индексы строк записываются в row_indices
  • Указатели столбцов col_ptrs формируются автоматически при заполнении

Постобработка:

Результирующая матрица в формате CCS возвращается как выходные данные. Дополнительной обработки не требуется, так как параллельный алгоритм напрямую формирует корректную CCS структуру.

Тестирование:

Функциональные тесты (5 тестовых случаев):

  • simple_3x3 - умножение разреженных матриц 3×3
  • rectangular_2x3_3x2 - умножение прямоугольных матриц
  • zero_result - умножение, дающее нулевую матрицу
  • identity_matrix - умножение на единичную матрицу
  • diagonal_matrices - умножение диагональных матриц

Каждый тест проверяет полное соответствие результата ожидаемому: размеры матрицы, количество ненулевых элементов, значения элементов, индексы строк и указатели столбцов. Допустимая погрешность для чисел с плавающей точкой - 1e-10.

Производительность:

Тесты производительности выполняются на случайных разреженных матрицах размером 450×450 с плотностью 10% (около 16 000 ненулевых элементов в каждой матрице). Для верификации результатов используется умножение матриц с погрешностью 1e-8. Такой размер матрицы позволяет оценить производительность алгоритма в условиях, приближенных к реальным вычислительным задачам.


Чек-лист

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

@KotelnikovaA KotelnikovaA requested a review from allnes as a code owner March 2, 2026 21:03
Ramzan8-88 pushed a commit to Ramzan8-88/ppc-2026-threads that referenced this pull request Mar 4, 2026
…ло. Вариант 21. (learning-process#228)

## Описание
- Задача: Интегрирование – метод Монте-Карло
- Вариант: 21
- Технология: SEQ, MPI
- Описание: Реализованы последовательная и параллельная (MPI) версии
алгоритма численного интегрирования методом Монте-Карло. Алгоритм
вычисляет определенный интеграл функции на заданном интервале, используя
статистическую выборку случайных точек.

---

## Чеклист
- [x] CI успешно выполнен в моем форке (сборка, тесты, документация)
- [x] Папка задачи названа `akhmetov_daniil_integration_monte_carlo` и
соответствует имени ветки
- [x] clang-format пройден локально
- [x] clang-tidy пройден локально (не добавлены предупреждения/ошибки)
- [x] Функциональные тесты проходят локально
- [x] Тесты производительности проходят локально
- [x] Отчет (`report.md`) добавлен и следует шаблону
- [x] Я подтверждаю, что предоставленная информация является правдивой

---------

Co-authored-by: Ваше TheNarhawl <вÐdanah29122003@gmail.om>
@allnes allnes merged commit 29ea93a into learning-process:master Mar 7, 2026
34 checks passed
SinevArtem pushed a commit to SinevArtem/ppc-2026-threads that referenced this pull request Mar 16, 2026
LarisaEgorova pushed a commit to LarisaEgorova/ppc-2026-threads that referenced this pull request Mar 17, 2026
GoriachevaKsenia pushed a commit to GoriachevaKsenia/ppc-2026-threads that referenced this pull request Mar 21, 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