Этот проект реализует класс Matrix на C++ с перегрузкой оператора умножения * и *=, используя OpenCL для ускоренного перемножения целочисленных матриц произвольной размерности. В качестве обёртки используется официальная opencl.hpp.
matrix.h/matrix.cpp— реализация классаMatrix:- хранение матрицы в
std::vector<int> - доступ к элементам через
operator()иconst int* data() - перегрузка операторов
<<,>>,*,*= - умножение через OpenCL (
multiply_opencl)
- хранение матрицы в
matmul.cl— OpenCL-ядро умножения матрицtests/test_matrix.cpp— автотесты с помощью gtestCMakeLists.txt— сборочная система CMake.github/workflows/ci.yml— CI на GitHub Actions с использованием POCL
- C++17
- OpenCL 2.0 (через
opencl.hpp) - POCL — Portable OpenCL (работает на CPU, используется в CI)
- CMake — кроссплатформенная сборка
- GitHub Actions — для автоматического тестирования
-
Входные матрицы (из std::vector) копируются в OpenCL-буферы
-
Запускается ядро matmul.cl:
-
Ядро OpenCL (
matmul.cl) принимает 3 буфера и 3 размерности:__kernel void matmul(__global const int* A, __global const int* B, __global int* C, const int M, const int N, const int K) { int row = get_global_id(0); int col = get_global_id(1); int sum = 0; for (int i = 0; i < K; ++i) sum += A[row * K + i] * B[i * N + col]; C[row * N + col] = sum; }
-
Внутри ядра каждая ячейка
C[i][j]вычисляется параллельно по формуле: -
Результат копируется обратно в объект Matrix.
Тесты реализованы с использованием gtest и проверяют:
- корректность умножения матриц
- умножение с нулевой и единичной матрицами
- граничные случаи (1×1, несовместимые размерности и др.)
CI использует POCL (Portable OpenCL) — позволяет запускать тесты даже на CPU без GPU.
Проект распространяется под лицензией MIT. См. файл LICENSE.