AddDeqRelu
产 品 支 持 情 况
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_vec_ternary_scalar_intf.h"。
依 次 计 算 按 元 素 求 和、结 果 进 行deq量 化 后 再 进 行relu计 算(结 果 和0对 比 取 较 大 值)。计 算 公 式 如 下:
$$ dst_i = Relu(Deq(src0_i + src1_i)) $$
Deq的 计 算 公 式 如 下,采 用RINT舍 入 方 式,scale需 要 通 过SetDeqScale进 行 设 置:
$$ Deq(x) = Cast(x \times scale) $$
函 数 原 型
tensor前n个 数 据 计 算
C++__aicore__ inline void AddDeqRelu(const LocalTensor<half>& dst, const LocalTensor<int32_t>& src0, const LocalTensor<int32_t>& src1, const int32_t& count)tensor高 维 切 分 计 算
mask逐bit模 式
C++template <bool isSetMask = true> __aicore__ inline void AddDeqRelu(const LocalTensor<half>& dst, const LocalTensor<int32_t>& src0, const LocalTensor<int32_t>& src1, uint64_t mask[], const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)mask连 续 模 式
C++template <bool isSetMask = true> __aicore__ inline void AddDeqRelu(const LocalTensor<half>& dst, const LocalTensor<int32_t>& src0, const LocalTensor<int32_t>& src1, uint64_t mask, const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)
操 作 数 使 用TensorTrait类 型 时,LocalTensor需 要 输 入 模 板 参 数。提 供 支 持 操 作 数 数 据 类 型 作 为 模 板 参 数 传 入 的 接 口 如 下:
tensor前n个 数 据 计 算
C++template <typename T, typename U> __aicore__ inline void AddDeqRelu(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const LocalTensor<U>& src1, const int32_t& count)tensor高 维 切 分 计 算
mask逐bit模 式
C++template <typename T, typename U, bool isSetMask = true> __aicore__ inline void AddDeqRelu(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const LocalTensor<U>& src1, uint64_t mask[], const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)mask连 续 模 式
C++template <typename T, typename U, bool isSetMask = true> __aicore__ inline void AddDeqRelu(const LocalTensor<T>& dst, const LocalTensor<U>& src0, const LocalTensor<U>& src1, uint64_t mask, const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| T | 目 的 操 作 数 的 数 据 类 型。 |
| U | 源 操 作 数 的 数 据 类 型。 |
| isSetMask | 是 否 在 接 口 内 部 设 置mask。 • true,表 示 在 接 口 内 部 设 置mask。 • false,表 示 在 接 口 外 部 设 置mask,开 发 者 需 要 使 用SetVectorMask接 口 设 置mask值。这 种 模 式 下,接 口 入 参 中 的mask值 设 置 为 占 位 符MASK_PLACEHOLDER。 |
表 2 参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| dst | 输 出 | 目 的 操 作 数。 类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 |
| src0、src1 | 输 入 | 源 操 作 数。 类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 |
| count | 输 入 | 参 与 计 算 的 元 素 个 数。 注:参 数 取 值 范 围 和 操 作 数 的 数 据 类 型 有 关,数 据 类 型 不 同,能 够 处 理 的 元 素 个 数 最 大 值 不 同,最 大 处 理 的 数 据 量 不 能 超 过UB大 小 限 制。 |
| mask[]/mask | 输 入 | mask用 于 控 制 每 次 迭 代 内 参 与 计 算 的 元 素。 设 置 详 见掩 码 操 作。 |
| repeatTime | 输 入 | 重 复 迭 代 次 数。 矢 量 计 算 单 元,每 次 读 取 连 续 的256Bytes数 据 进 行 计 算,为 完 成 对 输 入 数 据 的 处 理,必 须 通 过 多 次 迭 代(repeat)才 能 完 成 所 有 数 据 的 读 取 与 计 算。repeatTime表 示 迭 代 的 次 数。 关 于 该 参 数 的 具 体 描 述 请 参 考高 维 切 分。 |
| repeatParams | 输 入 | 控 制 操 作 数 地 址 步 长 的 参 数。BinaryRepeatParams类 型,包 含 操 作 数 相 邻 迭 代 间 相 同datablock的 地 址 步 长,操 作 数 同 一 迭 代 内 不 同datablock的 地 址 步 长 等 参 数。 相 邻 迭 代 间 的 地 址 步 长 参 数 说 明 请 参 考repeatStride;同 一 迭 代 内DataBlock的 地 址 步 长 参 数 说 明 请 参 考dataBlockStride。 |
数 据 类 型
表 3 数 据 类 型 组 合 情 况
| src0、src1数 据 类 型 | dst数 据 类 型 |
|---|---|
| int32_t | half |
返 回 值 说 明
无
约 束 说 明
地 址 对 齐 约 束 参 考地 址 对 齐 约 束。
操 作 数 地 址 重 叠 约 束 请 参 考地 址 重 叠 约 束。
该 接 口 需 要 与
SetDeqScale配 合 使 用,关 系 映 射 表 如 下:AddDeqRelu使 用 场 景 对 应 使 用 的 SetDeqScale函 数 原 型输 入 类 型 为int32_t __aicore__ inline void SetDeqScale(half scale)本 接 口 涉 及 临 时 空 间 的 使 用,计 算 公 式 如 下,当 计 算 数 据 量 小 于 等 于2K(2048)时,使 用 的 临 时 空 间 与 计 算 数 据 量 线 性 相 关,当 数 据 量 大 于2K时,临 时 空 间 大 小 固 定 为8KB: $$ tmpSize = \begin{cases} count * sizeof(int32_t), & \text{if } count \le 2K \ 8K, & \text{if } count \gt 2K \end{cases} $$
调 用 示 例
本 样 例 的srcLocal为int32_t类 型,dstLocal为half类 型,计 算mask时 以int32_t为 准。
tensor高 维 切 分 计 算 样 例-mask连 续 模 式。
C++uint64_t mask = 256 / sizeof(int32_t); // 64 // repeatTime = 4,一 次 迭 代 计 算64个 数,共 计 算256个 数 // dstBlkStride, src0BlkStride, src1BlkStride = 1,单 次 迭 代 内 数 据 连 续 读 取 和 写 入 // dstRepStride = 4,src0RepStride, src1RepStride = 8,相 邻 迭 代 间 数 据 连 续 读 取 和 写 入 half scale = 0.1; AscendC::SetDeqScale(scale); AscendC::AddDeqRelu(dstLocal, src0Local, src1Local, mask, 4, { 1, 1, 1, 4, 8, 8 });tensor高 维 切 分 计 算 样 例-mask逐bit模 式。
C++uint64_t mask[2] = { UINT64_MAX, UINT64_MAX }; // repeatTime = 4,一 次 迭 代 计 算64个 数,共 计 算256个 数 // dstBlkStride, src0BlkStride, src1BlkStride = 1,单 次 迭 代 内 数 据 连 续 读 取 和 写 入 // dstRepStride = 4,src0RepStride, src1RepStride = 8,相 邻 迭 代 间 数 据 连 续 读 取 和 写 入 half scale = 0.1; AscendC::SetDeqScale(scale); AscendC::AddDeqRelu(dstLocal, src0Local, src1Local, mask, 4, { 1, 1, 1, 4, 8, 8 });tensor前n个 数 据 计 算 样 例。
C++half scale = 0.1; AscendC::SetDeqScale(scale); AscendC::AddDeqRelu(dstLocal, src0Local, src1Local, 512);
结 果 示 例 如 下:
输 入 数 据src0Local:[70 36 43 54 28 49 27 82 95 ...]
输 入 数 据src1Local:[19 33 34 50 42 2 97 93 99 ...]
输 出 数 据dstLocal:[8.9 6.9 7.7 10.4 7.0 5.1 12.4 17.5 19.4 ...]