Skip to content

Copy(L0C Buffer到Unified Buffer数据搬运)

说明

本接口为试验接口,在后续版本中可能会调整或改进,不保证后续兼容性。请开发者在使用过程中关注后续版本更新。

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

头文件路径为:tensor_api/tensor.h

Tensor API通过Copy接口统一执行不同通路数据搬运。该接口用于将L0C Buffer中的矩阵计算结果搬运到Unified Buffer。L0C Buffer中的数据通常为Mmad的输出,数据格式为NZ。搬运到Unified Buffer时,接口会根据目的张量格式自动选择NZNDNZDNNZNZ的随路格式转换。

L0C Buffer到Unified Buffer搬运支持不量化输出、floathalfbfloat16_t的直接转换输出,以及配合标量或张量量化参数的随路量化输出。随路Relu、双目的模式和舍入方式通过CopyL0C2UBTrait配置。MmadFixpipe细粒度并行相关的unitFlag通过FixpipeParams配置。

接口支持batch模式。batch模式用于一次完成多块矩阵计算结果的搬运。Layout在原矩阵Layout最外层增加Batch维度。源张量为NZ格式,分形固定为16×16,可通过MakeFrameLayout<NZLayoutPtn>(batch, m, n)构造。目的张量可通过MakeFrameLayout<NDLayoutPtn>(batch, m, n)MakeFrameLayout<DNLayoutPtn>(batch, m, n)MakeFrameLayout<NDExtLayoutPtn>(batch, m, n)MakeFrameLayout<DNExtLayoutPtn>(batch, m, n)MakeFrameLayout<NZLayoutPtn, DstType>(batch, m, n)构造。NZ格式可通过模板参数DstType指定目的数据类型,C0表示NZ格式的列分形大小,默认为16。

随路量化、随路Relu、随路格式转换、随路通道拆分以及随路通道合并的有效组合、中间数据类型和数据路径如下图所示。图中的F32到F16、F32到BF16为非量化模式,仅进行cast。其余路径为不量化、随路scalar或tensor量化模式。针对Ascend 950PR/Ascend 950DT,还支持NZ2DN随路格式转换。

图1 L0C2UB流程图

L0C2UB流程图

函数原型

  • 执行L0C Buffer到Unified Buffer的非量化搬运。

    C++
    template <typename AtomType, typename DstTensor, typename SrcTensor>
    __aicore__ inline void Copy(const CopyAtom<AtomType>& atomCopy, const DstTensor& dst, const SrcTensor& src)
    
  • 执行L0C Buffer到Unified Buffer的量化搬运。

    C++
    template <typename AtomType, typename DstTensor, typename SrcTensor, typename QuantParam,
        Std::enable_if_t<IsCopyQuantParamV<QuantParam>, int> Enable>
    __aicore__ inline void Copy(const CopyAtom<AtomType>& atomCopy, const DstTensor& dst, const SrcTensor& src,
        const QuantParam& quant)
    
  • 使用默认trait构造搬运原子对象。

    C++
    template <typename CopyOperationType>
    __aicore__ inline constexpr auto MakeCopy(const CopyOperationType& copyOperation)
    
  • 使用指定trait构造搬运原子对象。

    C++
    template <typename CopyOperationType, typename CopyTraitType>
    __aicore__ inline constexpr auto MakeCopy(const CopyOperationType& copyOperation, const CopyTraitType& copyTrait)
    

参数说明

表1 Copy接口参数说明

参数名输入/输出描述
atomCopy输入搬运原子对象,可由MakeCopy(CopyL0C2UB{})MakeCopy(CopyL0C2UB{}, CopyL0C2UBTraitDefault{})构造。
dst输出目的张量,存储位置为Location::UB。数据格式支持NDDNNZ
src输入源张量,存储位置为Location::L0C,数据格式为NZ,通常为Mmad的计算结果。
quant输入可选量化参数。传入uint64_t时表示scalar量化参数,传入张量时表示tensor量化参数,张量位于L1 Buffer,元素类型为uint64_t
fixpipeParams输入可选搬运参数,类型为FixpipeParams,通过atomCopywith接口绑定到搬运原子对象,未绑定时使用默认值。

