昇腾社区首页
中文
注册
开发者
下载

mad

功能说明

两个矩阵相乘并相加运算,计算公式如下:

c = a * b + c

矩阵 a 的大小为 m * k,矩阵 b 的大小为 k * n,矩阵 c 的大小为 m * n。

如果 m, k, n 中的任何一个为零,该接口将被视为 NOP 并报警告。

接口原型

// 矩阵 a 和 b 为 bfloat16_t,矩阵 c 为 float,且未启用偏置表
void mad(__cc__ float *dst, __ca__ bfloat16_t *src0, __cb__ bfloat16_t *src1, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵 a 和 b 为 bfloat16_t,矩阵 c 为 float,且启用偏置表
void mad(__cc__ float *dst, __ca__ bfloat16_t *src0, __cb__ bfloat16_t *src1, uint64_t bt_addr, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵 a 和 b 为 half,矩阵 c 为 float,且未启用偏置表
void mad(__cc__ float *dst, __ca__ half *src0, __cb__ half *src1, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为half,矩阵c为float,且启用偏置表
void mad(__cc__ float *dst, __ca__ half *src0, __cb__ half *src1, uint64_t bt_addr, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为float,矩阵c为float,且未启用偏置表
void mad(__cc__ float *dst, __ca__ float *src0, __cb__ float *src1, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为float,矩阵c为float,且启用偏置表
void mad(__cc__ float *dst, __ca__ float *src0, __cb__ float *src1, uint64_t bt_addr, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为int8_t,矩阵c为int32_t,且未启用偏置表
void mad(__cc__ int32_t *dst, __ca__ int8_t *src0, __cb__ int8_t *src1, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为int8_t,矩阵c为int32_t,且启用偏置表
void mad(__cc__ int32_t *dst, __ca__ int8_t *src0, __cb__ int8_t *src1, uint64_t bt_addr, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为s4,矩阵c为int32_t,且未启用偏置表
void mad_s4(__cc__ int32_t *dst, __ca__ void *src0, __cb__ void *src1, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

// 矩阵a和b为s4,矩阵c为int32_t,且启用偏置表
void mad_s4(__cc__ int32_t *dst, __ca__ void *src0, __cb__ void *src1, uint64_t bt_addr, uint16_t m, uint16_t k, uint16_t n, uint8_t featOffset, uint8_t smaskOffset, uint8_t unitFlag, bool kDirectionAlign, bool isWeightOffset, bool cmatrixSource, bool cmatrixInitVal);

参数说明

表1 mad参数说明

参数名

说明

取值范围

单位

c

目的地址,矩阵 c 地址,存放在L0C上。

/

/

a

左矩阵源地址,存放在 L0A 上。

/

/

b

右矩阵源地址,存放在 L0B 上。

/

/

bt_addr

偏置表的地址,uint64_t 类型,代表首地址,仅当 cmatrixInitVal 设为 false,且 cmatrixSource 设为 1 时,才需要传入该参数。

/

/

m

左矩阵的高。

[0, 2^12-1]

elem

k

左矩阵的宽,右矩阵的高,如果 type = s4,则 k 必须是偶数。

[0, 2^12-1]

elem

n

右矩阵的宽。

[0, 2^12-1]

elem

featOffset

特征图矩阵偏移。该参数在当前版本未启用,设为0即可。

其设计原则为:如果数据类型为s8,则偏移量被视为s8;如果数据类型为u8,则偏移量被视为u8。如果不需要偏移量,则设置0。

[0, 2^8-1]

/

smaskOffset

SMASK缓冲区地址。该参数在当前版本未启用,设为0即可。

其设计原则为:以2字节为单位从SMASK中加载权重偏移量。设置为1表示SMASK缓冲区读取地址为2B。SMASK应通过load_smask_table_from_src更新。

[0, 2^7-1]

2B

unitFlag

预留参数,设置为0即可。

/

/

kDirectionAlign

此位仅用于(源矩阵类型为f32, 并且目的矩阵类型也是f32,即f32*f32+f32),其他类型忽略此位。

如果=1,则L0AL0B中的矩阵在K方向上对齐到16。否则它将与8对齐。

[0, 1]

/

isWeightOffset

权重矩阵偏移使能位。该参数在当前版本未启用,设为0即可。

其设计原则为:如果使能,矩阵B中的每一列都将减去其对应的偏移量,该偏移量存储在smaskOffset中。SMASK缓冲器的读取地址在smaskOffset中定义。假设矩阵大小为k x n,n表示n个输出通道。对于s8u8情况,一个输出通道的每个数(右矩阵的一列)从SMASK中减去一个s8u8数据。结果(int9)用作CUBE计算的输入。由于SMASK只能存储256B,总共256个s8u8数据,因此对应的MMAD的n应小于或等于256。如果n大小大于256,程序员应该将右矩阵拆分为n大小小于256的多个部分,当切换到其他部分时,SMASK应通过load_smask_table_from_src更新。

[0, 1]

/

cmatrixSource

当cmatrixInitVal设为False时,该参数才有意义。

如果cmatrixSource=0,则C矩阵在L0C中,其在L0C中的地址与c[31:0]中的地址相同。

如果cmatrixSource=1,则C矩阵位于偏置表中,偏置表中的地址由c[63:32]配置。CUBE只会读取n个结果值,并在m方向上广播。c[63:32]以字节为基本单元,必须64Byte对齐。受偏置表大小的限制,当cmatrixSource=1时,偏置读地址不应超过1024。否则,读取的地址会被绕开,并报出警告。

[0, 1]

/

cmatrixInitVal

表示矩阵c初始值控制位,True表示c矩阵初始值为0,False表示c矩阵初始值使用其中的具体数据。

[0, 1]

/

流水类型

PIPE_M