Mmad

功能说明

完成矩阵乘加操作。

定义原型

不含有矩阵乘偏置功能:
template <typename dst_T, typename src0_T, typename src1_T>
void Mmad(const LocalTensor<dst_T>& dstLocal, const LocalTensor<src0_T>& fmLocal,
const LocalTensor<src1_T>& filterLocal, const MmadParams& mmadParams)

参数说明

表1 不含有矩阵乘偏置接口参数说明

参数名称

输入/输出

含义

dstLocal

输出

目的操作数,结果矩阵,类型为LocalTensor。

fmLocal

输入

源操作数,左矩阵a,类型为LocalTensor。

filterLocal

输入

源操作数,右矩阵b,类型为LocalTensor。

mmadParams

输入

矩阵乘相关参数,类型为MmadParams,结构体具体定义为:

struct MmadParams
{
    uint16_t m;
    uint16_t n;
    uint16_t k;
    bool isBias;
    int32_t fmOffset;
    bool enSsparse;
    bool enWinogradA;
    bool enWinogradB;
};

参数说明请参考表2

表2 MmadParams结构体内参数说明

参数名称

含义

m

左矩阵Height,取值范围:m∈[0, 4095] 。默认值为0。

n

右矩阵Width,取值范围:n∈[0, 4095] 。默认值为0。

k

左矩阵Width、右矩阵Height,取值范围:k∈[0, 4095] 。默认值为0。

isBias

配置是否需要累加初始矩阵,默认值为false,取值说明如下:

  • false:矩阵乘,无需累加初始矩阵,C = A * B。
  • true:矩阵乘加,需要累加初始矩阵, C += A * B。

fmOffset

预留参数,用户无需关心,使用默认值0即可,当前暂不支持。

enSsparse

预留参数,用户无需关心,使用默认值false即可,当前暂不支持。

enWinogradA

预留参数,用户无需关心,使用默认值false即可, 当前暂不支持。

enWinogradB

预留参数,用户无需关心,使用默认值false即可, 当前暂不支持。

表3 dstLocal、fmLocal、filterLocal支持的精度类型组合

左矩阵fmLocal type

右矩阵filterLocal type

结果矩阵dstLocal type

支持的型号

uint8_t

uint8_t

uint32_t

Atlas 训练系列产品

Atlas推理系列产品AI Core

int8_t

int8_t

int32_t

Atlas 训练系列产品

Atlas推理系列产品AI Core

uint8_t

int8_t

int32_t

Atlas 训练系列产品

Atlas推理系列产品AI Core

uint8_t

uint8_t

int32_t

Atlas 训练系列产品

Atlas推理系列产品AI Core

half

half

half

Atlas 训练系列产品

Atlas推理系列产品AI Core

half

half

float

Atlas 训练系列产品

Atlas推理系列产品AI Core

float

float

float

注意事项

数据格式说明

Mmad 函数对于输入数据的格式要求和输出数据的要求如下图,矩阵 ABC 分别为 A2/B2/CO1 中的数据。下图中每个小方格代表一个 512Byte 的分形矩阵(对于 b8 来说是 16x32,对于 b16/b32 来说则是 16x16)。下图中Z字形的黑色线条代表对应位置数据在昇腾AI处理器上的排列顺序,起始点是左上角,终点是右下角。

矩阵A:每个分型矩阵内部是行主序,分型矩阵之间是行主序。简称小Z大Z格式。

矩阵B:每个分型矩阵内部是列主序,分型矩阵之间是行主序。简称小N大Z格式。

矩阵C:每个分型矩阵内部是行主序,分型矩阵之间是列主序。简称小Z大N格式。

以下是一个简单的例子,假设分型矩阵的大小是2x2,然后矩阵ABC的大小都是4x4

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

对于一个C风格的矩阵来说内部元素的排列顺序应该是0,1,2…15。

矩阵A的排列顺序:0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15

矩阵B的排列顺序:0,4,1,5,2,6,3,7,8,12,9,13,10,14,11,15

矩阵C的排列顺序:0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15

以下是一个具体的例子,数据为half类型。

如图,当 M=30,K=70,N=40 的时候,A2 中应该有 2x5 个 16x16 矩阵,B2 中应该有 5x3 个16x16 矩阵,CO1 中应该有 2x3 个 16x16 矩阵。在这种场景下 M、K 和 N 都不是 16 的倍数,A2 中右下角的矩阵实际有效的数据只有 14x6 个,但是也需要占一个 16x16 矩阵的空间,其他无效数据在计算中会被忽略。

一个 16x16 分形的数据块中,无效数据与有效数据排布的方式示意如下:

调用示例