Fixpipe

功能说明

矩阵计算完成后,对结果进行处理,例如对计算结果进行量化操作,并把数据从CO1搬迁到Global Memory中。

函数原型

参数说明

表1 模板参数说明

参数名

描述

DstT

目的操作数数据类型。

SrcT

源操作数数据类型。

config

Fixpipe相关配置参数,类型为FixpipeConfig。取值如下:

  • CFG_ROW_MAJOR(默认取值):使能NZ2ND,输出数据格式为ND格式。
  • CFG_NZ: 不使能NZ2ND,输出数据格式为NZ格式。
1
2
3
4
5
6
7
8
9
struct FixpipeConfig {
    CO2Layout format;
};
enum class CO2Layout : uint8_t {
    NZ = 0, // 不使能NZ2ND,输出数据格式仍为NZ格式。
    ROW_MAJOR, // 使能NZ2ND,输出数据格式为ND格式。
};
constexpr FixpipeConfig CFG_NZ = {CO2Layout::NZ};
constexpr FixpipeConfig CFG_ROW_MAJOR = {CO2Layout::ROW_MAJOR};
表2 参数说明

参数名称

输入/输出

含义

dstGlobal

输出

目的操作数,类型为GlobalTensor。支持的数据类型为half/bfloat16_t/float/int32_t/int8_t/uint8_t。

数据格式为NZ或ND格式。经过fixpipe处理,在量化操作之后,会将矩阵计算中多申请的数据删除。

srcLocal

输入

源操作数,支持的QuePosition为CO1,为Mmad接口计算的结果,类型为LocalTensor数据结构的定义请参考LocalTensor。支持的数据类型为float/int32_t,支持的QuePosition为CO1,数据格式为NZ格式。起始地址需要满足64B对齐。

intriParams

输入

Fixpipe搬运参数,类型为FixpipeParamsV220结构体,具体请参考表2 FixpipeParamsV220 结构体内参数定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
struct FixpipeParamsV220 {
    uint16_t nSize;
    uint16_t mSize;
    uint16_t srcStride;
    uint32_t dstStride;
    QuantMode_t quantPre;
    uint64_t deqScalar;
    uint16_t ndNum;
    uint16_t srcNdStride;
    uint16_t dstNdStride;
    bool reluEn;
    uint8_t unitFlag;
    bool isChannelSplit;
};

cbufWorkspace

输入

量化参数,类型为LocalTensor<uint64_t>,支持的QuePosition为A1。仅当quantPre为VDEQF16/VQF322B8_PRE/VREQ8时支持,quantPre介绍请参考FixpipeParamsV220结构体中quantPre部分。

表3 FixpipeParamsV220 结构体内参数定义

参数名称

数据类型

含义

nSize

输入

srcLocal的N方向的size大小。

  • 不使能NZ2ND功能

    若使能channelSplit功能,nSize必须为8的倍数,取值范围:nSize∈[1, 4095]。

    若不使能channelSplit功能,nSize必须为16的倍数,取值范围:nSize∈[1, 4095]。

  • 使能NZ2ND功能

    nSize取值范围 ∈[1, 4095]。

mSize

输入

srcLocal的M方向的size大小。

  • 不使能NZ2ND功能

    取值范围:mSize∈[1, 65535]。

  • 使能NZ2ND功能

    取值范围:mSize∈[1, 8192]。

srcStride

输入

srcLocal相邻连续数据片段间隔(前面一个数据块的头与后面数据块的头的间隔),取值范围:srcStride∈[0, 65535], 单位:C0_Size(16*sizeof(T), T为srcLocal的数据类型)。

dstStride

输入

  • 不使能NZ2ND功能

    dstLocal相邻连续数据片段间隔(前面一个数据块的头与后面数据块的头的间隔),取值不为0, 单位:datablock(32Bytes)。

  • 使能NZ2ND功能

    dstLocal同一nd矩阵的相邻行的偏移(头与头),取值不为0 ,单位:element。

quantPre

输入

默认值为QuantMode_t::NoQuant,即不使能量化功能。

QuantMode_t是一个枚举类型,用以控制量化模式,具体定义为:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
enum QuantMode_t
{
    NoQuant, // 不使能量化功能
    F322F16, // float量化成half
    F322BF16, // float量化成bf16
    DEQF16,  // int32 量化成half, scalar量化
    VDEQF16, // int32 量化成half,tensor量化
    QF322B8_PRE, // float量化成B8,scalar量化
    VQF322B8_PRE, // float量化成B8,tensor量化
    REQ8, // int32 量化成B8,scalar量化
    VREQ8, // int32 量化成B8,tensor量化
};

deqScalar

输入

scalar量化参数, 表示单个scale值,支持的数据类型为uint64_t, 仅当mode为DEQF16/QF322B8_PRE/REQ8时支持。

注:当mode为F322F16/F322BF16时不需要设置deqScalar。

ndNum

输入

传输nd矩阵的数目,取值范围:ndNum∈[1, 65535]

srcNdStride

输入

不同nd矩阵在L0C上的起始地址之间的间隔,取值范围:srcNdStride∈[1, 512],单位:1024B。当ndNum配置为1时,srcNdStride配置为0即可,不生效。

dstNdStride

输入

目的相邻nd矩阵起始地址间的偏移,取值范围:dstNdstride∈[1, 65535],单位:element。当ndNum配置为1时,dstNdStride配置为0即可,不生效。

reluEn

输入

是否使能relu的开关,false:不使能relu功能;true:使能relu功能。

unitFlag

输入

预留参数,用户无需关心,使用默认值0即可。

isChannelSplit

输入

是否使能通道拆分的功能。默认为false,不使能该功能。仅在src和dst都为float时才能使能通道拆分,且不能同时使能ChannelSplit和NZ2ND功能。

支持的型号

Atlas A2训练系列产品/Atlas 800I A2推理产品

Atlas 200I/500 A2推理产品

注意事项

调用示例