opbase 平台工具解析:GetNddmaDcacheSize 获取 NDDMA DCache 大小及其在 broadcast 调度中的作用
2026/9/18 23:44:18 网站建设 项目流程

opbase 平台工具解析:GetNddmaDcacheSize 获取 NDDMA DCache 大小及其在 broadcast 调度中的作用

【免费下载链接】opbase本项目是CANN算子库的基础框架库,为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase

本篇介绍 CANN opbase 平台信息获取接口GetNddmaDcacheSize的函数原型、参数与返回值含义,并结合 platform_util.h 的实际实现和 broadcast_tiling.h 中的真实调用,说明该接口在算子 tiling 阶段获取 NDDMA DCache 容量、并据此决定 broadcast 走 NDDMA 还是 UB 通道的决策逻辑。读完本文,你将理解该接口的当前取值来源、它在 platform 工具族中的定位,以及它如何作为"尾轴 4096B 阈值"参与 kernel 类型选择。

功能说明

GetNddmaDcacheSize用于获取平台 NDDMA DCache 的大小,单位为 bytes。该接口属于 platform 平台信息获取工具族,与GetUbSizeGetCacheLineSizeGetWorkspaceSize等接口并列,供算子 host 端(tiling 阶段)查询设备侧的存储/缓存参数。

函数原型

template <typename T> uint32_t GetNddmaDcacheSize([[maybe_unused]] const T *context)

声明位置:platform_util.h,处于Ops::Base命名空间内。

参数说明

参数名输入/输出说明
context输入Tiling 的上下文信息,类型为TilingContext/TilingParseContext

从源码结构看,该模板参数标记为[[maybe_unused]],即当前实现并不实际读取 context 的内容。这与同文件中GetUbBlockSizeGetVRegSizeGetCacheLineSize等同样返回固定常量的接口风格一致;而GetAivCoreNumGetUbSize等需要查询平台信息的接口,则会对 context 做非空校验并调用context->GetPlatformInfo()获取真实硬件参数。因此GetNddmaDcacheSize的 template 参数T主要起占位与统一调用形态的作用,便于与其他 platform 接口以相同方式调用。

返回值说明

uint32_t:返回平台 NDDMA DCache 大小(当前为 8192 bytes)。

对应源码实现:

/** * Get the dcache size of nddma */ template <typename T> uint32_t GetNddmaDcacheSize([[maybe_unused]] const T* context) { return 8192U; }

参见 platform_util.h。当前实现直接返回常量8192U,即 8KB,不依赖 context 传入的上下文信息。

约束说明

官方文档标注为"无"。结合实现可以推断,调用时传入的 context 可以为任意指针(包括nullptr),函数内部不会解引用它,因此不存在空指针风险。

调用示例

关键代码示例如下,仅供参考,不支持直接拷贝运行:

compileInfo->nddmaDcacheSize = GetNddmaDcacheSize(context_);

真实调用链:broadcast tiling 的 kernel 类型选择

该接口在仓库中最典型的调用点是 broadcast 类算子的 tiling 实现 broadcast_tiling.h。其中IsBigNLastBrc()方法(L526-L557)用于判断是否为 nlast broadcast 且尾轴较大的场景:

auto inputDesc = context_->GetInputDesc(i); OP_CHECK_NULL_WITH_CONTEXT(context_, inputDesc); auto inputDtype = inputDesc->GetDataType(); int64_t dTypeSize = ge::GetSizeByDataType(inputDtype); int64_t nddmaDcacheSize = static_cast<int64_t>(Ops::Base::GetNddmaDcacheSize(context_)); // 判断尾轴是否大于nddma dcache size 的一半 if (tilingData.dims[i].back() * dTypeSize >= nddmaDcacheSize / VALUE_TWO) { return true; }

其判定逻辑是:对 copyInBrc 输入,若除尾轴外存在 broadcast 轴,则计算尾轴的字节数(尾轴元素数 × 单元素字节数),当尾轴字节数大于等于 NDDMA DCache 大小的一半(即 8192 / 2 = 4096 bytes)时返回 true。

IsBigNLastBrc()的结果进一步被IsUbBroadcast()消费(L567 起):其决策优先级为——

  1. 若显式设置了kernelType,以kernelType为准(KERNEL_TYPE_NDDMA/KERNEL_TYPE_UB_BROADCAST,定义见 broadcast_tiling_base.h);
  2. 所有输入都不需要 broadcast 时走 NDDMA;
  3. 没有 copyInBrc 节点时走 NDDMA;
  4. 命中 nlastBig 场景(即IsBigNLastBrc()为 true)则走 UB broadcast;
  5. B8/B16 且尾轴对齐场景走 UB broadcast。

也就是说,NDDMA DCache 的 8KB 容量直接派生出 4096B 的尾轴阈值:当输入尾轴足够大、可能超出 NDDMA 搬运效率区间时,调度器倾向于切换到 UB broadcast 路径,从而将缓存容量参数转化为实际的 kernel 选型依据。

小结

  • GetNddmaDcacheSize是 platform 工具族中的接口之一,声明于 include/op_common/op_host/util/platform_util.h,文档见 GetNddmaDcacheSize.md;
  • 当前实现返回固定常量 8192(8KB),context 参数仅用于统一调用形态;
  • 在 broadcast tiling 中,该值的一半(4096B)被用作 nlast broadcast 场景的尾轴阈值,参与 NDDMA / UB broadcast 两条执行路径的选择;
  • 若后续版本改为从PlatformInfo查询真实硬件值(类似GetUbSize的实现方式),调用方代码可以保持不变,这正是模板化接口设计的收益所在。

【免费下载链接】opbase本项目是CANN算子库的基础框架库,为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询