ReduceSum
产 品 支 持 情 况
| 产 品 | 是 否 支 持 |
|---|---|
Ascend 950PR/Ascend 950DT | √ |
Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品 | √ |
Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品 | √ |
Atlas 200I/500 A2 推 理 产 品 | √ |
Atlas 推 理 系 列 产 品 AI Core | √ |
Atlas 推 理 系 列 产 品 Vector Core | x |
Atlas 训 练 系 列 产 品 | √ |
Kirin X90 | √ |
Kirin 9030 | √ |
功 能 说 明
头 文 件 路 径 为:"basic_api/kernel_operator_vec_reduce_intf.h"。
ReduceSum接 口 对 所 有 输 入 数 据 进 行 求 和,计 算 过 程 如 下。

函 数 原 型
tensor前n个 数 据 计 算:
C++template <typename T, bool isSetMask = true> __aicore__ inline void ReduceSum(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<T>& sharedTmpBuffer, const int32_t count)tensor高 维 切 分 计 算:
mask逐bit模 式:C++template <typename T> __aicore__ inline void ReduceSum(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<T>& sharedTmpBuffer, const uint64_t mask[], const int32_t repeatTime, const int32_t srcRepStride)mask连 续 模 式:C++template <typename T> __aicore__ inline void ReduceSum(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<T>& sharedTmpBuffer, const int32_t mask, const int32_t repeatTime, const int32_t srcRepStride)
参 数 说 明
表 1 模 板 参 数 说 明
| 参 数 名 | 描 述 |
|---|---|
| T | 操 作 数 数 据 类 型。 |
| isSetMask | 保 留 参 数,设 置 无 效。 |
表 2 参 数 说 明
| 参 数 名 称 | 输 入/输 出 | 含 义 |
|---|---|---|
| dst | 输 出 | 目 的 操 作 数。 类 型 为LocalTensor,支 持 的TPosition为VECIN、VECCALC、VECOUT(存 储 位 置 为Unified Buffer)。 |
| src | 输 入 | 源 操 作 数。 类 型 为LocalTensor,支 持 的TPosition为VECIN、VECCALC、VECOUT(存 储 位 置 为Unified Buffer)。 |
| sharedTmpBuffer | 输 入 | 指 令 执 行 期 间 存 储 中 间 结 果,用 于 内 部 计 算 所 需 操 作 空 间,需 特 别 注 意 空 间 大 小。详 情 请 参 考关 键 特 性 说 明。 类 型 为LocalTensor,支 持 的TPosition为VECIN、VECCALC、VECOUT(存 储 位 置 为Unified Buffer)。 |
| count | 输 入 | 参 与 计 算 的 元 素 个 数。关 于 该 参 数 的 具 体 说 明 请 参 考连 续 计 算。最 大 处 理 的 数 据 量 不 能 超 过UB大 小 限 制。 |
| mask/mask[] | 输 入 | mask用 于 控 制 每 次 迭 代 内 参 与 计 算 的 源 操 作 数。详 细 设 置 参 考掩 码 概 述。 |
| repeatTime | 输 入 | 迭 代 次 数。关 于 该 参 数 的 具 体 描 述 请 参 考高 维 切 分。注:与 高 维 切 分 中 不 同 的 是,repeatTime可 以 支 持 更 大 的 取 值 范 围,保 证 不 超 过int32_t的 最 大 值 即 可。 |
| srcRepStride | 输 入 | 源 操 作 数 相 邻 迭 代 间 的 地 址 步 长,即 源 操 作 数 每 次 迭 代 跳 过 的DataBlock数 目。取 值 范 围 为[0, $2^{16}-1$]。 |
注:以 上 高 维 切 分 相 关 参 数mask,repeatTime,srcRepStride请 参 考高 维 切 分中 的 介 绍。
数 据 类 型
支 持 的 数 据 类 型 如 下:
- Ascend 950PR/Ascend 950DT,支 持half、float、int64_t、uint64_t。
- Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,支 持half、float。
- Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,支 持half、float。
- Atlas 200I/500 A2 推 理 产 品,支 持half、float。
- Atlas 推 理 系 列 产 品 AI Core,支 持half、float。
- Atlas 训 练 系 列 产 品,支 持half。
- Kirin X90,支 持half、float。
- Kirin 9030,支 持half、float。
返 回 值 说 明
无
约 束 说 明
- 源 操 作 数 及
sharedTmpBuffer的 地 址 对 齐 约 束 请 参 考通 用 地 址 对 齐 约 束,起 始 地 址 需 要32字 节 对 齐;目 的 操 作 数 的 起 始 地 址 对 齐 约 束 请 参 考ReduceRepeat-表3。 - 操 作 数 地 址 重 叠 约 束 请 参 考通 用 地 址 重 叠 约 束。
- 需 要 使 用
sharedTmpBuffer的 情 况 下,支 持dst与sharedTmpBuffer地 址 重 叠(通 常 情 况 下dst比sharedTmpBuffer所 需 的 空 间 要 小),此 时sharedTmpBuffer必 须 满 足 所 需 空 间 要 求,详 情 请 参 考关 键 特 性 说 明。
- 针 对 如 下 型 号,当
mask=0或repeatTime=0时,不 会 执 行 归 约 操 作,不 会 对 目 的 操 作 数 进 行 写 入,该 接 口 将 被 视 为NOP(空 操 作)。- Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品
- Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品
- 针 对Ascend 950PR/Ascend 950DT,
int64_t/uint64_t数 据 类 型 仅 支 持tensor前n个 数 据 计 算 接 口。 srcRepStride取 值 范 围 为[0, $2^{16}-1$],需 要 结 合UB的 实 际 大 小 避 免 出 现 越 界。
关 键 特 性 说 明
ReduceSum的 累 加 方 式 分 为 两 种:
- 方 式 一:同 一repeat内 采 用 二 叉 树 累 加,不 同repeat的 结 果 按 顺 序 累 加。
- 方 式 二:同 一repeat内 采 用 二 叉 树 累 加,不 同repeat的 结 果 也 按 二 叉 树 累 加。
ReduceSum接 口 以 二 叉 树 累 加 的 方 式 完 成 每 个repeat内 的 求 和,详 情 请 参 考ReduceDataBlock关 键 特 性 说 明。
对 于 上 述 两 种 累 加 方 式,sharedTmpBuffer所 需 空 间 设 置:
方 式 一:传 入 任 意 大 小 的
sharedTmpBuffer,sharedTmpBuffer不 会 被 使 用。方 式 二:按 照 如 下 计 算 公 式 计 算 所 需 空 间:
C++int typeSize = 2; // half类 型 为2Bytes,float类 型 为4Bytes int elementsPerBlock = 32 / typeSize; // 1个datablock存 放 的 元 素 个 数 int elementsPerRepeat = 256 / typeSize; // 1次repeat可 以 处 理 的 元 素 个 数 int firstMaxRepeat = repeatTime; // 最 后 确 定 首 次 最 大repeat值 // 注:对 于tensor高 维 切 分 计 算 接 口,firstMaxRepeat就 是repeatTime;对 于tensor前n个 数 据 计 算 接 口,firstMaxRepeat为count/elementsPerRepeat,对 于count小 于elementsPerRepeat的 场 景,firstMaxRepeat为1 int iter1OutputCount = firstMaxRepeat; // 第 一 轮 操 作 产 生 的 元 素 个 数 int iter1AlignEnd = DivCeil(iter1OutputCount, elementsPerBlock) * elementsPerBlock; // 第 一 轮 产 生 的 元 素 个 数 做 向 上 取 整 int finalWorkLocalNeedSize = iter1AlignEnd; // 最 终sharedTmpBuffer所 需 的elements空 间 大 小 就 是 第 一 轮 操 作 产 生 元 素 做 向 上 取 整 后 的 结 果
不 同 硬 件 形 态 对 应 的ReduceSum相 加 方 式 如 下:
- Ascend 950PR/Ascend 950DT,采 用 方 式 一。
- Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,tensor前n个 数 据 计 算 接 口 采 用 方 式 二,tensor高 维 切 分 计 算 接 口 采 用 方 式 一。
- Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,tensor前n个 数 据 计 算 接 口 采 用 方 式 二,tensor高 维 切 分 计 算 接 口 采 用 方 式 一。
- Atlas 200I/500 A2 推 理 产 品,采 用 方 式 一。
- Atlas 推 理 系 列 产 品 AI Core,采 用 方 式 一。
- Atlas 训 练 系 列 产 品,采 用 方 式 一。
- Kirin X90,采 用 方 式 一。
- Kirin 9030,采 用 方 式 一。
调 用 示 例
更 多 样 例 请 参 考ReduceSum样 例。
tensor高 维 切 分 计 算 样 例-
mask连 续 模 式:C++// dstLocal,srcLocal和sharedTmpBuffer均 为half类 型,srcLocal的 计 算 数 据 量 为8320,并 且 连 续 排 布,使 用tensor高 维 切 分 计 算 接 口,设 定repeatTime为65,mask为 全 部 元 素 参 与 计 算 int32_t mask = 128; AscendC::ReduceSum<half>(dstLocal, srcLocal, sharedTmpBuffer, mask, 65, 8);tensor高 维 切 分 计 算 样 例-
mask逐bit模 式:C++// dstLocal,srcLocal和sharedTmpBuffer均 为half类 型,srcLocal的 计 算 数 据 量 为8320,并 且 连 续 排 布,使 用tensor高 维 切 分 计 算 接 口,设 定repeatTime为65,mask为 全 部 元 素 参 与 计 算 uint64_t mask[2] = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }; AscendC::ReduceSum<half>(dstLocal, srcLocal, sharedTmpBuffer, mask, 65, 8);tensor前n个 数 据 计 算 样 例:
C++// dstLocal,srcLocal和sharedTmpBuffer均 为half类 型,srcLocal的 计 算 数 据 量 为8320,并 且 连 续 排 布,使 用tensor前n个 数 据 计 算 接 口 AscendC::ReduceSum<half>(dstLocal, srcLocal, sharedTmpBuffer, 8320);tensor高 维 切 分 计 算 接 口 示 例:
C++#include "kernel_operator.h" int srcDataSize = 8320; int dstDataSize = 16; int mask = 128; int repStride = 8; int repeat = srcDataSize / mask; // 这 里 是65 // 初 始 化srcLocal 、dstLocal 、sharedTmpBuffer AscendC::LocalTensor<half> srcLocal = inQueueSrc.DeQue<half>(); AscendC::LocalTensor<half> dstLocal = outQueueDst.AllocTensor<half>(); AscendC::LocalTensor<half> sharedTmpBuffer = workQueue.AllocTensor<half>(); // mask为128一 次 计 算128个 元 素,65次repeat计 算 完8320个 数 AscendC::ReduceSum<half>(dstLocal, srcLocal, sharedTmpBuffer, mask, repeat, repStride); // 释 放Tensor outQueueDst.EnQue<half>(dstLocal); inQueueSrc.FreeTensor(srcLocal); workQueue.FreeTensor(sharedTmpBuffer);示 例 结 果 如 下:
输 入 数 据src_gm:
[1. 1. 1. ... 1. 1. 1.]
输 出 数 据dst_gm:
[8320. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
tensor前n个 数 据 计 算 接 口 示 例:
C++#include "kernel_operator.h" int srcDataSize = 288; // 初 始 化srcLocal 、dstLocal 、sharedTmpBuffer AscendC::LocalTensor<half> srcLocal = inQueueSrc.DeQue<half>(); AscendC::LocalTensor<half> dstLocal = outQueueDst.AllocTensor<half>(); AscendC::LocalTensor<half> sharedTmpBuffer = workQueue.AllocTensor<half>(); // level2接 口 计 算 前288个 数,计 算 前288个 数 的 和 AscendC::ReduceSum<half>(dstLocal, srcLocal, sharedTmpBuffer, srcDataSize); // 释 放Tensor outQueueDst.EnQue<half>(dstLocal); inQueueSrc.FreeTensor(srcLocal); workQueue.FreeTensor(sharedTmpBuffer);示 例 结 果 如 下:
输 入 数 据src_gm:
[1. 1. 1. ... 1. 1. 1.]
输 出 数 据dst_gm:
[288. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]