表2 MakeCopy接口参数说明

参数名输入/输出描述
copyOperation输入搬运操作对象。L0C Buffer到Unified Buffer搬运取CopyL0C2UB{}
copyTrait输入搬运trait对象。L0C Buffer到Unified Buffer搬运默认取CopyL0C2UBTraitDefault{}

CopyL0C2UBTrait说明

CopyL0C2UBTrait用于配置L0C Buffer到Unified Buffer搬运的静态特性。

C++
struct CopyL0C2UBTrait {
    RoundMode roundMode = RoundMode::DEFAULT;
    bool enableRelu = false;
    bool enableChannelSplit = false;
    DualDstMode dualDstCtl = DUAL_DST_DISABLE;
};

表3 CopyL0C2UBTrait成员说明

成员默认值描述
roundModeRoundMode::DEFAULT舍入模式。RoundMode::HYBRID仅在源类型为float、目的类型为hifloat8_t的量化输出场景支持。
enableRelufalse是否使能随路Relu。
enableChannelSplitfalse是否使能输出数据通道拆分。
dualDstCtlDUAL_DST_DISABLE双目标模式控制,取值包括DUAL_DST_DISABLEDUAL_DST_SPLIT_MDUAL_DST_SPLIT_N。详细说明参见L0C Buffer到Unified Buffer双目标模式

使用自定义trait的示例:

C++
constexpr CopyL0C2UBTrait l0c2ubTrait = {
    RoundMode::DEFAULT,
    false,
    false,
    DUAL_DST_DISABLE
};

struct CopyL0C2UBTraitCustom {
    using TraitType = CopyL0C2UBTrait;
    static constexpr const TraitType value = l0c2ubTrait;
};

FixpipeParams说明

FixpipeParams用于配置运行时搬运参数。

C++
struct FixpipeParams {
    uint8_t unitFlag = 0;
    bool subBlockId = false;
};

表4 FixpipeParams成员说明

成员默认值描述
unitFlag0控制Mmad指令和Fixpipe指令的细粒度并行。0表示不使能,2表示使能且执行后不复位单元标记位,3表示使能且执行后复位单元标记位。使能时,MmadParamsFixpipeParams中的unitFlag需要配套设置为23
subBlockIdfalse在启用单目标模式时指示目标UB的编号。

数据类型

L0C Buffer到Unified Buffer搬运根据是否传入量化参数自动选择量化模式。

表5 数据类型说明

源张量类型(L0C Buffer)目的张量类型(Unified Buffer)调用形式说明
int32_tint8_tuint8_tCopy(atom, dst, src, quant)scalar或tensor量化输出。
floatint8_tuint8_tCopy(atom, dst, src, quant)scalar或tensor量化输出。
floatfp8_e4m3fn_thifloat8_tCopy(atom, dst, src, quant)scalar或tensor量化输出。hifloat8_t支持RoundMode::DEFAULTRoundMode::HYBRID
int32_thalfbfloat16_tCopy(atom, dst, src, quant)scalar或tensor量化输出。
floathalfCopy(atom, dst, src)直接转换输出,对应F32到F16。
floatbfloat16_tCopy(atom, dst, src)直接转换输出,对应F32到BF16。
floathalfbfloat16_tCopy(atom, dst, src, quant)scalar或tensor量化输出。
int32_tint32_tCopy(atom, dst, src)不量化输出。
floatfloatCopy(atom, dst, src)不量化输出。
floatfloatCopy(atom, dst, src, quant)scalar或tensor量化输出。

不传入quant时,接口选择不量化或直接转换模式,传入uint64_t时选择scalar量化模式,传入Tensor API张量时选择tensor量化模式。

返回值说明

Copy无返回值。MakeCopy返回CopyAtom对象。

