Skip to content
版 本

Gatherb(ISASI)

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品

Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品

Atlas 200I/500 A2 推 理 产 品

Atlas 推 理 系 列 产 品AI Core

x

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

x

功 能 说 明

头 文 件 路 径 为:"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(存 储 位 置 为Unified Buffer)。

LocalTensor的 起 始 地 址 需 要 按 照32字 节 对 齐。
src输 入源 操 作 数,类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT(存 储 位 置 为Unified Buffer)。

LocalTensor的 起 始 地 址 需 要 按 照32字 节 对 齐。
offset输 入每 个DataBlock在 源 操 作 数 中 对 应 的 地 址 偏 移,类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT(存 储 位 置 为Unified Buffer)。

LocalTensor的 起 始 地 址 需 要 按 照32字 节 对 齐。

该 偏 移 量 是 相 对 于src的 基 地 址 而 言 的。每 个 元 素 值 要 大 于 等 于0,单 位 为 字 节,取 值 要 求 如 下:
•取 值 应 保 证src元 素 类 型 位 宽 对 齐。
•偏 移 地 址 后 需 要32字 节 对 齐。
•偏 移 地 址 后 不 能 超 出UB大 小 数 据 的 范 围。
•地 址 偏 移 的 取 值 范 围:不 能 超 出uint32_t的 范 围。
repeatTime输 入指 令 迭 代 次 数,每 次 迭 代 完 成8个DataBlock的 数 据 收 集,取 值 范 围:repeatTime∈[0,255]。

注:repeatTime = 0表 示 不 会 执 行 计 算 操 作,不 会 对 目 的 操 作 数 进 行 写 入,该 接 口 将 被 视 为NOP(空 操 作)。
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地 址 对 齐 约 束
  • 不 支 持 源 操 作 数 与 目 的 操 作 数 使 用 同 一 块 内 存 地 址。

调 用 示 例

完 整 使 用 样 例 请 参 见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 分 支 自 动 编 译 生 成,属 于 持 续 开 发 版 本,可 能 存 在 缺 陷,仅 供 预 览 与 参 考。如 需 稳 定 及 商 用 资 料,请 查 阅 官 方 昇 腾 社 区