Skip to content

DataCopy(L0C Buffer到UB数据搬运)

产品支持情况

说明: 本接口搬运功能仅在Atlas 推理系列产品AI Core产品型号的L0C Buffer->UB(CO1 -> CO2)通路支持。其他型号和其他通路支持接口调用但功能不生效,功能等同于基础数据搬运。

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

功能说明

对数据搬运能力进行增强,相比于基础数据搬运接口,增加了L0C Buffer->Unified Buffer(UB)通路的随路计算。

函数原型

  • Local Memory -> Local Memory

    C++
    template <typename T>
    __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const DataCopyParams& intriParams, const DataCopyEnhancedParams& enhancedParams)
    
  • Local Memory -> Local Memory,支持源操作数和目的操作数类型不一致。

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

说明: 各原型支持的具体数据通路和数据类型,请参考数据类型

参数说明

表1 模板参数说明

参数名描述
T、U操作数的数据类型。支持的数据类型请参考数据类型

表2 参数说明

参数名称输入/输出含义
dst输出目的操作数,类型为LocalTensor。
src输入源操作数,类型为LocalTensor。
intriParams输入搬运参数。DataCopyParams类型。
enhancedParams输入增强信息参数。DataCopyEnhancedParams类型。
具体定义请参考${INSTALL_DIR}/asc/include/basic_api/kernel_struct_data_copy.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。

表3 DataCopyEnhancedParams结构参数说明

参数名称含义
blockMode数据搬运基本分形,BlockMode枚举类型,支持以下配置:
  • BLOCK_MODE_NORMAL:表示传输单位为32字节。当前暂不支持。
  • BLOCK_MODE_MATRIX:表示传输单位为一个16 * 16的cube分形。
  • BLOCK_MODE_VECTOR:表示传输单位为一个1 * 16的cube分形。
  • BLOCK_MODE_SMALL_CHANNEL:表示传输单位为一个16 * 4的cube分形。当前暂不支持。
  • BLOCK_MODE_DEPTHWISE:表示传输单位为一个16 * 16的cube分形,提供随路channel-split功能。当前暂不支持。
每种模式下对应的blockLen等参数单位见表4
deqScale随路精度转换辅助参数,即量化模式,支持的量化模式取值和对应的数据类型等信息请参考表5。其中DEQ、DEQ8、DEQ16模式,需要传入deqValue量化系数,设置deqValue的对应比特位;VDEQ、VDEQ8、VDEQ16模式,需要传入包含16个元素(deqValue)的量化参数向量,设置deqTensorAddr的对应比特位,同时保证DEQADDR中存储的反量化参数向量的每个元素(deqValue)都符合预期和使用限制。
VDEQ模式下,反量化参数向量长度为32字节(16个half元素);其他模式下,反量化参数向量长度为128字节(16个64bit的反量化元素)。
deqValue量化系数。 deqValue的配置方式请参考deqValue配置方式
deqTensorAddrUB中存储反量化参数向量的起始地址。deqScale为VDEQ/VDEQ8/VDEQ16模式时,需要传入反量化运算时的参数向量的地址。该地址要满足32字节对齐。
对于VDEQ模式,该地址指向32字节大小的反量化参数向量,其中每个元素大小为16bit(half)。
对于VDEQ8、VDEQ16模式,反量化参数向量中的每个元素大小都为64bit。搬运时会搬运blockCount个连续传输数据块,每个数据块的长度为blockLen。每个数据块对应一个128字节的反量化向量。对于同一个数据块,反量化参数向量中的16个元素会被连续复用。不同的数据块,对应不同的反量化参数向量,地址会相应的偏移12。例如:假设对应起始地址为A,第一个数据块的12反量化参数向量起始地址为A,第二个数据块的12反量化参数向量起始地址为A + 12。
同一个反量化参数向量的每一个元素的MCB标志位必须一致。
sidStoreMode用于deqScale为DEQ8/VDEQ8时配置存储模式,控制反量化结果如何存储在dst地址中。配置效果参考sidStoreMode配置示意图
  • 0:dst的数据存储在每个DataBlock的前半段,即每32字节的高16字节;
  • 1:dst的数据存储在每个DataBlock的后半段,即每32字节的低16字节;
  • 2:dst的数据存储在完整的DataBlock中,即整个32字节。
