BlockReduceSum
产 品 支 持 情 况
功 能 说 明
对 每 个datablock内 所 有 元 素 求 和。源 操 作 数 相 加 采 用 二 叉 树 方 式,两 两 相 加。归 约 指 令 的 总 体 介 绍 请 参 考如 何 使 用 归 约 计 算API。
以128个half类 型 的 数 据 求 和 为 例,每 个datablock可 以 计 算16个half类 型 数 据,分 成8个datablock进 行 计 算;每 个datablock内,通 过 二 叉 树 的 方 式,两 两 相 加,BlockReduceSum求 和 示 意 图 如 下。
需 要 注 意 的 是 两 两 相 加 的 计 算 过 程 中,计 算 结 果 大 于65504时 结 果 保 存 为65504。例 如,源 操 作 数 为[60000,60000,-30000,100],首 先60000+60000溢 出,结 果 为65504,然 后 计 算-30000+100=-29900,最 后 计 算65504-29900=35604,计 算 示 意 图 如 下 图 所 示。
函 数 原 型
mask逐 比 特 模 式
Texttemplate <typename T, bool isSetMask = true> __aicore__ inline void BlockReduceSum(const LocalTensor<T>& dst, const LocalTensor<T>& src,const int32_t repeatTime, const uint64_t mask[], const int32_t dstRepStride, const int32_t srcBlkStride, const int32_t srcRepStride)mask连 续 模 式
Texttemplate <typename T, bool isSetMask = true> __aicore__ inline void BlockReduceSum(const LocalTensor<T>& dst, const LocalTensor<T>& src,const int32_t repeatTime, const int32_t mask, const int32_t dstRepStride, const int32_t srcBlkStride, const int32_t srcRepStride)
参 数 说 明
表 1 模 板 参 数 说 明
Ascend 950PR/Ascend 950DT,支 持 的 数 据 类 型 为:half、float | |
|
表 2 参 数 说 明
类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的 起 始 地 址 需 要 保 证16字 节 对 齐(针 对half数 据 类 型),32字 节 对 齐(针 对float数 据 类 型)。 | ||
类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。 | ||
关 于 该 参 数 的 具 体 描 述 请 参 考高 维 切 分API。 | ||
mask用 于 控 制 每 次 迭 代 内 参 与 计 算 的 元 素。
| ||
目 的 操 作 数 相 邻 迭 代 间 的 地 址 步 长。以 一 个repeatTime归 约 后 的 长 度 为 单 位。 每 个repeatTime(8个datablock)归 约 后,得 到8个 元 素,所 以 输 入 类 型 为half类 型 时,RepStride单 位 为16Byte;输 入 类 型 为float类 型 时,RepStride单 位 为32Byte。 | ||
单 次 迭 代 内datablock的 地 址 步 长。详 细 说 明 请 参 考dataBlockStride。 | ||
源 操 作 数 相 邻 迭 代 间 的 地 址 步 长,即 源 操 作 数 每 次 迭 代 跳 过 的datablock数 目。详 细 说 明 请 参 考repeatStride。 |
返 回 值 说 明
无
约 束 说 明
操 作 数 地 址 对 齐 要 求 请 参 见通 用 地 址 对 齐 约 束。
为 了 节 省 地 址 空 间,您 可 以 定 义 一 个Tensor,供 源 操 作 数 与 目 的 操 作 数 同 时 使 用(即 地 址 重 叠),需 要 注 意 计 算 后 的 目 的 操 作 数 数 据 不 能 覆 盖 未 参 与 计 算 的 源 操 作 数,需 要 谨 慎 使 用。
对 于Atlas 200I/500 A2 推 理 产 品,若 配 置 的mask/mask[]参 数 后,存 在 某 个datablock里 的 任 何 一 个 元 素 都 不 参 与 计 算,则 该datablock内 所 有 元 素 的 和 会 填 充 为0返 回。比 如float场 景 下,当mask配 置 为32,即 只 计 算 前4个datablock,则 后 四 个datablock内 的 和 会 返 回0。
调 用 示 例
本 样 例 中 只 展 示Compute流 程 中 的 部 分 代 码。完 整 样 例 可 参 考BlockReduce系 列 归 约 指 令 样 例。
BlockReduceSum-tensor高 维 切 分 计 算 样 例-mask连 续 模 式
Text// 设 定mask为 最 多 的128个 全 部 元 素 参 与 计 算 int32_t mask = 256/sizeof(half); // 每 个repeat128个 元 素,一 共128个 元 素。 int repeat = 1; // dstLocal: 目 的 操 作 数tensor // srcLocal: 源 操 作 数tensor // srcBlkStride = 1, 在 一 个repeat中,block间 没 有 空 隙。 // dstRepStride = 1, srcRepStride = 8, repeat间 没 有 空 隙。 AscendC::BlockReduceSum<half>(dstLocal, srcLocal, repeat, mask, 1, 1, 8);BlockReduceSum-tensor高 维 切 分 计 算 样 例-mask逐bit模 式
Text// 设 定mask为 最 多 的128个 全 部 元 素 参 与 计 算 uint64_t mask[2] = { UINT64_MAX, UINT64_MAX }; // 每 个repeat128个 元 素,一 共128个 元 素。 int repeat = 1; // dstLocal: 目 的 操 作 数tensor // srcLocal: 源 操 作 数tensor // srcBlkStride = 1, 在 一 个repeat中,block间 没 有 空 隙。 // dstRepStride = 1, srcRepStride = 8, repeat间 没 有 空 隙。 AscendC::BlockReduceSum<half>(dstLocal, srcLocal, repeat, mask, 1, 1, 8);
结 果 示 例 如 下:
输 入 数 据src_gm:
[1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
...
3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3]
输 出 数 据dst_gm:
[16, 32, ..., 48]
- 针 对 不 同 场 景 合 理 使 用 归 约 指 令 可 以 带 来 性 能 提 升,相 关 介 绍 请 参 考选 择 低 延 迟 指 令,优 化 归 约 操 作 性 能,具 体 样 例 请 参 考ReduceCustom。

