Платформа и источник
Статья подготовлена по PDF производителя RKNN V2.5.0 и относится только к перечисленным в нём чипам и интерфейсам. Для платы ArmSoM сначала проверьте SoC, драйвер NPU, Toolkit/Runtime, SDK/BSP и версию ядра. Проверки на оборудовании ArmSoM не проводились; примеры и измерения оригинала не являются тестами ArmSoM.
Навигация по серии
- Платформы, заголовки и компоновка
- Владение памятью и общий/zero-copy процессы
- Устройство, контекст и флаги инициализации
- Запросы модели, тензоров и динамических форм
- Вход, выполнение, выход и динамические формы
- Тензоры, выделение памяти и синхронизация
- Матричное умножение и динамические формы
- Регистрация и атрибуты пользовательских операторов
- Коды состояния, тензоры, память и расширения
- Структуры матричного умножения
- Структуры операторов и миграция устаревших API
6.3. Структуры матричного умножения
rknn_matmul_info
rknn_matmul_info задаёт спецификацию матричного умножения: размеры операции, тип данных и размещение входных и выходных матриц в памяти. Определение структуры приведено в таблице:
| Поле | Тип | Значение |
|---|---|---|
| M | int32_t | Число строк A. |
| K | int32_t | Число столбцов A. |
| N | int32_t | Число столбцов B. |
| type | rknn_matmul_type | Типы входных и выходной матриц: RKNN_FLOAT16_MM_FLOAT16_TO_FLOAT32: A/B — float16, C — float; RKNN_INT8_MM_INT8_TO_INT32: A/B — int8, C — int32; RKNN_INT8_MM_INT8_TO_INT8: A/B/C — int8; RKNN_FLOAT16_MM_FLOAT16_TO_FLOAT16: A/B/C — float16; RKNN_FLOAT16_MM_INT8_TO_FLOAT32: A — float16, B — int8, C — float; RKNN_FLOAT16_MM_INT8_TO_FLOAT16: A — float16, B — int8, C — float16; RKNN_FLOAT16_MM_INT4_TO_FLOAT32: A — float16, B — int4, C — float; RKNN_FLOAT16_MM_INT4_TO_FLOAT16: A — float16, B — int4, C — float16; RKNN_INT8_MM_INT8_TO_FLOAT32: A/B — int8, C — float; RKNN_INT4_MM_INT4_TO_INT16: A/B — int4, C — int16; RKNN_INT8_MM_INT4_TO_INT32: A — int8, B — int4, C — int32. |
| B_layout | int16_t | Размещение памяти B. 0 означает форму [K,N]. RKNN_MM_LAYOUT_NORM — исходная форма KxN; RKNN_MM_LAYOUT_NATIVE — высокопроизводительное размещение; RKNN_MM_LAYOUT_TP_NORM — форма после транспонирования NxK. |
| B_quant_type | int16_t | Квантование B: RKNN_QUANT_TYPE_PER_LAYER_SYM — симметричное Per-Layer; RKNN_QUANT_TYPE_PER_LAYER_ASYM — асимметричное Per-Layer; RKNN_QUANT_TYPE_PER_CHANNEL_SYM — симметричное Per-Channel; RKNN_QUANT_TYPE_PER_CHANNEL_ASYM — асимметричное Per-Channel; RKNN_QUANT_TYPE_PER_GROUP_SYM — симметричное Per-Group; RKNN_QUANT_TYPE_PER_GROUP_ASYM — асимметричное Per-Group. |
| AC_layout | int16_t | Размещение данных A и C: RKNN_MM_LAYOUT_NORM — исходные формы; RKNN_MM_LAYOUT_NATIVE — высокопроизводительные формы. |
| AC_quant_type | int16_t | Квантование A и C: RKNN_QUANT_TYPE_PER_LAYER_SYM — симметричное Per-Layer; RKNN_QUANT_TYPE_PER_LAYER_ASYM — асимметричное Per-Layer. |
| iommu_domain_id | int32_t | Индекс домена адресного пространства IOMMU контекста матриц. Домен и контекст соответствуют друг другу один к одному; размер каждого домена — 4 GB. Параметр главным образом нужен при больших A/B/C, когда после выделения NPU более 4 GB в одном домене требуется переход в другой. |
| group_size | int16_t | Число элементов группы; действует только при групповом квантовании. |
| reserved | int8_t[] | Зарезервированное поле. |
rknn_matmul_tensor_attr
rknn_matmul_tensor_attr описывает атрибуты тензора каждой матрицы: имя, форму, размер и тип данных. Определение структуры приведено в таблице:
| Поле | Тип | Значение |
|---|---|---|
| name | char[] | Имя матрицы. |
| n_dims | uint32_t | Число измерений матрицы. |
| dims | uint32_t[] | Форма матрицы. |
| size | uint32_t | Размер матрицы. |
| type | rknn_tensor_type | Тип данных матрицы. |
rknn_matmul_io_attr
rknn_matmul_io_attr описывает все входные и выходные тензоры матричной операции, включая атрибуты матриц A, B и C. Определение структуры приведено в таблице:
| Поле | Тип | Значение |
|---|---|---|
| A | rknn_matmul_tensor_attr | Атрибуты тензора матрицы A. |
| B | rknn_matmul_tensor_attr | Атрибуты тензора матрицы B. |
| C | rknn_matmul_tensor_attr | Атрибуты тензора матрицы C. |
rknn_quant_params
rknn_quant_params описывает параметры квантования матрицы: имя, указатели и длины массивов scale и zero_point. Поле name определяет имя матрицы; его можно получить из rknn_matmul_io_attr, возвращённой при инициализации контекста. Определение структуры приведено в таблице:
| Поле | Тип | Значение |
|---|---|---|
| name | char[] | Имя матрицы. |
| scale | float* | Указатель массива scale матрицы. |
| scale_len | int32_t | Длина массива scale матрицы. |
| zp | int32_t* | Указатель массива zero_point матрицы. |
| zp_len | int32_t | Длина массива zero_point матрицы. |
rknn_matmul_shape
rknn_matmul_shape задаёт M, K и N матричного умножения определённой формы. При инициализации контекста с динамическими формами нужно передать число форм и массив rknn_matmul_shape со всеми входными формами. Определение структуры приведено в таблице:
| Поле | Тип | Значение |
|---|---|---|
| M | int32_t | Число строк A. |
| K | int32_t | Число столбцов A. |
| N | int32_t | Число столбцов C. |
Источник и редакционные примечания
Технические главы разделены по назначению. Код, идентификаторы и параметры сохранены. Китайская версия следует китайскому оригиналу; английская, русская и немецкая — английскому. В главы без иллюстраций вымышленные изображения не добавлены.
Оговорки оригинала: номера глав и примерные журналы сохранены; ранние версии SDK в журналах не являются версией этой статьи. Runtime переходит от главы 3 к 5 и повторяет номера запросов. Таблица rknn_init называет extend отключённым, но далее описывает user_key и общие веса. Текст о нативном динамическом выходе указывает RKNN_QUERY_CURRENT_OUTPUT_ATTR, пример — RKNN_QUERY_CURRENT_NATIVE_OUTPUT_ATTR. Некоторые описания native NHWC/NC1HWC2 смешивают вход и выход. Проверяйте фактические заголовки V2.5.0 и целевой SDK: поведение не подтверждено тестами. Ссылка RK2118 в оригинале называется RKNN3_RK2118_Quick_Start.pdf, а в текущем каталоге находится руководство RKNN2.
