asc_mmad_sparse

产品支持情况

产品 是否支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

完成矩阵乘加操作,传入的左矩阵A为稀疏矩阵,右矩阵B为稠密矩阵。对于矩阵A,在asc_mmad_sparse计算时完成稠密化;对于矩阵B,在计算执行前的输入数据准备时自行完成稠密化(按照下文中介绍的稠密算法进行稠密化),所以输入本接口的矩阵B为稠密矩阵。稠密矩阵B需要通过asc_copy_l12l0b_sparse载入,同时加载索引矩阵,索引矩阵在矩阵B稠密化的过程中生成,再用于矩阵A的稠密化。

函数原型

  • 常规计算
__aicore__ inline void asc_mmad_sparse(__cc__ int32_t* c, __ca__ int8_t* a, __cb__ int8_t* b, uint16_t m, uint16_t k, uint16_t n, uint8_t unit_flag, bool cmatrix_source, bool cmatrix_init_val)
  • 同步计算
__aicore__ inline void asc_mmad_sparse_sync(__cc__ int32_t* c, __ca__ int8_t* a, __cb__ int8_t* b, uint16_t m, uint16_t k, uint16_t n, uint8_t unit_flag, bool cmatrix_source, bool cmatrix_init_val)

参数说明

参数名 输入/输出 描述
c 输出 目的操作数,结果矩阵C,起始地址需要1024字节对齐。
a 输入 源操作数,左矩阵A,起始地址需要512字节对齐。
b 输入 源操作数,右矩阵B,起始地址需要512字节对齐。
m 输入 左矩阵Height,取值范围:m∈[0,4095]。
k 输入 左矩阵Width、右矩阵Height,取值范围:k∈[0,4095]。
n 输入 右矩阵Width,取值范围:n∈[0,4095]。
unit_flag 输入 unit_flag是一种Mmad指令和Fixpipe指令细粒度的并行,使能该功能后,硬件每计算完一个分形,计算结果就会被搬出,该功能不适用于L0C Buffer累加的场景。取值说明如下:
0:保留值。
2:使能unit_flag,硬件执行完指令后,不会关闭unit_flag功能。
3:使能unit_flag,硬件执行完指令后,会关闭unit_flag功能。
使能该功能时,Mmad指令的unit_flag在最后一个分形设置为3,其余分形计算设置为2即可。
cmatrix_source 输入 配置C矩阵初始值是否来源于BiasTable Buffer(存放Bias的硬件缓存区)。取值说明如下:
• true:来源于BiasTable Buffer。
• false:来源于L0C Buffer。
cmatrix_init_val 输入 配置C矩阵初始值是否为0。取值说明如下:
• true:C矩阵初始值为0。
• false:C矩阵初始值通过cmatrix_source参数进行配置。

返回值说明

流水类型

PIPE_MTE1

约束说明

  • 原始稀疏矩阵B每4个元素中应保证最多2个非零元素,如果存在3个或更多非零元素,则仅使用前2个非零元素。
  • 当m、k、n中的任意一个值为0时,该指令不会被执行。

稠密算法说明

假设原始稀疏矩阵B的每4个元素中至少有2个零,稠密化后的矩阵B是一个在每4个元素中过滤掉2个零的稠密矩阵。矩阵B稠密化的过程中生成索引矩阵,过程如下:对于稀疏矩阵B中的每4个元素,将在index矩阵中生成2个2位索引,并按照以下规则进行编码。索引必须在{0, 1, 2}范围内。
• 第一个索引用于指示前3个元素中第1个非零元素的相对位置。
• 第二个索引用于指示第2个非零元素在后3个元素中的相对位置。
具体可参考下表。其中,“-” 表示算法不关心该位置上的值,因为其会被过滤。

示例 ele0 ele1 ele2 ele3 Index_a[i] Index_b[i]
Two non-zero elements 0 0 X Y 2'b10 2'b10
0 X 0 Y 2'b01 2'b10
X 0 0 Y 2'b00 2'b10
0 X Y - 2'b01 2'b01
X 0 Y - 2'b00 2'b01
X Y - - 2'b00 2'b00
One non-zero element 0 0 0 X 2'b00 2'b10
0 0 X 0 2'b10 2'b00
0 X 0 0 2'b01 2'b00
X 0 0 0 2'b00 2'b00
All zero 0 0 0 0 2'b00 2'b00
该索引矩阵用于A矩阵的稠密化,根据索引矩阵从MatrixA中的4个元素中选择2个元素参与计算,如下图所示:

调用示例

uint32_t total_length = 128;
__ca__ int8_t a[total_length];
__cb__ int8_t b[total_length];
__cc__ int32_t c[total_length];
uint16_t m = 2;
uint16_t k = 2;
uint16_t n = 1;
uint8_t unit_flag = 2;
bool cmatrix_source = true;
bool cmatrix_init_val = true;
asc_mmad_sparse(c, a, b, m, k, n, unit_flag, cmatrix_source, cmatrix_init_val)