Gatherb(ISASI)
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"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
]