资讯动态

asc-devkit Tiling 调测指南:ContextBuilder::PlatformInfo 接口详解与底层实现剖析

发布时间:2026/10/18 15:43:10 来源:尧图企业网站定制
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载本文聚焦 asc-devkit昇腾 CANN 算子开发套件Utils-API 中 Tiling 调测工具链的PlatformInfo接口它是context_ascendc::ContextBuilder构建器链上的一个环节用于将指向fe::PlatFormInfos的硬件平台信息指针注入TilingContext使 Tiling 函数在主机侧单元测试中也能访问到与真机一致的核心数、片上存储等硬件参数。读完本文你可以掌握PlatformInfo的函数原型、参数与约束边界理解它与便捷接口AddPlatformInfo的分工差异并能基于源码和现有单测在 Tiling 单元测试中正确构造带平台信息的TilingContext。接口定位ContextBuilder 构建器链中的一环在 Tiling 函数调测场景下ContextBuilder类提供了一系列 API支持手动构造TilingContext来验证 Tiling 函数以及构造KernelContext来验证 TilingParse 函数参见 ContextBuilder 简介。PlatformInfo是其中专门负责硬件平台信息注入的 Tiling Context 构建器接口完整接口清单见 ContextBuilder 接口目录。功能说明与函数原型PlatformInfo的功能是将指向fe::PlatFormInfos的指针传入TilingContext。函数原型如下ContextBuilder PlatformInfo(void *platformInfo)参数说明参数输入/输出说明platformInfo输入指向fe::PlatFormInfos类型数据的 void 指针返回值返回当前ContextBuilder对象以支持链式调用builder 模式——这也是源码中每个 setter 都return *this;的原因。源码实现从 ContextBuilder 到 OpTilingContextBuilder 的三级委托PlatformInfo在头文件中的声明位于 Tiling Context Builder 分组内与CompileInfo、TilingData、Workspace并列// Tiling Context Builder ContextBuilder CompileInfo(void *compileInfo); ContextBuilder PlatformInfo(void *platformInfo); ContextBuilder AddPlatformInfo(const char* customSocVersion); ContextBuilder TilingData(void *tilingData); ContextBuilder Workspace(gert::ContinuousVector *workspace); std::shared_ptrKernelRunContextHolder BuildTilingContext();见 context_builder.h从源码结构看调用经过三层委托公开接口层context_builder.cppContextBuilder ContextBuilder::PlatformInfo(void* platformInfo) { ASCENDC_ASSERT(impl_ ! nullptr, return *this, CXT_ASCENDC_LOGE(impl_ is nullptr!)); impl_-PlatformInfo(platformInfo); return *this; }注意失败语义当内部impl_为空时接口不会抛异常而是打印错误日志并返回*this链式调用会继续。这要求使用者在最终BuildTilingContext()之后检查返回值是否为nullptr来确认上下文构建是否成功。实现层context_builder_impl.cpp将void*透传给底层的OpTilingContextBuilder即 context_builder.h 中引入的base/context_builder/op_tiling_context_builder.hvoid ContextBuilderImpl::PlatformInfo(void* platformInfo) { ASCENDC_ASSERT(tilingCtxBuilder_ ! nullptr, return, CXT_ASCENDC_LOGE(kernelCtxBuilder_ is nullptr!)); tilingCtxBuilder_-PlatformInfo(platformInfo); }也就是说PlatformInfo本身不做任何参数校验、不做类型还原——它信任调用者传入的指针确实是fe::PlatFormInfos*由调用者自行保证指针有效性与生命周期。底层构建器gert::TilingContext构建时会将该指针保存运行时可通过context-GetPlatformInfo()取出。与 AddPlatformInfo 的分工手动注入 vs 自动获取同一构建器上还提供一个便捷接口AddPlatformInfo(const char* customSocVersion)它与PlatformInfo是低层原始注入与高层自动填充的关系PlatformInfo(void*)调用者自己准备好fe::PlatFormInfos实例例如通过fe::PlatformInfoManager初始化后获取将指针显式传入AddPlatformInfo(const char*)内部完成查询 SoC 版本 → 初始化平台信息 → 设置核数类型 → 调用impl_-PlatformInfo(...)的完整流程。AddPlatformInfo的内部逻辑见 context_builder.cpp值得展开SoC 版本来源若customSocVersion为空则dlopen(libruntime.so)并调用rtGetSocVersion获取当前运行环境的真实 SoC 版本测试中通过 gmock 的DlopenStub/DlsymStub打桩见 test_tiling.cpp否则直接使用传入的型号字符串如Ascend910B、Ascend350。平台信息初始化通过fe::PlatformInfoManager::Instance().InitRuntimePlatformInfos(socVersion)与GetRuntimePlatformInfosByDevice(0, platformInfoIns)得到fe::PlatFormInfos实例。核数类型设置通过GetPlatformResWithLock(version, Short_SoC_version, ...)取短版本号经convertMap映射为SocVersion枚举Ascend310P、Ascend910调用SetCoreNumByCoreType(AiCore)其余型号调用SetCoreNumByCoreType(VectorCore)。落库最终同样走impl_-PlatformInfo(platformInfoIns)注入。从这条链路可以推断PlatformInfo是构建TilingContext时平台信息的最终入口AddPlatformInfo只是其自动化封装。二者都只在TilingContext构建路径下生效。约束说明为什么必须以 BuildTilingContext 为前提原文档明确给出的约束是本文的核心要点由于TilingContext与KernelContext、TilingParseContext内部数据排序不同PlatformInfo()只支持以调用BuildTilingContext()为前提来使用其他场景建议用Outputs接口否则发生未定义行为。结合 context_builder.h 可以印证这一设计ContextBuilder同时服务两条构建路径——// kernel context builder ContextBuilder Inputs(std::vectorvoid * inputs); ContextBuilder Outputs(std::vectorvoid * outputs); std::shared_ptrKernelRunContextHolder BuildKernelRunContext();Inputs/Outputs/BuildKernelRunContext走的是KernelContext供 TilingParse 函数验证路径而CompileInfo/PlatformInfo/TilingData/Workspace/BuildTilingContext走的是TilingContext供 Tiling 函数验证路径。由于两种上下文对内部缓冲区的布局假设不一致把PlatformInfo注入的指针放进KernelRunContext场景下无法被正确解释因此文档将其限定为Tiling 路径专用并建议在KernelContext场景下改用Outputs接口传递数据指针。配套文档 BuildTilingContext 说明了构建产物BuildTilingContext()返回std::shared_ptrKernelRunContextHolder可通过模板方法取出具体上下文gert::TilingContext *tilingContext tilingContextHolder-GetContextgert::TilingContext();调用示例文档示例void AddPlatformInfo(fe::PlatFormInfos *platformInfo) { ...... auto kernelContextHolder context_ascendc::ContextBuilder() ...... // 增加算子输入输出接口的调用 .PlatformInfo(reinterpret_castvoid*(platformInfo)) .BuildTilingContext(); ...... }完整可复现的构建示例以下示例基于仓库单测 test_tiling.cpp 的真实用法整理展示了带AddPlatformInfo的完整 TilingContext 构建链PlatformInfo同理把.AddPlatformInfo(Ascend910B)替换为.PlatformInfo(reinterpret_castvoid*(pf))即可auto param gert::TilingData::CreateCap(4096); auto ws_holder gert::ContinuousVector::Createsize_t(4096); auto ws_size reinterpret_castgert::ContinuousVector*(ws_holder.get()); auto holder context_ascendc::ContextBuilder() .SetOpNameType(op_name, op_type) // 算子名/类型 .NodeIoNum(2, 1) // 输入/输出个数 .IrInstanceNum({1, 1}) // 各张量实例数 .AddInputTd(0, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, x_shape) .AddInputTd(1, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, w_shape) .AddOutputTd(0, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, out_shape) .AddAttr(activation, std::string(gelu)) .TilingData(param.get()) // TilingData 结构体 .Workspace(ws_size) // workspace 大小容器 .AddPlatformInfo(Ascend910B) // 或 .PlatformInfo(reinterpret_castvoid*(pf)) .BuildTilingContext(); // 构建 TilingContext // 必须检查构建结果 if (holder nullptr) { /* 构建失败参考日志排查 */ } gert::TilingContext *tilingContext holder-GetContextgert::TilingContext();消费端Tiling 函数如何使用平台信息平台信息注入后在 Tiling 函数中通过context-GetPlatformInfo()取出并通常用platform_ascendc::PlatformAscendC封装类进行硬件参数查询。该封装类定义于 platform_ascendc.h其构造函数正是接受PlatformInfo注入的同一类型fe::PlatFormInfos*explicit PlatformAscendC(fe::PlatFormInfos *platformInfo): platformInfo_(platformInfo) {}封装类提供的主要查询能力包括GetCoreNum()/GetCoreNumAic()/GetCoreNumAiv()获取核心数Ascend910B MIX 模式下返回 AICore 数CalcTschBlockDim()/CalcTschNumBlocks()按数据切分数与 Cube/Vector 核数计算任务调度维度的 block 数是 SIMD 算子 Tiling 中划分NumBlocks的核心工具GetLibApiWorkSpaceSize()获取系统 API 所需的 workspace 大小GetCoreMemSize()/GetCoreMemBw()查询 L0/L1/L2/UB 等片上存储大小与带宽CoreMemType枚举见 platform_ascendc.hGetSocVersion()/GetVecRegLen()获取 SoC 版本枚举与向量寄存器长度。仓库示例中的真实消费方式add_custom_tiling_sink_tiling.cppge::graphStatus AddCustomSinkTilingFunc(gert::TilingContext* context) { TilingSinkTilingData* tiling context-GetTilingDataTilingSinkTilingData(); ... auto platform platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); size_t sysWorkspaceSize platform.GetLibApiWorkSpaceSize(); currentWorkspace[0] sysWorkspaceSize DEFAULT_WORKSPACE_SIZE; return ge::GRAPH_SUCCESS; }此外PlatformAscendCManager::GetInstance(customSocVersion)单例接口见 platform_ascendc.h提供了不依赖TilingContext的独立获取路径适用于 Tiling 函数外部需要平台信息的辅助代码。单元测试验证与失败模式仓库为PlatformInfo/AddPlatformInfo提供了充分的测试覆盖可直接作为用法参照空指针注入导致构建失败test_tiling.cpp 中TestTilingContextBuildFailed用例显式调用.PlatformInfo(nullptr)并断言BuildTilingContext()返回nullptr——这印证了平台信息是 TilingContext 构建的必要输入之一注入无效指针时构建会失败而不是静默通过auto holder context_ascendc::ContextBuilder() .NodeIoNum(1, 1) .IrInstanceNum({1, 1}) .CompileInfo(nullptr) .PlatformInfo(nullptr) // 注入空平台信息 .AddInputTd(0, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, x_shape, ...) .Workspace(ws_size) .BuildTilingContext(); EXPECT_EQ(holder, nullptr); // 构建失败指定 SoC 版本构建TestTilingContextBuildWithConstValue系列用例分别使用.AddPlatformInfo(Ascend910B)test_tiling.cpp与.AddPlatformInfo(Ascend350)test_tiling.cpp验证不同平台型号下 TilingContext 的构建与张量/属性读取。底层打桩单测依赖 platform_stub.cpp 对fe::PlatFormInfosGetCoreNum、GetPlatformResWithLock、GetLocalMemSize等与fe::PlatformInfoManager进行打桩说明PlatformInfo注入的指针在运行时会被 TilingContext 的下游逻辑如 workspace 计算实际消费。使用要点小结PlatformInfo(void*)是向TilingContext注入fe::PlatFormInfos指针的原始接口返回ContextBuilder以支持链式调用仅可用于BuildTilingContext()路径构造KernelContextTilingParse 验证时请改用Outputs接口否则行为未定义指针有效性由调用者保证内部实现仅做impl_/tilingCtxBuilder_空指针断言不还原、不校验类型传入nullptr会使BuildTilingContext()返回nullptr若不想手动管理fe::PlatFormInfos的初始化可使用同族接口AddPlatformInfo(customSocVersion)传空则从libruntime.so的rtGetSocVersion自动获取当前硬件 SoC 版本传型号字符串如Ascend910B则按指定型号构建平台信息最终仍经由PlatformInfo入口落库构建成功后在 Tiling 函数中通过context-GetPlatformInfo()取出平台信息并用platform_ascendc::PlatformAscendC查询核心数、片上存储、workspace 大小等硬件参数完成与真机一致的单侧调测。相关文档可继续参考 PlatformInfo、AddPlatformInfo、BuildTilingContext 与 ContextBuilder 简介。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit Tiling 调测实践ContextBuilder::AddInputTd 输入 Tensor 描述接口详解asc devkit Tiling 调测实践ContextBuilder::AddInputTd 输入 Tensor 描述接口详解 在算子 Tiling 函数人工智能深度学习算子库CANNAscendasc-devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战asc devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战 在 asc人工智能深度学习算子库CANNAscendasc-devkit 中 ContextBuilder::IrInstanceNum 详解为 Tiling 调测声明算子输入实例数asc devkit 中 ContextBuilder::IrInstanceNum 详解为 Tiling 调测声明算子输入实例数 在 asc devkit人工智能深度学习算子库CANNAscend上一篇终极fio性能测试指南从零开始掌握存储基准测试下一篇Transformers mLUKE 模型完全指南在 XLM-RoBERTa 之上融合实体表示的多语言预训练模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