Skip to content

DataCopy(L1ToBiasTable Buffer数据搬运)

产品支持情况

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

功能说明

头文件路径为:"basic_api/kernel_operator_data_copy_intf.h"

DataCopy数据搬运支持将矩阵计算用到的Bias参数从L1 Buffer移动到BiasTable Buffer。

针对Atlas A2 训练系列产品/Atlas A2 推理系列产品和Atlas A3 训练系列产品/Atlas A3 推理系列产品,BiasTable Buffer总大小为1KB。

针对Ascend 950PR/Ascend 950DT,BiasTable Buffer总大小为4KB。

函数原型

  • 连续搬运场景。

    C++
    template <typename T>
    __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const uint32_t count)
    
  • 连续或非连续搬运场景(高维切分)。

    C++
    template <typename T>
    __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyParams& repeatParams)
    
  • 连续或非连续搬运场景,支持源操作数和目的操作数数据类型不一致。

    C++
    template <typename T, typename U>
    __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<U>& src, const DataCopyParams& repeatParams)
    

参数说明

表1 模板参数说明

参数名称输入/输出含义
T、U输入操作数的数据类型。具体支持情况请参考数据类型

表2 参数说明

参数名输入/输出含义
dst输出目的操作数,类型为LocalTensor。存储位置为BiasTable Buffer(TPosition为C2),目的地址需要64字节对齐。
src输入源操作数,类型为LocalTensor,存储位置为L1 Buffer(TPosition为C1),源地址需要32字节对齐。
count输入参与搬运的元素个数。
注:count * sizeof(T)需要32字节对齐,若未对齐,搬运量会向下取整到32字节对齐。
repeatParams输入搬运参数,DataCopyParams类型。通过该参数可配置搬运的数据块大小、个数、间隔等信息,同时支持非连续和连续搬运。
上述结构体参数定义请参考${INSTALL_DIR}/asc/include/basic_api/kernel_struct_data_copy.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。参数说明见表3

表3 DataCopyParams结构体参数定义

参数名称含义
blockCount待搬运的连续传输数据块个数。uint16_t类型,取值范围:blockCount∈[0, 4095]。
注:blockCount = 0表示不执行搬运,该接口将被视为NOP(空操作)
blockLen待搬运的每个连续传输数据块长度,uint16_t类型,取值范围:blockLen∈[0, 65535]。
不同产品型号的blockLen单位不同,具体请参考约束说明
注:blockLen = 0表示不执行搬运,该接口将被视为NOP(空操作)
srcGap源操作数相邻连续数据块的间隔(前面一个数据块的尾与后面数据块的头的间隔),单位为DataBlock(32字节)。uint16_t类型,srcGap∈[0, 2^16-1]。
  • blockCount = 1时,srcGap无意义,设置为0即可。
  • blockCount ≠ 1时,当srcGap=0时,表示重复搬出源操作数的第一个数据块。
dstGap目的操作数相邻连续数据块间的间隔(前面一个数据块的尾与后面数据块的头的间隔),uint16_t类型,dstGap∈[0, 2^16-1]。
不同产品型号的dstGap单位不同,具体请参考约束说明
  • blockCount = 1时,dstGap无意义,设置为0即可。
  • blockCount ≠ 1时,当dstGap=0时,表示目的矩阵中搬入的每个数据块都会覆盖第一个数据块。

数据类型

源操作数和目的操作数支持数据类型不一样,具体请参考如下:

针对Ascend 950PR/Ascend 950DT,src支持的数据为:half、bfloat16_t、int32_t、float;dst支持的数据为:int32_t、float。

针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,src支持的数据为:half、int32_t、float;dst支持的数据为:int32_t、float。

针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,src支持的数据为:half、int32_t、float;dst支持的数据为:int32_t、float。

返回值说明

约束说明

  • dst物理内存为BiasTable Buffer,起始地址要求64字节对齐;src物理内存为L1 Buffer,起始地址要求32字节对齐。
  • blockCount取值范围:blockCount∈[0, 4095],blockCount = 0表示指令不执行,该接口将被视为NOP(空操作)。
  • srcGap∈[0, 2^16-1],dstGap∈[0, 2^16-1]。
  • 如果BiasTable Buffer中的目标dst地址溢出,将引发异常。
  • blockLen对不同型号单位不一样,具体请参考如下:
    • 针对Ascend 950PR/Ascend 950DT,单位为32字节,blockLen必须为偶数。
    • 针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,单位为64字节。
    • 针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,单位为64字节。
  • dstGap对不同型号单位不一样,具体请参考如下:
    • 针对Ascend 950PR/Ascend 950DT,单位为32字节。
    • 针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,单位为64字节。
    • 针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,单位为64字节。

调用示例

L1 Buffer->BiasTable Buffer,搬运Bias参数。

C++
// c1Addr = 128 * 1024、c2Addr = 0;__NPU_ARCH__ == 3510时c12c2Params = {1, 32, 0, 0},否则为 {1, 16, 0, 0}。
AscendC::LocalTensor<outputType> bias1Local(AscendC::TPosition::C1, c1Addr, biasSizeAlign);
AscendC::LocalTensor<outputType> bias2Local(AscendC::TPosition::C2, c2Addr, biasSizeAlign);

if constexpr (SCENARIO_NUM == 4) {
    SplitBias(bias1Local, bias2Local);
}

__aicore__ inline void SplitBias(AscendC::LocalTensor<outputType> bias1Local,
                                AscendC::LocalTensor<outputType> bias2Local)
{
#if defined(__NPU_ARCH__) && (__NPU_ARCH__ == 3510)
    AscendC::DataCopyParams c12c2Params =
        {1, static_cast<uint16_t>(biasSizeAlign * sizeof(outputType) / 32), 0, 0};
#else
    AscendC::DataCopyParams c12c2Params =
        {1, static_cast<uint16_t>(biasSizeAlign * sizeof(outputType) / 64), 0, 0};
#endif
    AscendC::DataCopy(bias2Local, bias1Local, c12c2Params);
}

完整示例请参考data_copy_gm2l1样例中场景4。

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