Fixpipe

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品 x
Atlas A2 训练系列产品/Atlas A2 推理系列产品 x
Atlas 200I/500 A2 推理产品 x
Atlas 推理系列产品AI Core x
Atlas 推理系列产品Vector Core x
Atlas 训练系列产品 x
Atlas 200/300/500 推理产品 x

功能说明

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

函数原型

template <const FixpipeTrait& trait = DEFAULT_FIXPIPE_TRAIT, typename T, typename U>
__aicore__ inline typename Std::enable_if<VerifyingFixpipeTemplate<T, U>, void>::type Fixpipe(const T& dst, const U& src)

template <const FixpipeTrait& trait = DEFAULT_FIXPIPE_TRAIT, typename T, typename U, typename V>
__aicore__ inline typename Std::enable_if<VerifyingFixpipeQuantTemplate<T, U, V>, void>::type 
Fixpipe(const T& dst, const U& src, const V& quant);

参数说明

表 1 模板参数说明

参数名 描述
T 目的操作数的数据类型,通过TensorTrait构造的LocalTensor类型。
U 源操作数的数据类型,通过TensorTrait构造的GlobalTensor类型。
V 量化参数的数据类型,可以是scalar或者是通过TensorTrait构造的GlobalTensor类型。支持的数据类型为uint64_t
FixpipeTypeTraits Fixpipe相关配置参数,类型为FIxpipeTrait:struct FixpipeTrait { QuantMode_t quantPre = QuantMode_t::NoQuant; bool reluEn = false; bool isChannleSplit = false; uint8_t unitFlag = false; uint8_t dualDstCtl = false; bool subBlockId = false;};constexpr FixpipeTrait DEFAULT_FIXPIPE_TRAIT;

表 2 量化参数说明

参数名 描述
quantPre QuantMode_t是一个枚举类型,用于控制量化模式,默认值为QuantMode_t::NoQuant,即不使能量化功能。QuantMode_t取值如下:
NoQuant,不使能量化功能F322F16,float量化成half,量化结果支持INF_NAN模式
F322BF16,float量化成bfloat16_t,量化结果支持INF_NAN模式
DEQF16,int32_t量化成half, scalar量化,量化结果不支持INF_NAN模式
VDEQF16,int32_t量化成half,tensor量化,量化结果不支持INF_NAN模式QF322B8_PRE,float量化成uint8_t/int8_t,scalar量化VQ
F322B8_PRE,float量化成uint8_t/int8_t,tensor量化REQ8,int32_t量化成uint8_t/int8_t,scalar量化
VREQ8,int32_t量化成uint8_t/int8_t,tensor量化
QF322FP8_PRE,float量化成fp8_e4m3fn_t,scalar量化
VQF322FP8_PRE,float量化成fp8_e4m3fn_t,tensor量化
QF322HIF8_PRE,float量化成hifloat8_t(Half to Away Round),scalar量化
VQF322HIF8_PRE,float量化成hifloat8_t(Half to Away Round),tensor量化
QF322HIF8_PRE_HYBRID,float量化成hifloat8_t(Hybrid Round),scalar量化
VQF322HIF8_PRE_HYBRID,float量化成hifloat8_t(Hybrid Round),tensor量化
QS322BF16_PRE,int32_t量化成bfloat16_t,scalar量化
VQS322BF16_PRE,int32_t量化成bfloat16_t,tensor量化
QF322F16_PRE,float量化成half,scalar量化
VQF322F16_PRE,float量化成half,tensor量化
QF322BF16_PRE,float量化成bfloat16_t,scalar量化
VQF322BF16_PRE,float量化成bfloat16_t,tensor量化
QF322F32_PRE,float量化成float,scalar量化,该量化模式精度无法达到双万分之一,可以达到双千分之一。如果有双万分之一的精度要求,建议使用AscendDeQuant高阶APIVQF322F32_PRE,float量化成float,tensor量化,该量化模式精度无法达到双万分之一,可以达到双千分之一。如果有双万分之一的精度要求,建议使用AscendDeQuant高阶API

表 3 参数说明

参数名 输入/输出 含义
dst 输出 目的操作数。
src 输入 源操作数。
quant 输入 量化参数

返回值说明

VerifyingFixpipeTemplate表达式为模板参数校验表达式,执行效果如下:

  • 校验表达式成立,表明输入数据类型符合使用约束,Fixpipe函数表达式返回值为void。
  • 校验表达式不成立,表明输入数据类型不符合使用约束时,Fixpipe函数声明失效,继而会导致编译错误。

约束说明

  • Tensor Layout相关约束:

    • TensorTrait中的Layout表述,统一采用层次化表述法
    • Shape、Stride只支持四个维度的数据配置,针对不同的物理存储位置,四个维度的配置均有不同的约束,部分维度为固定值,不可配置。详见[数据通路说明]。
    • Shape、Stride等数值数据,仅支持size_t类型和Std::Int类型。
    • Fixpipe量化接口中,quant参数的Layout中每一行的长度必须能够被主块(512)和尾块(n % 512)整除
  • quant参数数据通路和dataCopy L1 -> FB保持一致。

数据通路说明

表 4 L0C Buffer -> GM通路使用说明

项目 内容
模板参数T 数据类型为GlobalTensor。
模板参数U 数据类型为LocalTensor。
目的操作数TPosition取值范围 TPosition::GM
源操作数TPosition取值范围 TPosition::CO1
目的操作数的数据类型 float、int32_t
源操作数的数据类型 float、int32_t
源操作数和目的操作数基础数据类型是否要求一致
源操作数数据对齐要求 起始地址和数据长度要求64字节对齐。
目的操作数数据对齐要求 无对齐要求。
数据排布要求 NZ Layout -> NZ Layout : 源操作数和目的操作数仅支持连续排布和非连续排布。NZ Layout -> RowMajor Layout :源操作数和目的操作数仅支持连续排布和非连续排布。
NZ Layout -> ColumnMajor Layout:源操作数和目的操作数仅支持连续排布和非连续排布。
NZ Layout内层矩阵的Shape大小为16 * 16。

调用示例

...
// CO1 -> GM
using SrcT = float;
using DstT = float;
size_t mLength = 128;
size_t kLength = 64;

auto dstLayout = AscendC::MakeRowMajorLayout<DstT>(mLength, kLength);
auto srcLayout = AscendC::MakeNZLayout<SrcT>(mLength, kLength);

auto srcTrait = AscendC::MakeTensorTrait<SrcT, TPosition::CO1>(srcLayout);
auto dstTrait = AscendC::MakeTensorTrait<DstT, TPosition::GM>(dstLayout);

using srcTraitType = decltype(srcTrait);
using dstTraitType = decltype(dstTrait);

LocalTensor<srcTraitType> L0CTrait;
L0CTrait.SetTensorTrait(srcTrait);

GlobalTensor<dstTraitType> GlobalTraits;
GlobalTraits.SetTensorTrait(dstTrait);
//不做量化
AscendC::Fixpipe(GlobalTraits, L0CTrait);
//从float量化为half
constexpr static AscendC::FixpipeTrait trait = {AscendC::QuantMode_t::F322F16};
uint64_t quant = 0;
AscendC::Fixpipe<trait>(GlobalTraits, L0CTrait, quant);
...