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
10
11
12
struct FixpipeConfig {
    CO2Layout format;
 
};
enum class CO2Layout : uint8_t {
    NZ = 0, // 不使能NZ2ND,输出数据格式仍为NZ格式。
    ROW_MAJOR, // 使能NZ2ND,输出数据格式为ND格式。
    COLUMN_MAJOR, // 使能NZ2DN,输出数据格式为DN格式。
};
constexpr FixpipeConfig CFG_NZ = {CO2Layout::NZ};
constexpr FixpipeConfig CFG_ROW_MAJOR = {CO2Layout::ROW_MAJOR};
constexpr FixpipeConfig CFG_COLUMN_MAJOR = {CO2Layout::COLUMN_MAJOR};

BufT

cbufWorkspace的数据类型。

  • 当目的操作数、源操作数 、cbufWorkspace使用基础数据类型时,BufT必须为uint64_t类型,否则编译失败。
  • 当目的操作数、源操作数 、cbufWorkspace使用TensorTrait类型时,BufT的LiteType必须为uint64_t类型,否则编译失败。

BufT后一个模板参数仅用于上述数据类型检查,用户无需关注。

表2 参数说明

参数名称

输入/输出

含义

dstGlobal

输出

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

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

srcLocal

输入

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

intriParams

输入

Fixpipe搬运参数,具体定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_fixpipe.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。

参数说明请参考表3

cbufWorkspace

输入

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

表3 Fixpipe搬运参数结构体说明

参数名称

数据类型

含义

nSize

输入

源NZ矩阵在N方向上的大小。

  • 不使能NZ2ND功能

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

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

  • 使能NZ2ND功能

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

mSize

输入

源NZ矩阵在M方向上的大小。

  • 不使能NZ2ND功能

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

  • 使能NZ2ND功能

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

srcStride

输入

源NZ矩阵中相邻Z排布的起始地址偏移,取值范围:srcStride∈[0, 65535], 单位:C0_Size(16*sizeof(T),T为srcLocal的数据类型)。

dstStride

输入

  • 不使能NZ2ND功能

    目的NZ矩阵中相邻Z排布的起始地址偏移,取值不为0, 单位:datablock(32Bytes)。

  • 使能NZ2ND功能

    目的ND矩阵每一行中的元素个数,取值不为0 ,单位:element。

quantPre

输入

QuantMode_t是一个枚举类型,用于控制量化模式,默认值为QuantMode_t::NoQuant,即不使能量化功能。QuantMode_t取值如下:

  • NoQuant,不使能量化功能
  • F322F16,float量化成half
  • F322BF16,float量化成bfloat16_t
  • DEQF16,int32_t量化成half, scalar量化
  • VDEQF16, int32_t量化成half,tensor量化
  • QF322B8_PRE,float量化成uint8_t/int8_t,scalar量化
  • VQF322B8_PRE,float量化成uint8_t/int8_t,tensor量化
  • REQ8,int32_t量化成uint8_t/int8_t,scalar量化
  • VREQ8,int32_t量化成uint8_t/int8_t,tensor量化

deqScalar

输入

scalar量化参数,表示单个scale值,quantPre量化模式为scalar量化时需要设置该参数。支持的数据类型为uint64_t。

ndNum

输入

源NZ矩阵的数目,也就是传输ND矩阵的数目,取值范围:ndNum∈[1, 65535]

srcNdStride

输入

不同NZ矩阵起始地址之间的间隔,取值范围: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功能。

不使能NZ2ND的情况下,参数设置示例(通过Fixpipe接口搬运并去除dummy数据)和解释说明如下:

图1 不使能NZ2ND参数设置示意图

使能NZ2ND的情况下,参数设置示例和解释说明如下:

图2 使能NZ2ND参数设置示意图

支持的型号

Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件,仅支持包含FixpipeParamsV220参数的接口。

Atlas 200I/500 A2 推理产品,仅支持包含FixpipeParamsM300参数的接口。

约束说明

调用示例