Div
产 品 支 持 情 况
| 产 品 | 是 否 支 持(不 传 入config的 原 型) | 是 否 支 持(传 入config的 原 型) |
|---|---|---|
Ascend 950PR/Ascend 950DT | x | √ |
Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 | √ | x |
Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 | √ | x |
Atlas 200I/500 A2 推 理 产 品 | √ | x |
Atlas 推 理 系 列 产 品AI Core | √ | x |
Atlas 推 理 系 列 产 品Vector Core | x | x |
Atlas 训 练 系 列 产 品 | √ | x |
Kirin X90 | √ | x |
Kirin 9030 | √ | x |
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_vec_binary_intf.h"。
Div属 于 双 目 矢 量 类 计 算 接 口,负 责 将 输 入 的 两 个tensor按 元 素 求 商。计 算 公 式 如 下:
$dst_i = src0_i / src1_i$
函 数 原 型
整 个tensor参 与 计 算
C++dst = src0 / src1;传 入config的 原 型
tensor前n个 数 据 连 续 计 算
C++template <typename T, const DivConfig& config = DEFAULT_DIV_CONFIG> __aicore__ inline void Div(const LocalTensor<T>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, const int32_t& count)tensor高 维 切 分 计 算
mask逐bit模 式
C++template <typename T, bool isSetMask = true, const DivConfig& config = DEFAULT_DIV_CONFIG> __aicore__ inline void Div(const LocalTensor<T>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, uint64_t mask[], const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)mask连 续 模 式
C++template <typename T, bool isSetMask = true, const DivConfig& config = DEFAULT_DIV_CONFIG> __aicore__ inline void Div(const LocalTensor<T>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, uint64_t mask, const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)
不 传 入config的 原 型
tensor前n个 数 据 连 续 计 算
C++template <typename T> __aicore__ inline void Div(const LocalTensor<T>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, const int32_t& count)tensor高 维 切 分 计 算
mask逐bit模 式
C++template <typename T, bool isSetMask = true> __aicore__ inline void Div(const LocalTensor<T>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, uint64_t mask[], const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)mask连 续 模 式
C++template <typename T, bool isSetMask = true> __aicore__ inline void Div(const LocalTensor<T>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, uint64_t mask, const uint8_t repeatTime, const BinaryRepeatParams& repeatParams)
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| T | 操 作 数 数 据 类 型。 |
| isSetMask | 是 否 在 接 口 内 部 设 置mask。 • true,表 示 在 接 口 内 部 设 置mask。 • false,表 示 在 接 口 外 部 设 置mask,开 发 者 需 要 使 用SetVectorMask接 口 设 置mask值。这 种 模 式 下,本 接 口 入 参 中 的mask值 必 须 设 置 为 占 位 符 MASK_PLACEHOLDER。具 体 使 用 方 式 可 参 考掩 码。 |
config | 该 参 数 仅 支 持Ascend 950PR/Ascend 950DT。 用 于 配 置 精 度 计 算 模 式,DivConfig类 型,定 义 如 下: enum class DivAlgo { INTRINSIC = 0, DIFF_COMPENSATION, PRECISION_1ULP_FTZ_TRUE, PRECISION_0ULP_FTZ_TRUE, PRECISION_0ULP_FTZ_FALSE, PRECISION_1ULP_FTZ_FALSE }; struct DivConfig { DivAlgo algo = DivAlgo::INTRINSIC; }; 通 过DivConfig结 构 体 的 参 数algo来 配 置 精 度 计 算 模 式。algo取 值 如 下: • DivAlgo::INTRINSIC、DivAlgo::PRECISION_1ULP_FTZ_TRUE,使 用 单 指 令 计 算 得 出 结 果,最 大 精 度 误 差 为1 ulp。 • DivAlgo::DIFF_COMPENSATION、DivAlgo::PRECISION_0ULP_FTZ_TRUE,使 用 差 值 补 偿 算 法 得 出 结 果,最 大 精 度 误 差 为0 ulp。目 前,该 算 法 支 持float数 据 类 型。 • DivAlgo::PRECISION_0ULP_FTZ_FALSE,支 持Subnormal数 据 计 算,使 用 差 值 补 偿 算 法 得 出 结 果,最 大 精 度 误 差 为0 ulp。目 前,该 算 法 支 持float数 据 类 型。 • DivAlgo::PRECISION_1ULP_FTZ_FALSE,支 持Subnormal数 据 计 算,使 用 单 指 令 计 算 得 出 结 果,最 大 精 度 误 差 为1 ulp。 该 参 数 的 默 认 值DEFAULT_DIV_CONFIG的 取 值 如 下: constexpr DivConfig DEFAULT_DIV_CONFIG = { DivAlgo::INTRINSIC }; |
表 2 参 数 说 明
| 参 数 名 | 输 入/输 出 | 描 述 |
|---|---|---|
| dst | 输 出 | 目 的 操 作 数。 类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 地 址 对 齐 约 束 参 考通 用 地 址 对 齐 约 束。 |
| src0、src1 | 输 入 | 源 操 作 数。 类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 地 址 对 齐 约 束 参 考通 用 地 址 对 齐 约 束。 两 个 源 操 作 数 的 数 据 类 型 需 要 与 目 的 操 作 数 保 持 一 致。 |
| count | 输 入 | 参 与 计 算 的 元 素 个 数。关 于 该 参 数 的 具 体 说 明 请 参 考连 续 计 算。 |
| mask[]/mask | 输 入 | mask用 于 控 制 每 次 迭 代 内 参 与 计 算 的 元 素。详 细 设 置 参 考掩 码。 |
| repeatTime | 输 入 | 重 复 迭 代 次 数。矢 量 计 算 单 元,每 次 读 取 连 续 的256Bytes数 据 进 行 计 算,为 完 成 对 输 入 数 据 的 处 理,必 须 通 过 多 次 迭 代(repeat)才 能 完 成 所 有 数 据 的 读 取 与 计 算。repeatTime表 示 迭 代 的 次 数。 关 于 该 参 数 的 具 体 说 明 请 参 考高 维 切 分。 |
| repeatParams | 输 入 | 控 制 操 作 数 地 址 步 长 的 参 数。BinaryRepeatParams类 型,包 含 操 作 数 相 邻 迭 代 间 相 同DataBlock的 地 址 步 长,操 作 数 同 一 迭 代 内 不 同DataBlock的 地 址 步 长 等 参 数。 相 邻 迭 代 间 的 地 址 步 长 参 数 说 明 请 参 考repeatStride;同 一 迭 代 内DataBlock的 地 址 步 长 参 数 说 明 请 参 考dataBlockStride。 |
数 据 类 型
- 针 对Ascend 950PR/Ascend 950DT,T支 持 的 数 据 类 型 为:int16_t、uint16_t、half、int32_t、uint32_t、float、complex32、int64_t、uint64_t、complex64。数 据 类 型complex32、int64_t、uint64_t、complex64仅 支 持tensor前n个 数 据 计 算 接 口 和 整 个tensor参 与 计 算 的 运 算 符 重 载。
- 针 对Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,T支 持 的 数 据 类 型 为:half、float。
- 针 对Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,T支 持 的 数 据 类 型 为:half、float。
- 针 对Atlas 200I/500 A2 推 理 产 品,T支 持 的 数 据 类 型 为:half、float。
- 针 对Atlas 推 理 系 列 产 品AI Core,T支 持 的 数 据 类 型 为:half、float。
- 针 对Atlas 训 练 系 列 产 品,T支 持 的 数 据 类 型 为:half、float。
- 针 对Kirin X90,T支 持 的 数 据 类 型 为:half、float。
- 针 对Kirin 9030,T支 持 的 数 据 类 型 为:half、float。
返 回 值 说 明
无
约 束 说 明
- 操 作 数 地 址 对 齐 要 求 请 参 见通 用 地 址 对 齐 约 束。
- 操 作 数 地 址 重 叠 约 束 请 参 考通 用 地 址 重 叠 约 束。
- 使 用 整 个tensor参 与 计 算 接 口 符 号 重 载 时,运 算 量 为 目 的LocalTensor的 总 长 度。
针 对 如 下 型 号,当 参 数count或repeatTime取 值 为0时,不 会 执 行 计 算 操 作,不 会 对 目 的 操 作 数 进 行 写 入,该 接 口 将 被 视 为NOP(空 操 作)。
- Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品
- Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品
调 用 示 例
tensor高 维 切 分 计 算 样 例-mask连 续 模 式
C++// repeatTime = 4, 128 elements one repeat, 512 elements total. // dstBlkStride, src0BlkStride, src1BlkStride = 1, no gap between blocks in one repeat. // dstRepStride, src0RepStride, src1RepStride = 8, no gap between repeats. AscendC::Div(dstLocal, src0Local, src1Local, 128, 4, { 1, 1, 1, 8, 8, 8 });tensor高 维 切 分 计 算 样 例-mask逐bit模 式
C++uint64_t mask[2] = { UINT64_MAX, UINT64_MAX }; // repeatTime = 4, 128 elements one repeat, 512 elements total. // dstBlkStride, src0BlkStride, src1BlkStride = 1, no gap between blocks in one repeat. // dstRepStride, src0RepStride, src1RepStride = 8, no gap between repeats. AscendC::Div(dstLocal, src0Local, src1Local, mask, 4, { 1, 1, 1, 8, 8, 8 });tensor前n个 数 据 计 算 接 口 样 例
C++AscendC::Div(dstLocal, src0Local, src1Local, 512);以 下 示 例 仅 支 持Ascend 950PR/Ascend 950DT
C++// Div 0ulp. static constexpr DivConfig config = { DivAlgo::DIFF_COMPENSATION }; Div<T, config>(dstLocalX, srcLocalX, srcLocalY, calCount); // Div Subnormal. static constexpr DivConfig config = { DivAlgo::PRECISION_0ULP_FTZ_FALSE }; Div<T, config>(dstLocalX, srcLocalX, srcLocalY, calCount);整 个tensor参 与 计 算 样 例
C++dstLocal = src0Local / src1Local;
结 果 示 例 如 下:
Bash
输 入 数 据src0Local:[1.0 2.0 3.0 ... 512.0]
输 入 数 据src1Local:[2.0 2.0 2.0 ... 2.0]
输 出 数 据dstLocal:[0.5 1.0 1.5 ... 256.0]