# gemmlowp

Высокооптимизированная библиотека для матричного умножения с низкой точностью (low-precision matrix multiplication), разработанная Google. Она предоставляет эффективные реализации операций линейной алгебры для 8-битных целочисленных значений, что особенно критично для машинного обучения на мобильных и встраиваемых устройствах с ограниченными вычислительными ресурсами.

## Особенности

- высокооптимизированные ядра матричного умножения для 8-битных целочисленных значений;
- поддержка аппаратных ускорений (NEON на ARM, SSE/AVX на x86);
- минимизация использования памяти и энергопотребления;
- кроссплатформенность с поддержкой мобильных и встраиваемых систем;
- интеграция с TensorFlow Lite и другими фреймворками машинного обучения;
- открытая лицензия (Apache 2.0).

## Основные компоненты

Gemmlowp состоит из нескольких модулей, которые обеспечивают эффективное выполнение матричных операций с низкой точностью (подробнее с документацией можно ознакомиться [здесь](https://github.com/google/gemmlowp)).

### Низкоточные матричные операции

Библиотека специализируется на операциях линейной алгебры с 8-битными целочисленными значениями, что позволяет значительно ускорить вычисления по сравнению с операциями с плавающей точкой при сохранении приемлемой точности для многих задач машинного обучения.

Основные операции:

- `gemmlowp::eight_bit_int_gemm` — матричное умножение 8-битных целочисленных матриц;
- `gemmlowp::eight_bit_int_gemm_dot_product` — оптимизированная версия с использованием инструкций dot product;
- `gemmlowp::eight_bit_or_less_int_gemm` — обобщенное умножение для разных битностей (до 8 бит);
- поддержка операций с bias и активационными функциями.

### Квантование и деквантование

Gemmlowp включает инструменты для преобразования данных между форматами с плавающей точкой и квантованными 8-битными целочисленными значениями, что является ключевым аспектом работы с низкоточными моделями.

Функции преобразования:

- `gemmlowp::Quantize()` — квантование float-значений в int8 с заданным диапазоном;
- `gemmlowp::Dequantize()` — обратное преобразование int8 во float;
- `gemmlowp::Requantize()` — повторное квантование с изменением параметров;
- автоматический подбор параметров квантования на основе статистики данных.

### Поддержка различных форматов хранения матриц

Для оптимизации доступа к памяти и использования кэша библиотека поддерживает различные форматы хранения матричных данных, включая упакованные и транспонированные форматы.

Форматы хранения:

- Row-major и column-major расположение данных;
- Блочная упаковка (blocking) для лучшей локальности данных;
- Упакованные форматы для эффективного использования SIMD-инструкций;
- Динамическое переупорядочивание данных для минимизации кэш-промахов.

### Интеграция с фреймворками машинного обучения

Gemmlowp тесно интегрирована с TensorFlow Lite и другими популярными фреймворками машинного обучения, обеспечивая высокопроизводительные низкоточные вычисления для инференса моделей на мобильных устройствах.

Точки интеграции:

- Бэкенд для операций свертки и полносвязных слоев в TensorFlow Lite;
- Поддержка различных типов активационных функций (ReLU, ReLU6, tanh, sigmoid);
- Совместимость с форматами моделей TFLite и ONNX;
- Оптимизированные пути выполнения для распространенных архитектур нейронных сетей.