isRelu配置是否可以随路做线性整流操作。配置deqValue的情况下,如果该参数被置为true,那么会刷新deqValue的ReLU标志位为1;如果被置为false,则不会做修改。配置deqTensorAddr的情况下,反量化参数向量元素中的ReLU标志位不生效,以isRelu为准。
仅配置isRelu,不配置量化参数,即deqValue配置为DEQ_NONE场景,支持src和dst的数据类型组合如下:{half,half},{float,float},{int32_t,int32_t},{float,half};同时配置isRelu和量化参数的场景,支持的数据类型组合参考表5
padMode预留参数,当前暂不支持。

表4 不同blockMode对应的参数单位

blockModesrcdst数据类型blockLen单位srcStride单位dstStride单位
BLOCK_MODE_MATRIXL0C Buffer(CO1)UB(CO2)half、int16_t、uint16_t512B512B32B
BLOCK_MODE_MATRIXL0C Buffer(CO1)UB(CO2)float、int32_t、uint32_t1024B1024B32B
BLOCK_MODE_VECTORL0C Buffer(CO1)UB(CO2)half、int16_t、uint16_t32B512B32B
BLOCK_MODE_VECTORL0C Buffer(CO1)UB(CO2)float、int32_t、uint32_t64B1024B32B

表5 deqScale参数列表

量化模式src.dtypedst.dtype配合使用的参数
DEQint32_thalfdeqValue中的变量M
DEQhalfhalfdeqValue中的变量M
DEQ8int32_tint8_t• deqValue
  •变量M
  •变量N
  • MCB标志位
  • Offset
  • Sign标志位
  • ReLU标志位
  • isRelu
DEQ8int32_tuint8_t• deqValue
  •变量M
  •变量N
  • MCB标志位
  • Offset
  • Sign标志位
  • ReLU标志位
  • isRelu
DEQ16int32_thalf• deqValue
  •变量M
  •变量N
  • MCB标志位
  • ReLU标志位
  • isRelu
DEQ16int32_tint16_t• deqValue
  •变量N
  • ReLU标志位
  • isRelu
VDEQint32_thalfdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。
  • deqTensorAddr
  • DEQADDR
  • ReLU标志位
  • isRelu
VDEQ8int32_tint8_tdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。
  • deqTensorAddr
  • DEQADDR
  • ReLU标志位
  • isRelu
VDEQ8int32_tuint8_tdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。
  • deqTensorAddr
  • DEQADDR
  • ReLU标志位
  • isRelu
VDEQ16int32_thalfdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。
  • deqTensorAddr
  • DEQADDR
  • ReLU标志位
  • isRelu
VDEQ16int32_tint16_tdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。
  • deqTensorAddr
  • DEQADDR
  • ReLU标志位
  • isRelu

表6 deqValue配置方式

模式比特位数变量名作用介绍
DEQ8、VDEQ8、DEQ16、VDEQ160~31M32位数视为float,作为反量化计算所需要乘的值。src为int32_t,dst为int16_t的场景下,变量M不生效。
DEQ8、VDEQ8、DEQ16、VDEQ1632~35N4位比特位,表示范围为[1, 16](b'0000对应表示1,b'1111对应表示16)。
当模式为DEQ8、VDEQ8时,MCB标志位置为1时,将输入的值进行右移N比特位。当模式为DEQ16、VDEQ16并且dst数据类型为int16_t时,直接进行N位的右移,不受MCB标志位控制。
DEQ8、VDEQ8、DEQ16、VDEQ1636MCB标志位Mode Control Bit。如果置为0,输入的int32_t会被直接转换为float。如果置为1,输入的int32_t会先右移N比特位,转变成int16_t,然后转换为float。
DEQ8、VDEQ8、DEQ16、VDEQ1637~45Offset9bit的整型数据,在进行反量化src * M的计算结果后与Offset进行相加。仅在DEQ8、VDEQ8模式中会用到。如果不使用offset,请置为0。
DEQ8、VDEQ8、DEQ16、VDEQ1646Sign标志位如果置为1,表明反量化结果是signed(int8);如果置为0,表明反量化结果是unsigned(uint8)。仅在DEQ8、VDEQ8模式中会用到。
DEQ8、VDEQ8、DEQ16、VDEQ1647ReLU标志位如果置为1,对最终结果进行ReLU计算;如果置为0,不进行额外计算。
  •对于int32_t->int8_t,配置ReLU时,offset必须配置成-128;
  •对于int32_t->uint8_t,配置ReLU时,offset必须配置成0。
