Skip to content
版 本

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接 口 对 所 有 输 入 数 据 进 行 求 和,计 算 过 程 如 下。

图 1 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$]。

注:以 上 高 维 切 分 相 关 参 数maskrepeatTimesrcRepStride请 参 考高 维 切 分中 的 介 绍。

数 据 类 型

支 持 的 数 据 类 型 如 下:

  • 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的 情 况 下,支 持dstsharedTmpBuffer地 址 重 叠(通 常 情 况 下dstsharedTmpBuffer所 需 的 空 间 要 小),此 时sharedTmpBuffer必 须 满 足 所 需 空 间 要 求,详 情 请 参 考关 键 特 性 说 明
  • 针 对 如 下 型 号,当mask=0repeatTime=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所 需 空 间 设 置:

  • 方 式 一:传 入 任 意 大 小 的sharedTmpBuffersharedTmpBuffer不 会 被 使 用。

  • 方 式 二:按 照 如 下 计 算 公 式 计 算 所 需 空 间:

    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.]

免 责 声 明:本 站 内 容 由 asc-devkit 仓 master 分 支 自 动 编 译 生 成,属 于 持 续 开 发 版 本,可 能 存 在 缺 陷,仅 供 预 览 与 参 考。如 需 稳 定 及 商 用 资 料,请 查 阅 官 方 昇 腾 社 区