Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 192 additions & 0 deletions tasks/goriacheva_k_mult_sparse_complex_matrix_ccs/all/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
# Умножение разреженных матриц. Элементы комплексного типа. Формат хранения матрицы – столбцовый (CCS) - ALL

- Student: Горячева Ксения Александровна
- Technology: ALL
- Variant: 7

## 1. Контекст
Гибридная схема MPI + OpenMP
объединяет:

- распределённую память (MPI);
- общую память (OpenMP).

Это позволяет использовать
как межпроцессный,
так и внутрипроцессный параллелизм.

## 2. Постановка задачи

Полная постановка задачи приведена в отчёте для SEQ-версии [seq/report.md](../seq/report.md).
Кратко:

Входные данные:
Две разреженные комплексные матрицы:
- A — комплексная матрица размера m × n
- B — комплексная матрица размера n × k
представленные в формате CCS:

Выходные данные:
Матрица:
C = A * B
в формате CCS.

OpenMP-реализация должна давать **идентичный** SEQ результат при любом количестве потоков.

## 3. Базовый алгоритм
Последовательная версия (SEQ):

1. Проверить корректность входных данных.
2. Инициализировать структуру результата.
3. Для каждого столбца матрицы B:
- пройти по ненулевым элементам;
- выполнить умножение элементов;
- накопить значения в accumulator.
4. Отсортировать индексы строк.
5. Сохранить ненулевые значения в матрицу результата.

## 4. Схема распараллеливания
В гибридной версии используется двухуровневое распараллеливание:
- MPI — распределение столбцов между процессами;
- OpenMP — параллельная обработка столбцов внутри процесса.

Алгоритм включает:
1. Разделение столбцов между MPI-процессами;
2. Параллельную обработку столбцов внутри процесса;
3. Сбор результатов через MPI_Gatherv;
4. Формирование глобальной CCS-матрицы.

MPI
Столбцы матрицы B распределяются между процессами:
int cols_per_proc =
(b.cols + size - 1) / size;
Каждый процесс обрабатывает собственный диапазон столбцов.

OpenMP
Внутри процесса используется:
```cpp
#pragma omp parallel for
```
для обработки локальных столбцов.

Сборка результата
После вычислений:
локальные данные собираются через MPI_Gatherv;
формируется глобальный массив col_ptr;
результат рассылается всем процессам через MPI_Bcast.

Схема:
MPI
┌──────────┼──────────┐
Proc0 Proc1 Proc2
│ │ │
OpenMP OpenMP OpenMP
threads threads threads
│ │ │
local CCS local CCS local CCS
└──────────┼──────────┘
MPI_Gatherv

## 5. Детали реализации
- `all/include/ops_all.hpp` — объявление класса `GoriachevaKMultSparseComplexMatrixCcsSALL`.
- `all/src/ops_all.cpp` — реализация методов.

RunImpl
Основные этапы:
- определение ранга процесса;
- распределение столбцов;
- вычисление локальных результатов;
- сбор данных на процессе 0;
- рассылка итоговой матрицы.
Для внутреннего распараллеливания используется OpenMP.

Коммуникации MPI
Используются:
MPI_Gather
MPI_Gatherv
MPI_Bcast
для сборки результирующей CCS-матрицы.

## 6. Проверка корректности
Гибридная версия проходит все функциональные тесты,
используемые для последовательной версии.

### Способ проверки
Корректность реализации проверялась с помощью функциональных тестов Google Test.

Проверялись:
размеры результирующей матрицы;
массив col_ptr;
массив row_ind;
значения комплексных элементов с точностью 1e-9.

Сравнение результатов реализовано функцией:
CompareMatrices(...)

### Функциональные тесты
Используется 14 тестов.
| № теста | Описание | Проверяемый случай |
| ------- | -------------------------------- | ----------------------------------- |
| 0 | Матрицы 1×1 | Базовое умножение комплексных чисел |
| 1 | Диагональные 2×2 | Корректность умножения |
| 2 | Нулевой результат | Отсутствие ненулевых элементов |
| 3 | Мнимые числа | Работа с чисто мнимыми значениями |
| 4 | Комплексные коэффициенты | Корректность комплексной арифметики |
| 5 | Прямоугольные матрицы | Умножение матриц разных размеров |
| 6 | Разреженные 4×4 | Работа CCS-структуры |
| 7 | Один ненулевой столбец | Частично заполненная матрица |
| 8 | Крайние индексы | Проверка граничных строк |
| 9 | Несколько потоковых блоков | Корректность распределения |
| 10 | Полностью заполненная диагональ | Проверка накопления |
| 11 | Центральный элемент | Корректность индексации |
| 12 | Разреженные комплексные значения | Проверка знаков и мнимой части |
| 13 | Несортированные элементы столбца | Проверка сортировки строк |

Все функциональные тесты успешно пройдены
Результаты совпадают с SEQ
с точностью 1e-9.

## 7. Экспериментальная среда

CPU: Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
OS: Windows 10
Compiler: MinGW-w64 GCC, C++17
Build type: Release
CMake: 4.0.1
RAM: 32 GB

### Сборка
cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release --parallel

### Запуск тестов
cd build/bin
mpiexec -n 4 ./ppc_func_tests --gtest_filter="*GoriachevaKViolationOrderElemVecFuncTests*"
mpiexec -n 4 ./ppc_perf_tests --gtest_filter="*GoriachevaKMultSparseComplexMatrixCcsPerfTest*"

## 8. Результаты
| Режим | Workers (p) | Time (сек) | Speedup | Efficiency |
| :---- | :---------: | :--------: | :-----: | :--------: |
| SEQ | 1 | 0.000166 | 1.00 | 1.00 |
| ALL | 2 | 0.000399 | 0.42 | 0.21 |
| ALL | 4 | 0.005986 | 0.03 | 0.01 |
| ALL | 8 | 0.026888 | 0.01 | 0.00 |
| ALL | 16 | 0.103833 | 0.00 | 0.00 |
- Speedup = `T_seq / T_par`
- Efficiency = `Speedup / threads`
- База для `T_seq` — замер SEQ-версии

## 9. Выводы
В ходе работы была реализована гибридная версия алгоритма с использованием MPI и OpenMP.
Гибридная модель MPI + OpenMP позволяет эффективно выполнять умножение разреженных матриц на
многопроцессорных системах.
Преимущества:
- масштабируемость;
- возможность работы на кластерах;
- эффективное использование вычислительных ресурсов.
Недостатки:
- сложность реализации;
- необходимость синхронизации процессов;
- накладные расходы на передачу данных.
Несмотря на увеличение накладных расходов, связанных с MPI-коммуникациями и синхронизацией процессов,
гибридная реализация обеспечивает возможность масштабирования вычислений на распределённые системы.
Loading
Loading