matrix-lib

Описание

Библиотека elcore50-matrix-lib предназначена для выполнения матричных операций. Реализованы вычисления матричного умножения и двумерной свертки, в том числе по методу Винограда.

Поддерживаемые форматы данных для матричного умножения float16 и float32. Для свертки - float16.

Вычисление матричного умножения для float32 возможно при соблюдении кратности 4-м количества столбцов первой матрицы (количества строк второй).

Для матричного умножения формата float16 необходима кратность 8-ми для столбцов первой матрицы.

Свертка выполняется над тензорами формата NHWC, где N - размер пачки (batch), H - высота, W - ширина, C - количество каналов.

Ограничения для свёртки по классическому методу:

  • srcC mod 8 = 0, где srcC - количество каналов входного тензора;

  • dilationX = 1, dilationY = 1, dilationX, dilationY - растяжения свертки;

  • zero padding. Режим обработки границ, при котором коэффициенты ядра свертки, вышедшие за границы, умножаются на 0.

Ограничения для свёртки по методу Винограда:

  • srcH > 4 и SrcH mod 2 = 0, где SrcH - высота входного тензора;

  • srcW > 4 и SrcW mod 2 = 0, где SrcW - ширина входного тензора;

  • srcC mod 32 = 0, где srcC - количество каналов входного тензора;

  • dstC mod 32 = 0, где dstC - количество каналов выходного тензора;

  • kernelX = 3, kernelY = 3. kernelX, kernelY - размеры ядра свертки;

  • padX = 0, padY = 0, padW = 0, padH = 0. Ядро свертки не выходит за границы;

  • dilationX = 1, dilationY = 1, dilationX, dilationY - растяжения свертки.

Использование API

Запуск каждого алгоритма состоит из нескольких этапов.

Первый этап: создание конфигурационной структуры.

Второй этап: вызов инициализирующей функции.

Третий этап: запуск вычислений. Третий этап может происходить неограниченное количество раз при одной инициализации на втором этапе при условии, что указатели на данные и размеры матриц не меняются.

Предупреждение

Необходимо отключать L2DC, так как все функции вычисления используют XYRAM. Например, вызвать disable_l2_cache() из elcore50-matrix-lib/elcore50.h.

Четвертый этап: запуск функции очистки конфигурационных и вспомогательных данных.

Далее приведены названия структур и функций для каждого из алгоритмов

Этапы запуска алгоритмов

Название алгоритма

Конфигурационная структура

Инициализирующая функция

Функция запуска вычислений

Функция очистки

Матричное умножение float32

MatMulFl32Config

init_dma_chain_matmul_fl32()

run_matmul_fl32()

destroy_dma_chain_mat_mul_fl32()

Матричное умножение float16

MatMulFl16Config

init_dma_chain_matmul_fl16()

run_matmul_fl16()

destroy_dma_chain_mat_mul_fl16()

Свертка float16

ConvFl16Config

init_dma_chain_conv_fl16()

run_conv_fl16()

destroy_dma_chain_conv_fl16()

Свертка по методу Винограда float16

WinogradConfig

init_dma_chain_winograd()

run_winograd()

destroy_dma_chain_winograd()

API

Состоит из следующих заголовочных файлов:

  • elcore50-matrix-lib/mat_mul_with_dma_fl32.hpp — структуры данных и функции библиотеки для запуска алгоритма матричного умножения для типа данных float32.

  • elcore50-matrix-lib/mat_mul_with_dma_fl16.hpp — структуры данных и функции библиотеки для запуска алгоритма матричного умножения для типа данных float16.

  • elcore50-matrix-lib/convolution_fl16.hpp — структуры данных и функции библиотеки для запуска классического алгоритма свертки.

  • elcore50-matrix-lib/winograd_fl16.hpp — структуры данных и функции библиотеки для запуска алгоритма свертки по методу Винограда.

Структуры данных

Store_version

enum Store_version
enumerator STORE_NONE
enumerator STORE_RELU
enumerator STORE_RELU6

Функция активации: STORE_NONE — отсутствует, STORE_RELU — relu, STORE_RELU6 — relu6.

Conv_version

enum Conv_version
enumerator VER_1x16x128
enumerator VER_4x4x128
enumerator VER_4x8x64
enumerator VER_8x8x32

Версия асм. ядра обработки: VER_1x16x128 — размер результата блока 1x16x128, далее аналогично. При вызове функции инициализации значение будет выбрано автоматически.

Tensor_fl16

struct Tensor_fl16
uint16_t *data
int batch
int height
int width
int channel

Описание полей структуры Tensor_fl16:

  • data — указатель на данные.

  • batch — количество батчей тензора.

  • height — количество строк тензора.

  • width — количество столбцов тензора.

  • channel — количество каналов тензора.

    Предупреждение

    Значение channel должно быть кратно 8 у входного тензора для классического алгоритма свертки.

