CANN/asc-devkit Gatherb函数API文档

📅 2026/7/15 15:05:39
CANN/asc-devkit Gatherb函数API文档
Gatherb(ISASI)产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品 / Atlas A3 推理系列产品√Atlas A2 训练系列产品 / Atlas A2 推理系列产品√功能说明给定一个输入的张量和一个地址偏移张量本接口根据偏移地址按照DataBlock的粒度将输入张量收集到结果张量中。函数原型template typename T __aicore__ inline void Gatherb(const LocalTensorT dst, const LocalTensorT src, const LocalTensoruint32_t offset, const uint8_t repeatTime, const GatherRepeatParams repeatParams)参数说明表 1模板参数说明参数名描述T操作数数据类型。Ascend 950PR/Ascend 950DT支持的数据类型为int8_t/uint8_t/int16_t/uint16_t/int32_t/uint32_t/half/float/bfloat16_t/uint64_t/int64_tAtlas A3 训练系列产品 / Atlas A3 推理系列产品支持的数据类型为uint16_t/uint32_tAtlas A2 训练系列产品 / Atlas A2 推理系列产品支持的数据类型为uint16_t/uint32_t表 2参数说明参数名称输入/输出含义dst输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。LocalTensor的起始地址需要32字节对齐。src输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。LocalTensor的起始地址需要32字节对齐。源操作数的数据类型需要与目的操作数保持一致。offset输入每个datablock在源操作数中对应的地址偏移。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。LocalTensor的起始地址需要32字节对齐。该偏移量是相对于src的基地址而言的。每个元素值要大于等于0单位为字节且需要保证偏移后的地址满足32字节对齐。repeatTime输入重复迭代次数每次迭代完成8个datablock的数据收集数据范围repeatTime∈0,255]。repeatParams输入用于控制指令迭代的相关参数。类型为GatherRepeatParams具体定义可参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_gather.h。${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。其中dstBlkStride、dstRepStride支持用户配置参数说明参考表3。表 3GatherRepeatParams结构体参数说明参数名称含义dstBlkStride单次迭代内矢量目的操作数不同datablock间的地址步长。dstRepStride相邻迭代间矢量目的操作数相同datablock间的地址步长。blockNumber预留参数。为后续的功能做保留开发者暂时无需关注使用默认值即可。src0BlkStridesrc1BlkStridesrc0RepStridesrc1RepStriderepeatStrideModestrideSizeMode约束说明无调用示例#include kernel_operator.h AscendC::TPipe tpipe; AscendC::TQueAscendC::TPosition::VECIN, 2 vecIn; AscendC::TQueAscendC::TPosition::VECIN, 2 vecOffset; AscendC::TQueAscendC::TPosition::VECOUT, 2 vecOut; uint32_t bufferLen 0; uint32_t len 128; bufferLen len; tpipe.InitBuffer(vecIn, 2, bufferLen * sizeof(uint16_t)); tpipe.InitBuffer(vecOffset, 2, 8 * sizeof(uint32_t)); tpipe.InitBuffer(vecOut, 2, bufferLen * sizeof(uint16_t)); auto x_buf vecIn.AllocTensoruint16_t(); auto offset_buf vecOffset.AllocTensoruint32_t(); AscendC::DataCopy(x_buf, x_gm[index * bufferLen], bufferLen); AscendC::DataCopy(offset_buf, offset_gm[0], 8); vecIn.EnQue(x_buf); vecOffset.EnQue(offset_buf); auto y_buf vecOut.DeQueuint16_t(); AscendC::DataCopy(y_gm[index * bufferLen], y_buf, bufferLen); vecOut.FreeTensor(y_buf); auto x_buf vecIn.DeQueuint16_t(); auto offset_buf vecOffset.DeQueuint32_t(); auto y_buf vecOut.AllocTensoruint16_t(); AscendC::GatherRepeatParams params{1, 8}; uint8_t repeatTime bufferLen * sizeof(uint16_t) / 256; AscendC::Gatherbuint16_t(y_buf, x_buf, offset_buf, repeatTime, params); vecIn.FreeTensor(x_buf); vecOffset.FreeTensor(offset_buf); vecOut.EnQue(y_buf);结果示例输入数据(offsetLocal): [224 192 160 128 96 64 32 0] 输入数据(srcLocal): [0 1 2 3 4 5 6 7 ... 120 121 122 123 124 125 126 127] 输出数据(dstGlobal):[ 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ... 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考