DEQ8、VDEQ8、DEQ16、VDEQ1648~63-预留
DEQ、VDEQ0 ~ 15M这16位数被视为half,作为反量化计算需要乘的值。

图1 sidStoreMode配置示意图

数据类型

源操作数和目的操作数的数据类型保持一致时,支持的数据类型为:half、float、int32_t、uint32_t。

表7 源操作数和目的操作数的数据类型不一致时的支持情况

源操作数的数据类型目的操作数的数据类型
floathalf
int32_tint8_t、uint8_t、int16_t、half。

返回值说明

约束说明

  • 开发者需要保证DataCopyEnhancedParams中的isRelu参数配置和量化系数deqValue/量化参数向量deqTensorAddr的ReLU标志位配置一致:都开启或都不开启。
  • 如果有随路精度转换,操作数的blockLen单位需要减半。

调用示例

  • Local Memory -> Local Memory

    C++
    // srcLocal、dstLocal为half类型的LocalTensor
    // 使用传入DataCopyParams参数的搬运接口,支持连续和非连续搬运
    DataCopyParams intriParams;
    intriParams.blockCount = 1; // 连续数据块个数为1
    intriParams.blockLen = 512 * sizeof(half) / 32; // 连续数据块长度,单位为DataBlock,此处长度为512个half元素
    intriParams.srcGap = 0; // 源操作数做连续搬运
    intriParams.dstGap = 0; // 目的操作数连续排布
    DataCopyEnhancedParams enhancedParams;
    enhancedParams.blockMode = BlockMode::BLOCK_MODE_MATRIX; // 传输单位为16*16的cube分形
    enhancedParams.deqScale = DeqScale::DEQ_NONE; // 不做量化
    enhancedParams.deqValue = 0;
    enhancedParams.deqTensorAddr = 0;
    enhancedParams.sidStoreMode = 0; // 仅deqScale为DEQ8/VDEQ8时生效
    enhancedParams.isRelu = false; // 不支持ReLU
    enhancedParams.padMode = pad_t::PAD_NONE; // 预留参数
    // 功能等同基础数据搬运
    AscendC::DataCopy(dstLocal, srcLocal, intriParams, enhancedParams);
    
  • Local Memory -> Local Memory,源操作数与目的操作数类型不一致

    C++
    // 以下示例为L0C Buffer -> UB通路的数据搬运,仅在Atlas 推理系列产品AI Core场景下支持。srcLocal为int32_t类型的L0C Buffer上的LocalTensor,dstLocal为int8_t类型的UB上的LocalTensor
    // 使用传入DataCopyParams参数的搬运接口,支持连续和非连续搬运
    DataCopyParams intriParams;
    intriParams.blockCount = 1; // 连续数据块个数为1
    intriParams.blockLen = 512 * sizeof(half) / 32; // 连续数据块长度,单位为DataBlock,此处长度为512个half元素
    intriParams.srcGap = 0; // 源操作数做连续搬运
    intriParams.dstGap = 0; // 目的操作数连续排布
    DataCopyEnhancedParams enhancedParams;
    enhancedParams.blockMode = BlockMode::BLOCK_MODE_MATRIX; // 传输单位为16*16的cube分形
    enhancedParams.deqScale = DeqScale::DEQ8; // int32_t -> int8_t量化模式,配合deqValues使用
    enhancedParams.deqValue = 70369809530880; // float 1 = uint64_t 1065353216, when s322s8 use 1065353216 | (1 << 46)
    enhancedParams.deqTensorAddr = 0; // 仅VDEQ模式下使用
    enhancedParams.sidStoreMode = 2; // dstLocal的数据存储在完整的DataBlock中
    enhancedParams.isRelu = false; // 不支持ReLU
    enhancedParams.padMode = pad_t::PAD_NONE; // 预留参数
    // 此时dstLocal = srcLocal
    AscendC::DataCopy(dstLocal, srcLocal, intriParams, enhancedParams);
    

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