Описание полей структуры Weight_fl16:

  • data — указатель на данные.

  • kernelX — ширина ядра свертки.

  • kernelY — высота ядра свертки.

  • srcC — количество каналов входного тензора.

  • dstC — количество каналов выходного тензора.

  • strideX — шаг свертки по ширине.

  • strideY — шаг свертки по высоте.

  • dilationX — растяжение свертки по ширине.

  • dilationY — растяжение свертки по высоте.

    Предупреждение

    Для запуска классического алгоритма свертки srcC должно быть кратно 8.

    Значения dilationX и dilationY должны быть равны 1.

Функции

Матричное умножение для формата данных float32

Описанные ниже функции определены в заголовочном файле
elcore50-matrix-lib/mat_mul_with_dma_fl32.hpp.

init_dma_chain_matmul_fl32()
void init_dma_chain_matmul_fl32(float *src0, int row0, int row1col0, float *src1, int col1, float *dst, int &offset_A, int &offset_B, MatMulFl32Config *config)

Описание аргументов функции init_dma_chain_matmul_fl32():

  • src0 — указатель на первую матрицу.

  • row0 — к-во строк первой матрицы.

  • row1col0 — к-во столбцов первой матрицы / к-во строк второй матрицы.

  • src1 — указатель на вторую матрицу.

  • col1 — к-во столбцов второй матрицы.

  • dst — указатель на результирующую матрицу.

  • offset_A — смещение тайла первой матрицы, будет расчитано в результате выполнения

  • offset_B — смещение тайла второй матрицы, будет расчитано в результате выполнения

  • config — структура для запуска потайловой обработки.

Функция init_dma_chain_matmul_fl32() производит инициализацию и заполнение конфигурационной структуры для алгоритма.

run_matmul_fl32()
void run_matmul_fl32(float *src0, int row0, int row1col0, float *src1, int col1, float *dst, int offset_A, int offset_B, MatMulFl32Config *config)

Описание аргументов функции run_matmul_fl32()

  • src0 — указатель на первую матрицу.

  • row0 — к-во строк первой матрицы.

  • row1col0 — к-во столбцов первой матрицы / к-во строк второй матрицы.

  • src1 — указатель на вторую матрицу.

  • col1 — к-во столбцов второй матрицы.

  • dst — указатель на результирующую матрицу.

  • offset_A — смещение тайла первой матрицы из функции инициализации.

  • offset_B — смещение тайла второй матрицы из функции инициализации.

  • config — структура для запуска потайловой обработки.

Функция run_matmul_fl32() производит запуск потайловой обработки алгоритма матричного умножения формата float32.

destroy_dma_chain_mat_mul_fl32()
void destroy_dma_chain_mat_mul_fl32(MatMulFl32Config *config)

Описание аргументов функции destroy_dma_chain_mat_mul_fl32()

  • config — структура для запуска потайловой обработки.

Функция destroy_dma_chain_mat_mul_fl32() производит освобождение данных структуры запуска.

Матричное умножение для формата данных float16

Описанные ниже функции определены в заголовочном файле
elcore50-matrix-lib/mat_mul_with_dma_fl16.hpp.

init_dma_chain_matmul_fl16()
void init_dma_chain_matmul_fl16(uint16_t *src0, int row0, int row1col0, uint16_t *src1, int col1, uint16_t *dst, int &offset_A, int &offset_B, MatMulFl16Config *config, float *init_vector, int offset_src0, int offset_dst, uint16_t *start_adr)

Описание аргументов функции init_dma_chain_matmul_fl16():

  • src0 — указатель на первую матрицу.

  • row0 — к-во строк первой матрицы.

  • row1col0 — к-во столбцов первой матрицы / к-во строк второй матрицы.

  • src1 — указатель на вторую матрицу.

  • col1 — к-во столбцов второй матрицы.

  • dst — указатель на результирующую матрицу.

  • offset_A — смещение тайла первой матрицы, будет расчитано в результате выполнения

  • offset_B — смещение тайла второй матрицы, будет расчитано в результате выполнения

  • config — структура для запуска потайловой обработки.

  • init_vector — указатель на вектор начальных значений.

  • offset_src0 — смещение первой матрицы.

  • offset_dst — смещение результата.

  • start_adr — начальный адрес локальной памяти.

Функция init_dma_chain_matmul_fl16() производит инициализацию и заполнение конфигурационной структуры для алгоритма.

run_matmul_fl16()
void run_matmul_fl16(uint16_t *src0, int row0, int row1col0, uint16_t *src1, int col1, uint16_t *dst, int offset_A, int offset_B, MatMulFl16Config *config, Store_version st_ver, float *init_vector)

Описание аргументов функции run_matmul_fl16()

  • src0 — указатель на первую матрицу.

  • row0 — к-во строк первой матрицы.

  • row1col0 — к-во столбцов первой матрицы / к-во строк второй матрицы.

  • src1 — указатель на вторую матрицу.

  • col1 — к-во столбцов второй матрицы.

  • dst — указатель на результирующую матрицу.

  • offset_A — смещение тайла первой матрицы из функции инициализации.

  • offset_B — смещение тайла второй матрицы из функции инициализации.

  • config — структура для запуска потайловой обработки.

  • st_ver — версия постобработки

  • init_vector — указатель на вектор начальных значений, при наличии bias