约束说明

  • 源矩阵NZ格式,地址要求64字节对齐。目的矩阵地址要求32字节对齐。
  • 目的矩阵为NZ输出时,N方向大小需要为16的倍数;b8类型通道合并场景为32的倍数,float使能enableChannelSplit通道拆分场景为8的倍数。
  • tensor量化参数张量应位于L1 Buffer,元素类型为uint64_t,地址要求32字节对齐。详细约束参见随路量化
  • 使能unitFlag时,需要配合Mmad同时使能。
  • 使用RoundMode::HYBRID时,源类型必须为float,目的类型必须为hifloat8_t
  • 目的布局为NZ时,不支持dualDstCtl设置为DUAL_DST_SPLIT_N。双目标模式详细约束参见L0C Buffer到Unified Buffer双目标模式
  • 通道合并特性硬件自动使能,不能通过参数配置。详细约束参见Int8 Channel Merge

关键特性

L0C Buffer到Unified Buffer搬运涉及随路量化随路ReluInt8 Channel MergeL0C Buffer到Unified Buffer双目标模式batch搬运等关键特性。

调用示例

不量化输出

C++
#include "tensor_api/tensor.h"

using namespace AscendC::Te;

__aicore__ inline void CopyL0CToUB()
{
    auto l0c = MakeTensor(MakeMemPtr(l0cAddr), MakeFrameLayout<NZLayoutPtn, 16>(m, n));
    auto ub = MakeTensor(MakeMemPtr(ubAddr), MakeFrameLayout<NDExtLayoutPtn>(m, n));

    FixpipeParams params;
    auto atom = MakeCopy(CopyL0C2UB{}).with(params);
    Copy(atom, ub, l0c);
}

scalar量化输出

C++
#include "tensor_api/tensor.h"

using namespace AscendC::Te;

__aicore__ inline void CopyL0CToUB()
{
    auto l0c = MakeTensor(MakeMemPtr(l0cAddr), MakeFrameLayout<NZLayoutPtn, 16>(m, n));
    auto ub = MakeTensor(MakeMemPtr(ubAddr), MakeFrameLayout<NDExtLayoutPtn>(m, n));

    uint64_t quant = 1;
    auto atom = MakeCopy(CopyL0C2UB{}).with(FixpipeParams{});
    Copy(atom, ub, l0c, quant);
}

tensor量化输出

C++
#include "tensor_api/tensor.h"

using namespace AscendC::Te;

__aicore__ inline void CopyL0CToUB()
{
    auto l0c = MakeTensor(MakeMemPtr(l0cAddr), MakeFrameLayout<NZLayoutPtn, 16>(m, n));
    auto ub = MakeTensor(MakeMemPtr(ubAddr), MakeFrameLayout<NDExtLayoutPtn>(m, n));
    auto quant = MakeTensor(MakeMemPtr(l1QuantAddr), MakeFrameLayout<NDExtLayoutPtn>(1, n));

    auto atom = MakeCopy(CopyL0C2UB{}).with(FixpipeParams{});
    Copy(atom, ub, l0c, quant);
}

batch模式输出

C++
#include "tensor_api/tensor.h"

using namespace AscendC::Te;

__aicore__ inline void CopyBatchL0CToUB()
{
    constexpr uint32_t batch = 3;
    constexpr uint32_t m = 32;
    constexpr uint32_t n = 64;

    __cc__ float l0cBuf[batch * m * n];
    __ubuf__ half ubBuf[batch * m * n];

    auto l0c = MakeTensor(MakeMemPtr(l0cBuf), MakeFrameLayout<NZLayoutPtn>(batch, m, n));
    auto ub = MakeTensor(MakeMemPtr(ubBuf), MakeFrameLayout<NDExtLayoutPtn>(batch, m, n));

    auto atom = MakeCopy(CopyL0C2UB{}).with(FixpipeParams{});
    Copy(atom, ub, l0c);
}

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区