Skip to content
版本

asc_mmad_sparse

产品支持情况

  • Ascend 950PR/Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

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

函数原型

  • 常规计算
C++
__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 c_matrix_source, bool c_matrix_init_val)
  • 同步计算
C++
__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 c_matrix_source, bool c_matrix_init_val)

参数说明

表1 参数说明

参数名输入/输出描述
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即可。
c_matrix_source输入配置C矩阵初始值是否来源于BiasTable Buffer(存放Bias的硬件缓存区)。取值说明如下:
• true:来源于BiasTable Buffer。
• false:来源于L0C Buffer。
c_matrix_init_val输入配置C矩阵初始值是否为0。取值说明如下:
• true:C矩阵初始值为0。
• false:C矩阵初始值通过c_matrix_source参数进行配置。

返回值说明

流水类型

PIPE_M

约束说明

  • 原始稀疏矩阵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个元素中的相对位置。
具体可参考下表。其中,“-”表示算法不关心该位置上的值,因为其会被过滤。 表2 稠密算法说明

示例ele0ele1ele2ele3Index_a[i]Index_b[i]
Two non-zero elements00XY2'b102'b10
0X0Y2'b012'b10
X00Y2'b002'b10
0XY-2'b012'b01
X0Y-2'b002'b01
XY--2'b002'b00
One non-zero element000X2'b002'b10
00X02'b102'b00
0X002'b012'b00
X0002'b002'b00
All zero00002'b002'b00
该索引矩阵用于A矩阵的稠密化,根据索引矩阵从MatrixA中的4个元素中选择2个元素参与计算,如下图所示:

稠密算法说明图

调用示例

C++
constexpr 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 c_matrix_source = true;
bool c_matrix_init_val = true;
asc_mmad_sparse(c, a, b, m, k, n, unit_flag, c_matrix_source, c_matrix_init_val);

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区