CANN/asc-devkit:L0C到UB数据搬运

📅 2026/7/16 22:52:55
CANN/asc-devkit:L0C到UB数据搬运
# L0C Buffer到UB数据搬运DataCopy【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况说明本接口搬运功能仅在Atlas 推理系列产品AI Core产品型号的L0C Buffer-UBCO1 - 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 BufferUB通路的随路计算。函数原型Local Memory - Local Memorytemplate typename T __aicore__ inline void DataCopy(const LocalTensorT dst, const LocalTensorT src, const DataCopyParams intriParams, const DataCopyEnhancedParams enhancedParams)Local Memory - Local Memory支持源操作数和目的操作数类型不一致。template typename T, typename U __aicore__ inline void DataCopy(const LocalTensorT dst, const LocalTensorU 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/interface/kernel_struct_data_copy.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。表3DataCopyEnhancedParams结构参数说明参数名称含义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字节大小的反量化参数向量其中每个元素大小为16bithalf。对于VDEQ8、VDEQ16模式反量化参数向量中的每个元素大小都为64bit。搬运时会搬运blockCount个连续传输数据块每个数据块的长度为blockLen。每个数据块对应一个128字节的反量化向量。对于同一个数据块反量化参数向量中的16个元素会被连续复用。不同的数据块对应不同的反量化参数向量地址会相应的偏移12。例如假设对应起始地址为A第一个数据块的12反量化参数向量起始地址为A第二个数据块的12反量化参数向量起始地址为A 12。同一个反量化参数向量的每一个元素的MCB标志位必须一致。sidStoreMode用于deqScale为DEQ8/VDEQ8时配置存储模式控制反量化结果如何存储在dst地址中。配置效果参考sidStoreMode配置示意图。• 0dst的数据存储在每个DataBlock的前半段即每32字节的高16字节• 1dst的数据存储在每个DataBlock的后半段即每32字节的低16字节• 2dst的数据存储在完整的DataBlock中即整个32字节。isRelu配置是否可以随路做线性整流操作。配置deqValue的情况下如果该参数被置为true那么会刷新deqValue的ReLU标志位为1如果被置为false则不会做修改。配置deqTensorAddr的情况下反量化参数向量元素中的ReLU标志位不生效以isRelu为准。仅配置isRelu不配置量化参数即deqValue配置为DEQ_NONE场景支持src和dst的数据类型组合如下{halfhalf}{floatfloat}{int32_tint32_t}{floathalf}同时配置isRelu和量化参数的场景支持的数据类型组合参考表5。padMode预留参数当前暂不支持。表4不同blockMode对应的参数单位blockModesrcdst数据类型blockLen单位srcStride单位dstStride单位BLOCK_MODE_MATRIXCO1CO2half、int16_t、uint16_t512B512B32BBLOCK_MODE_MATRIXCO1CO2float、int32_t、uint32_t1024B1024B32BBLOCK_MODE_VECTORCO1CO2half、int16_t、uint16_t32B512B32BBLOCK_MODE_VECTORCO1CO2float、int32_t、uint32_t64B1024B32B表5deqScale参数列表量化模式src.dtypedst.dtype配合使用的参数DEQint32_thalfdeqValue中的变量MDEQhalfhalfdeqValue中的变量MDEQ8int32_tint8_t• deqValue•变量M•变量N• MCB标志位• Offset• Sign标志位• ReLU标志位• isReluDEQ8int32_tuint8_t• deqValue•变量M•变量N• MCB标志位• Offset• Sign标志位• ReLU标志位• isReluDEQ16int32_thalf• deqValue•变量M•变量N• MCB标志位• ReLU标志位• isReluDEQ16int32_tint16_t• deqValue•变量N• ReLU标志位• isReluVDEQint32_thalfdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。• deqTensorAddr• DEQADDR• ReLU标志位• isReluVDEQ8int32_tint8_tdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。• deqTensorAddr• DEQADDR• ReLU标志位• isReluVDEQ8int32_tuint8_tdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。• deqTensorAddr• DEQADDR• ReLU标志位• isReluVDEQ16int32_thalfdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。• deqTensorAddr• DEQADDR• ReLU标志位• isReluVDEQ16int32_tint16_tdeqTensorAddr地址存储的反量化参数向量中的元素deqValue支持配置的参数分别对应DEQ/DEQ8/DEQ16的说明。• deqTensorAddr• DEQADDR• ReLU标志位• isRelu表6deqValue配置方式模式比特位数变量名作用介绍DEQ8、VDEQ8、DEQ16、VDEQ160~31M32位数视为float作为反量化计算所需要乘的值。src为int32_tdst为int16_t的场景下变量M不生效。DEQ8、VDEQ8、DEQ16、VDEQ1632~35N4位比特位表示范围为[1, 16]b0000对应表示1b1111对应表示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作为反量化计算需要乘的值。图1sidStoreMode配置示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/sidStoreMode配置示意图.png sidStoreMode配置示意图?utm_sourcegitcode_repo_files)数据类型源操作数和目的操作数的数据类型保持一致时支持的数据类型为half、float、int32_t、uint32_t。表7源操作数和目的操作数的数据类型不一致时的支持情况源操作数的数据类型目的操作数的数据类型floathalfint32_tint8_t、uint8_t、int16_t、half。返回值说明无约束说明开发者需要保证DataCopyEnhancedParams中的isRelu参数配置和量化系数deqValue/量化参数向量deqTensorAddr的ReLU标志位配置一致都开启或都不开启。如果有随路精度转换操作数的blockLen单位需要减半。调用示例Local Memory - Local Memory// 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源操作数与目的操作数类型不一致// 以下示例为L0C Buffer - UB通路的数据搬运仅在Atlas 推理系列产品AI Core场景下支持。srcLocal为int32_t类型的L0C Buffer上的LocalTensordstLocal为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本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考