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 |
|
|
|
|
Матричное умножение float16 |
|
|
|
|
Свертка float16 |
|
|
|
|
Свертка по методу Винограда float16 |
|
|
|
|
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
Функция активации:
STORE_NONE
— отсутствует, STORE_RELU
— relu, STORE_RELU6
— relu6.
Conv_version
-
enum Conv_version
Версия асм. ядра обработки: VER_1x16x128
— размер результата блока 1x16x128,
далее аналогично. При вызове функции инициализации значение будет выбрано автоматически.
Tensor_fl16
Описание полей структуры 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()
производит освобождение данных структуры запуска.