首页 / 资讯中心 / 文章详情

asc-devkit Tiling 调测工具详解:ContextBuilder 构造函数的 Builder 模式与默认成员初始化

asc-devkit Tiling 调测工具详解:ContextBuilder 构造函数的 Builder 模式与默认成员初始化 ★ FEATURED ARTICLE
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载在 asc-devkit 的 Tiling 调测Tiling tuning工具中context_ascendc::ContextBuilder是手动构造TilingContext与KernelContext的核心入口类用于脱离图引擎环境验证 Tiling 函数与 TilingParse 函数。本文以 ContextBuilder 构造函数 官方文档为主体结合仓库头文件、实现源码与单元测试剖析该无参构造函数“初始化数据成员”这一行为的具体实现它如何通过 pimplpointer to implementation模式持有内部实现并为后续 Builder 链式调用建立哪些默认状态以及非拷贝、禁移动的设计约束对使用者意味着什么。ContextBuilder 在 Tiling 调测中的定位Tiling 调测工具属于 asc-devkit 的 Utils-API 能力之一其文档索引见 Tiling_tuning包含OpTilingRegistry与ContextBuilder两组接口。其中 ContextBuilder 简介文档说明ContextBuilder 类提供一系列的 API 接口支持手动构造 TilingContext 类来验证 Tiling 函数以及 KernelContext 类用于 TilingParse 函数的验证。也就是说开发者在独立调测一个算子的 Tiling 函数如MyAddTiling::Init或TilingParse时可以不必依赖完整的模型推理环境而是通过ContextBuilder手工拼出与运行时等价的数据结构。ContextBuilder的全部成员声明位于 context_builder.hclass ContextBuilder { public: ContextBuilder(); ~ContextBuilder(); ContextBuilder(ContextBuilder kernelRunContextBuilder) delete; ContextBuilder operator(ContextBuilder kernelRunContextBuilder) delete; // kernel context builder ContextBuilder Inputs(std::vectorvoid * inputs); ContextBuilder Outputs(std::vectorvoid * outputs); std::shared_ptrKernelRunContextHolder BuildKernelRunContext(); // OpInfo ContextBuilder NodeIoNum(size_t inputNum, size_t outputNum); ContextBuilder SetOpNameType(const std::string opName, const std::string opType); // ... AddInputTd / AddOutputTd / AddAttr / CompileInfo / PlatformInfo / // AddPlatformInfo / TilingData / Workspace 等设置接口均返回 ContextBuilder std::shared_ptrKernelRunContextHolder BuildTilingContext(); private: std::unique_ptrContextBuilderImpl impl_; };从源码结构看该类是典型的Builder 模式 pimpl 惯用法对外暴露链式设置接口每个 setter 返回ContextBuilder内部仅持有一个std::unique_ptrContextBuilderImpl impl_将所有状态转移到私有实现类 ContextBuilderImpl。构造函数正是建立这一内部状态的第一步。函数原型、参数与约束官方文档对ContextBuilder构造函数的定义如下完整继承自 ContextBuilder_constructor.md功能说明创建 ContextBuilder 对象时初始化数据成员。函数原型ContextBuilder()参数说明无。约束说明无。这是一个无参默认构造函数且类声明未提供任何其他构造方式没有带参构造也没有工厂函数因此每一个可用的ContextBuilder对象都必然经由该构造函数创建。下面结合实现看“初始化数据成员”究竟做了什么。构造函数做了什么从 ContextBuilder 到 ContextBuilderImplContextBuilder构造函数的实现非常简短位于 context_builder.cppContextBuilder::ContextBuilder() { impl_.reset(new ContextBuilderImpl); } ContextBuilder::~ContextBuilder() default;它做且仅做一件事为impl_分配一个ContextBuilderImpl实例。真正的“数据成员初始化”发生在ContextBuilderImpl的构造函数中见 context_builder_impl.cppContextBuilderImpl::ContextBuilderImpl() { kernelCtxBuilder_ std::make_uniquegert::OpKernelContextBuilder(); tilingCtxBuilder_ std::make_uniquegert::OpTilingContextBuilder(); tilingCtxBuilder_-OpName(default_name).OpType(default_type).IONum(1, 1); tilingCtxBuilder_-CompileInfo(default_compileinfo).PlatformInfo(default_platforminfo); kernelCtxBuilder_-OpName(default_name).OpType(default_type).IONum(1, 1); }可以归纳出一次ContextBuilder()构造会在内存中建立以下状态初始化项所属实现类初值 / 说明impl_ContextBuilder指向新建的ContextBuilderImplpimpl 指针kernelCtxBuilder_ContextBuilderImpl新建gert::OpKernelContextBuilder用于BuildKernelRunContext()tilingCtxBuilder_ContextBuilderImpl新建gert::OpTilingContextBuilder用于BuildTilingContext()OpName / OpType两个底层 Builder默认值default_name/default_type可被SetOpNameType覆盖输入/输出数量IONum两个底层 Builder默认(1, 1)可被NodeIoNum/IrInstanceNum覆盖CompileInfo / PlatformInfotilingCtxBuilder_占位字符串default_compileinfo/default_platforminfo可被CompileInfo/PlatformInfo/AddPlatformInfo覆盖errFlag_ContextBuilderImplfalse成员声明处初始化后续AddInputTd等步骤出错时置位inputNum_/outputNum_ContextBuilderImpl0成员声明处初始化从源码结构看这一设计的意义在于构造函数保证对象诞生时即处于“可直接链式配置、或直接 Build 出最简默认 Context”的合法状态所有 setter 都是对默认值的逐步细化。ContextBuilderImpl中另有dependTensorsData_/dependOutputTensorsData_两个std::unordered_mapint32_t, std::unique_ptruint8_t[]成员见 context_builder_impl.h用于暂存AddInputTd/AddOutputTd创建的张量数据默认构造时为空容器按需填充。对象语义不可拷贝、不可移动context_builder.h 中还显式删除了两个移动操作ContextBuilder(ContextBuilder kernelRunContextBuilder) delete; ContextBuilder operator(ContextBuilder kernelRunContextBuilder) delete;同时由于impl_是std::unique_ptr隐式拷贝构造/拷贝赋值天然被删除。也就是说ContextBuilder是一个非可移动、非可拷贝的对象只能通过默认构造创建、以引用方式在链式调用中传递这正是全部 setter 返回ContextBuilder的原因。实际使用时应让链式表达式直接绑定到同一个临时对象上例如context_ascendc::ContextBuilder().SetOpNameType(...)...BuildTilingContext()或将其作为局部变量声明后复用而不能“存一份副本”或“移动进容器”。典型使用方式构造函数作为链式调用的起点官方简介文档给出的两种构造范式见 intro.md都以context_ascendc::ContextBuilder()的临时对象构造作为链条起点// 构造 KernelContext验证 TilingParse auto kernelContextHolder context_ascendc::ContextBuilder() .Inputs(...) .Outputs(...) .BuildKernelRunContext(); gert::KernelContext* tilingParseContext kernelContextHolder-GetContextgert::KernelContext(); // 构造 TilingContext验证 Tiling 函数 auto tilingContextHolder context_ascendc::ContextBuilder() .SetOpNameType(..., ...) .NodeIoNum(...) .IrInstanceNum(...) .AddInputTd(...) .AddOutputTd(...) .AddAttr(...) .BuildTilingContext(); gert::TilingContext* tilingContext tilingContextHolder-GetContextgert::TilingContext();这里的...参数可以参照仓库中的真实单测 test_tiling.cpp 补全该用例完整走了一遍“构造 → 配置 → BuildTilingContext”的链路auto holder context_ascendc::ContextBuilder() .NodeIoNum(1, 1) // 1 个输入、1 个输出 .IrInstanceNum({1}) // 每个输入的 IR 实例数 .SetOpNameType(tmpName, tmpType) // 算子名 / 算子类型 .AddInputTd(0, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, input_shape, file_path) // 输入 0shape bin 数据文件 .AddOutputTd(0, ge::DT_FLOAT16, ge::FORMAT_ND, ge::FORMAT_ND, output_shape) .TilingData(param.get()) // 由 gert::TilingData::CreateCap 分配 .Workspace(ws_size) // 由 gert::ContinuousVector 提供 .BuildTilingContext();两个值得注意的实现细节来自 context_builder_impl.cpp出错即“静默失败”的 errFlag 机制AddInputTd/AddOutputTd在张量尺寸非法、bin 文件读取失败、内存分配失败等场景下不会抛异常而是将errFlag_置true并记录日志随后BuildTilingContext()检测到errFlag_时打印Build Context Error!并返回nullptr见 BuildTilingContext 实现。因此单测中对失败路径的断言是EXPECT_EQ(holder, nullptr)——判断 Build 是否成功必须检查返回值是否为空指针。构造函数与 Build 的配对关系ContextBuilderImpl构造时创建的kernelCtxBuilder_与tilingCtxBuilder_分别服务于两条 Build 路径。BuildKernelRunContext()只依赖Inputs/Outputs设置BuildTilingContext()则消费NodeIoNum/IrInstanceNum/AddInputTd/AddOutputTd/AddAttr/CompileInfo/PlatformInfo/TilingData/Workspace的累计状态最终通过tilingCtxBuilder_-Build()得到gert::ContextHoldergert::TilingContext并包装为std::shared_ptrKernelRunContextHolder返回由 holder 管理 Context 及其张量数据的生命周期。小结ContextBuilder()是无参默认构造无参数、无额外约束相对文档所述是ContextBuilder唯一的对象创建入口。其“初始化数据成员”的实质是分配 pimpl 指针impl_并在ContextBuilderImpl内建立gert::OpKernelContextBuilder与gert::OpTilingContextBuilder两个底层构建器同时写入default_name/default_type/IONum(1,1)等可覆盖的默认值context_builder_impl.cpp#L58-L66。对象不可拷贝、不可移动只能就地声明并以返回值引用进行链式配置Build*系列接口以空指针表示失败调用方需显式判空。深入开发时可结合 Tiling_tuning 文档目录 中ContextBuilder各 setter 页面如 AddInputTd、BuildTilingContext与 OpTilingRegistry 一起使用并在 tests/api/utils/tiling/test_tiling.cpp 中参考完整调用链与错误路径的验证方式。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit 中 ContextBuilder 全解析手动构造 TilingContext 与 KernelRunContext 验证算子 Tiling 函数asc devkit 中 ContextBuilder 全解析手动构造 TilingContext 与 KernelRunContext 验证算子 Tilin人工智能深度学习算子库CANNAscendasc-devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战asc devkit Tiling 调优指南ContextBuilder::AddAttr 接口详解与 TilingContext 属性构造实战 在 asc人工智能深度学习算子库CANNAscendasc-devkit Tiling 调测实践ContextBuilder::AddInputTd 输入 Tensor 描述接口详解asc devkit Tiling 调测实践ContextBuilder::AddInputTd 输入 Tensor 描述接口详解 在算子 Tiling 函数人工智能深度学习算子库CANNAscend上一篇ant-design Select 语义化定制完全指南用 classNames 与 styles 精准控制每一层 DOM下一篇Appium Inspector与云测试平台集成BrowserStack/Sauce Labs配置教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站