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);
参数说明
参数名 |
说明 |
取值范围 |
单位 |
|---|---|---|---|
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