拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CANN opbase 中 GetSectorCacheLineSize API 详解:获取平台 Sector Cache Line 大小的实现与 Tiling 实战

CANN opbase 中 GetSectorCacheLineSize API 详解获取平台 Sector Cache Line 大小的实现与 Tiling 实战【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbaseGetSectorCacheLineSize是 CANN opbase 仓库op_common模块提供的一个平台信息工具 API用于在 Host 侧 Tiling 阶段获取平台 Sector Cache Line 的大小单位 bytes当前为 128 bytes即 Cache Line 大小的一半。阅读本文可以掌握该 API 的函数原型、参数约束与返回值理解其在op_common/op_host/util/platform_util.h中的具体实现原理并学会将其与TilingContext/TilingParseContext结合用于算子 Tiling 中的缓冲区对齐计算。功能说明与 API 定位GetSectorCacheLineSize的功能是获取平台 Sector Cache Line 的大小单位 bytes。其值为 Cache Line 大小的一半。该函数定义在 platform_util.h 中位于Ops::Base命名空间下。在 opbase 的文档体系中它与GetAivCoreNum、GetAicCoreNum、GetUbSize、GetCacheLineSize等 12 个接口共同组成platform分组完整清单见 platform.md。这组 API 统一服务于算子开发中Host 侧 Tilingtiling 解析阶段开发者在 Tiling 类的初始化/解析流程中通过这些函数获取目标芯片的硬件能力参数核数、UB 大小、Cache Line 粒度等进而完成分块block size计算与缓冲区buffer规划。函数原型与参数说明函数原型如下与 GetSectorCacheLineSize.md 原文档一致template typename T uint32_t GetSectorCacheLineSize([[maybe_unused]] const T *context)参数说明参数名输入/输出说明context输入Tiling 的上下文信息类型为TilingContext/TilingParseContext。关于模板参数T可以结合同一头文件中相邻 API 的写法来理解GetAivCoreNum、GetAicCoreNum、GetUbSize、GetWorkspaceSize等接口都带有如下编译期约束见 platform_util.h#L26-L38static_assert(std::is_sametypename std::remove_constT::type, gert::TilingParseContext::value || std::is_sametypename std::remove_constT::type, gert::TilingContext::value, context should be gert::TilingParseContext or gert::TilingContext);即上下文类型必须是gert::TilingParseContext或gert::TilingContext否则在编译期就会报错。GetSectorCacheLineSize本身没有内嵌该static_assert参数上标注了[[maybe_unused]]与文档中“参数为 Tiling 上下文”的约定保持兼容。返回值说明返回类型为uint32_t返回平台 Sector Cache Line 大小当前为 128 bytes。约束说明原文档标注“无”约束即调用侧无需额外前置条件从源码结构看该函数为纯常量返回不涉及指针解引用与平台信息读取不存在空指针检查分支。源码实现解析下面结合仓库源码说明这个 API 的真实行为。GetSectorCacheLineSize的完整实现只有三行位于 platform_util.h#L116-L120/** * Get the sector cache line size in bytes */ template typename T uint32_t GetSectorCacheLineSize([[maybe_unused]] const T* context) { return GetCacheLineSize(context) / 2U; }它直接委托给同文件的GetCacheLineSize并将结果除以 2而GetCacheLineSize的实现位于 platform_util.h#L107-L111/** * Get the cache line size in bytes */ template typename T uint32_t GetCacheLineSize([[maybe_unused]] const T* context) { return 256U; }由此可以确认两点实现事实当前 Cache Line 大小固定返回 256 bytes因此GetSectorCacheLineSize恒返回256 / 2 128bytes与文档“当前为 128 bytes”的返回值说明完全吻合该函数不访问context中的任何内容参数标注[[maybe_unused]]属于“常量型”平台 API。与“读取平台信息型”API 的对比同一头文件中的 12 个 platform API 实际上分为两类常量型如GetSectorCacheLineSize、GetCacheLineSize、GetUbBlockSize返回 32U、GetVRegSize返回 256U、GetSimtMaxThreadNum返回 2048U、GetSimtMaxDCacheSize返回 131072U、GetNddmaDcacheSize返回 8192U当前版本直接返回固定值读取平台信息型如 GetAivCoreNum、GetUbSize、GetWorkspaceSize它们先做空指针检查再通过context-GetPlatformInfo()获取平台信息构造platform_ascendc::PlatformAscendC对象后读取核数、UB 大小等真实硬件参数。从源码结构看常量型 API 将context参数保留在签名中是为了与整个 platform 分组保持统一的调用形态便于未来切换到真实的 AscendC 平台查询头文件中已有类似 “will using AscendC api later” 的注释。对调用者而言这意味着当前版本中无论传入何种合法的TilingContext/TilingParseContextGetSectorCacheLineSize的返回值都是 128。为什么 Tiling 需要 Sector Cache Line 大小Sector Cache Line 的意义体现在 Host 侧 Tiling 计算缓冲区大小时。以仓库中 reduce 类算子的 Tiling 实现为例ReduceOpTiling::PreProcessOptionalParam会集中调用 platform 分组 API把硬件参数采集到ReduceOpCompileInfo编译信息结构中见 reduce_tiling.cpp#L382-L417compileInfo_-vectorCoreNum GetAivCoreNum(context_); /* 校验 vectorCoreNum 0 ... */ compileInfo_-ubSize GetUbSize(context_); /* 校验 ubSize 0 ... */ compileInfo_-cacheLineSize GetCacheLineSize(context_); /* 校验 cacheLineSize 0 ... */ compileInfo_-ubBlockSize GetUbBlockSize(context_); /* 校验 ubBlockSize 0 ... */ compileInfo_-vRegSize GetVRegSize(context_); /* 校验 vRegSize 0 ... */可以看到cacheLineSize等 Cache Line 相关参数采集后会参与后续的 UB buffer 划分Cache Line 是 HBM 与 UB 之间 NDMA 数据搬运的对齐粒度buffer 尾部tail buffer的容量往往需要按 Cache Line / Sector 粒度对齐计算。ReduceOpCompileInfo结构中的cacheLineSize成员声明在 reduce_tiling.h#L57uint64_t cacheLineSize 0;GetSectorCacheLineSize为这类计算提供了另一半粒度128 bytes 的 sector 级对齐的参数来源。调用示例原文档给出的关键代码如下仅供参考不支持直接拷贝运行compileInfo-sectorCacheLineSize GetSectorCacheLineSize(context_);结合上文源码该用法对应的典型场景是在算子 Tiling 类的Init/Parse函数内部此时context_为当前节点的TilingContext或TilingParseContext将 sector cache line 大小写入本算子自定义的编译信息结构供后续的 buffer 对齐计算使用。这与 reduce_tiling.cpp 中compileInfo_-cacheLineSize GetCacheLineSize(context_);的写法是同一模式只是采集的字段不同。相关 API 与进一步阅读GetSectorCacheLineSize所在的 platform 分组包含以下接口文档入口platform.md实现头文件platform_util.hAPI功能GetAivCoreNum/GetAicCoreNum获取平台 AI Vector / AI Cube 核数GetUbSize/GetUbBlockSize获取 UBUnified Buffer空间大小 / block 单元大小GetVRegSize获取向量寄存器大小GetSimtMaxThreadNum/GetSimtMaxDCacheSize获取 SIMT 最大线程数 / 最大 DCache 大小GetCacheLineSize获取 Cache Line 大小当前 256 bytes见 GetCacheLineSize.mdGetSectorCacheLineSize获取 Sector Cache Line 大小当前 128 bytes即本文主题GetNddmaDcacheSize获取 NDDMA DCache 大小GetWorkspaceSize获取 LibApi Workspace 大小如需了解整个 op_common 模块各分组 API 的总览可参考 op_common API 介绍 与 0_op_common_list.md。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门