Функция run_matmul_fl16() производит запуск потайловой обработки алгоритма матричного умножения формата float16.

destroy_dma_chain_mat_mul_fl16()
void destroy_dma_chain_mat_mul_fl16(MatMulFl16Config *config)

Описание аргументов функции destroy_dma_chain_mat_mul_fl16()

  • config — структура для запуска потайловой обработки.

Функция destroy_dma_chain_mat_mul_fl16() производит освобождение данных структуры запуска.

Свертка

Описанные ниже функции определены в заголовочном файле
elcore50-matrix-lib/convolution_fl16.hpp.

init_dma_chain_conv_fl16()
void init_dma_chain_conv_fl16(Tensor_fl16 *input_tensor, int group, int padX, int padW, int padY, int padH, Weight_fl16 *input_weight, float *bias, Tensor_fl16 *output_tensor, ConvFl16Config *config, bool add_bias_flag, uint16_t *start_adr, int local_mem_size)

Описание аргументов функции init_dma_chain_conv_fl16()

  • input_tensor — структура для входного тензора.

  • group — группа.

  • padX — паддинг слева.

  • padW — паддинг справа.

  • padY — паддинг сверху.

  • padH — паддинг снизу.

  • input_weight — структура весов.

  • bias — указатель на bias.

  • output_tensor — структура для выходного тензора.

  • config — структура для запуска потайлового алгоритма.

  • add_bias_flag — флаг наличия bias.

  • start_adr — адрес начала локальной памяти.

  • local_mem_size — размер локальной памяти.

Функция init_dma_chain_conv_fl16() производит инициализацию и заполнение конфигурационной структуры для алгоритма свертки формата float16.

run_conv_fl16()
void run_conv_fl16(Tensor_fl16 *input_tensor, int group, Weight_fl16 *input_weight, float *bias, Tensor_fl16 *output_tensor, ConvFl16Config *config, Store_version st_ver, bool add_bias_flag, Conv_version conv_version)

Описание аргументов функции run_conv_fl16()

  • input_tensor — структура для входного тензора.

  • group — группа.

  • input_weight — структура весов.

  • bias — указатель на bias.

  • output_tensor — структура для выходного тензора.

  • config — структура для запуска потайлового алгоритма.

  • st_ver — версия постобработки.

  • add_bias_flag — флаг наличия bias.

  • conv_version — версия ядра свертки, по умолчанию VER_4x4x128.

Функция run_conv_fl16() производит запуск потайловой обработки алгоритма свертки формата float16

destroy_dma_chain_conv_fl16()
void destroy_dma_chain_conv_fl16(ConvFl16Config *config)

Описание аргументов функции destroy_dma_chain_conv_fl16()

  • config — структура для запуска потайловой обработки.

Функция destroy_dma_chain_conv_fl16() производит освобождение данных структуры запуска.

Свертка по методу Винограда

Описанные ниже функции определены в заголовочном файле
elcore50-matrix-lib/winograd_fl16.hpp.

init_dma_chain_winograd()
void init_dma_chain_winograd(uint16_t *src_fl16, int batch, int srcC, int srcH, int srcW, float *weight, uint16_t *dst_fl16, int dstC, WinogradConfig *config)

Описание аргументов функции init_dma_chain_winograd()

  • src_fl16 — указатель на данные входного тензора.

  • batch — количество батчей входного тензора.

  • srcC — количество каналов входного тензора.

  • srcH — высота входного тензора.

  • srcW — ширина входного тензора.

  • weight — указатель на данные весов.

  • dst_fl16 — указатель на данные выходного тензора.

  • dstC — количество каналов выходного тензора.

  • config — структура для запуска потайловой обработки.

Функция init_dma_chain_winograd() производит инициализацию и заполнение конфигурационной структуры для алгоритма.

run_winograd()
void run_winograd(uint16_t *src_fl16, int batch, int srcC, int srcH, int srcW, uint16_t *dst_fl16, int dstC, WinogradConfig *config)

Описание аргументов функции run_winograd()

  • src_fl16 — указатель на данные входного тензора.

  • batch — количество батчей входного тензора.

  • srcC — количество каналов входного тензора.

  • srcH — высота входного тензора.

  • srcW — ширина входного тензора.

  • weight — указатель на данные весов.

  • dst_fl16 — указатель на данные выходного тензора.

  • dstC — количество каналов выходного тензора.

  • config — структура для запуска потайловой обработки.

Функция run_winograd() запуск потайлового алгоритма Винограда.

destroy_dma_chain_winograd()
void destroy_dma_chain_winograd(WinogradConfig *config)

Описание аргументов функции destroy_dma_chain_winograd()

  • config — структура для запуска потайловой обработки.

Функция destroy_dma_chain_winograd() производит освобождение данных структуры запуска.