Skip to content

Gatherb(ISASI)

产品支持情况

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

功能说明

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

Gatherb接口接受输入张量(src)、DataBlock偏移张量(offset),根据索引位置将输入张量按DataBlock(32字节)收集到结果张量(dst)中。

接口计算原理和参考伪代码如下:

Python
import numpy as np

def Gatherb(dst, src, offset, repeatTime, repeatParams):
    inputType = np.dtype("uint16")
    outputType = np.dtype("uint16")
    oneDataBlockSize = 32;
    if repeatParams.dstBlkStride == 0:
        repeatParams.dstBlkStride = 1
    for i in range(repeatTime): 
        for j in range(8):
            srcBlockStartIndex = offset[i * 8 + j] // inputType.itemsize
            srcBlockEndIndex = srcBlockStartIndex + oneDataBlockSize // inputType.itemsize
            dstBlockStartIndex = (i * oneDataBlockSize * repeatParams.dstRepStride + j * oneDataBlockSize * repeatParams.dstBlkStride) // outputType.itemsize
            dstBlockEndIndex = (i * oneDataBlockSize * repeatParams.dstRepStride + j * oneDataBlockSize * repeatParams.dstBlkStride + oneDataBlockSize) // outputType.itemsize
            dst[dstBlockStartIndex : dstBlockEndIndex] = src[srcBlockStartIndex : srcBlockEndIndex]

完整示例请参考:Gatherb真值计算

函数原型

C++
template <typename T>
__aicore__ inline void Gatherb(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& offset, const uint8_t repeatTime, const GatherRepeatParams& repeatParams)

参数说明

表1 模板参数说明

参数名描述
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,单位为字节。取值要求见约束说明
repeatTime输入指令迭代次数,每次迭代完成8个DataBlock的数据收集,取值范围:repeatTime∈[0,255]。
repeatParams输入用于控制指令迭代的相关参数。

GatherRepeatParams参数说明请参考表3

表3 GatherRepeatParams结构体内参数说明

参数名称含义
dstBlkStride单次迭代内,矢量目的操作数不同DataBlock间地址步长,单位为DataBlock。

:当dstBlkStride值为0时,默认按照1来处理。
dstRepStride相邻迭代间,矢量目的操作数相同DataBlock地址步长,单位为DataBlock。
blockNumber:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。
src0BlkStride:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。
src1BlkStride:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。
src0RepStride:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。
src1RepStride:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。
repeatStrideMode:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。
strideSizeMode:预留的扩展参数,当前因后续架构升级,该参数已废弃,不对其进行业务处理。

数据类型

Ascend 950PR/Ascend 950DT,支持的数据类型为:int8_t、uint8_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、int64_t、uint64_t。

Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持的数据类型为:uint16_t、uint32_t。

Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持的数据类型为:uint16_t、uint32_t。

Atlas 200I/500 A2 推理产品,支持的数据类型为:int8_t、uint8_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、int64_t。

约束说明

  • 操作数地址对齐要求请参见Unified Buffer地址对齐约束
  • 不支持源操作数与目的操作数使用同一块内存地址。
  • offset的取值要求如下:
    • 取值应保证src元素类型位宽对齐。
    • 偏移地址后需要32字节对齐。
    • 偏移地址后不能超出UB大小数据的范围。
    • 地址偏移的取值范围:不能超出uint32_t的范围。
  • repeatTime取值范围:repeatTime∈[0,255]。
  • 当参数count或repeatTime取值为0时,该接口的行为如下:
    • 针对如下型号,当参数repeatTime取值为0时,不会执行计算操作,不会对目的操作数进行写入,该接口将被视为NOP(空操作)。
      • Atlas A3 训练系列产品/Atlas A3 推理系列产品
      • Atlas A2 训练系列产品/Atlas A2 推理系列产品
    • 针对Ascend 950PR/Ascend 950DT,该接口通过VF调用Reg矢量计算API实现兼容,当参数repeatTime取值为0时,不保证该接口被视为NOP(空操作)。
  • 针对如下型号,当dstBlkStride取值为0时,默认按照1来处理。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品

调用示例

完整使用样例请参见Gather类样例场景四。

C++
uint32_t bufferLen = 128;
AscendC::GatherRepeatParams params{1, 8};
uint8_t repeatTime = bufferLen * sizeof(uint16_t) / 256;
AscendC::Gatherb<uint16_t>(y_buf, x_buf, offset_buf, repeatTime, params); // repeatTime重复迭代次数,每次迭代完成8个datablock的数据收集

结果示例:

输入数据(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
]

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