
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载在 asc-devkit 的 Tiling 调测Utils-API / Tiling_tuning体系中开发者经常需要在脱离完整图执行引擎的情况下独立验证自己编写的 Tiling 函数与 TilingParse 函数。ContextBuilder类就是为此提供的上下文手工构造工具而Inputs是其“kernel context builder”分组中的第一个接口它把一组void*指针组成的 vector 设置为 KernelContext 的 inputs。读完本文你可以掌握Inputs的原型、参数语义与调用方式并结合 context_builder.h、context_builder.cpp 与单元测试 test_tiling.cpp 理解它内部的转发链路以及它与Outputs、BuildKernelRunContext配合使用时的完整调用链。功能定位Inputs 属于哪一类构造器ContextBuilder位于context_ascendc命名空间提供一系列链式 API支持两类上下文的手工构造见 ContextBuilder 简介KernelContext 构造用于TilingParse函数的验证相关接口为Inputs、Outputs、BuildKernelRunContextTilingContext 构造用于 Tiling 函数的验证相关接口为SetOpNameType、NodeIoNum、AddInputTd、AddOutputTd、AddAttr、TilingData、Workspace、BuildTilingContext等。Inputs属于前者。从 context_builder.h 的类声明可以看到ContextBuilder将方法按注释分组class ContextBuilder { public: // kernel context builder ContextBuilder Inputs(std::vectorvoid * inputs); ContextBuilder Outputs(std::vectorvoid * outputs); std::shared_ptrKernelRunContextHolder BuildKernelRunContext(); // OpInfo ... // Tiling Context Builder ... private: std::unique_ptrContextBuilderImpl impl_; };其中ContextBuilder禁止了移动构造与移动赋值delete是一个以内部ContextBuilderImplpimpl 模式为存储核心的值类型对象。函数原型与参数说明Inputs的函数原型为ContextBuilder Inputs(std::vectorvoid * inputs);参数说明继承自 Inputs.md 原文档参数输入/输出说明inputs输入保存输入的 void* 指针 vector返回值说明当前ContextBuilder的对象即*this的引用。这也是ContextBuilder全族接口的设计约定——所有 Setter 类方法均返回自身引用从而支持.Inputs(...).Outputs(...).BuildKernelRunContext()这样的链式调用。约束说明无原文档约束为“无”。但从源码结构看接口内部做了防御性检查下文“实现剖析”一节会具体说明。实现剖析Inputs 的转发链路Inputs的公有实现位于 context_builder.cppContextBuilder ContextBuilder::Inputs(std::vectorvoid* inputs) { ASCENDC_ASSERT(impl_ ! nullptr, return *this, CXT_ASCENDC_LOGE(impl_ is nullptr!)); impl_-Inputs(inputs); return *this; }从源码可以看到两层设计空指针防御虽然文档约束说明为“无”但实现上通过ASCENDC_ASSERT断言内部impl_非空若断言失败会打印错误日志impl_ is nullptr!并直接返回*this不会使程序崩溃。这意味着即使出现内部状态异常链式调用也能安全地继续走下去错误在最终的BuildKernelRunContext阶段以返回nullptr的形式暴露。pimpl 转发真正的逻辑委托给ContextBuilderImpl::Inputs其定义在 context_builder_impl.cppvoid ContextBuilderImpl::Inputs(std::vectorvoid* inputs) { ASCENDC_ASSERT(kernelCtxBuilder_ ! nullptr, return, CXT_ASCENDC_LOGE(kernelCtxBuilder_ is nullptr!)); kernelCtxBuilder_-Inputs(inputs); }kernelCtxBuilder_是gert::OpKernelContextBuilder类型在 ContextBuilderImpl 构造函数 中创建ContextBuilderImpl::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::Inputs→ContextBuilderImpl::Inputs→gert::OpKernelContextBuilder::Inputs。指针 vector 最终被保存在底层的OpKernelContextBuilder中等待BuildKernelRunContext触发kernelCtxBuilder_-Build()生成真正的gert::KernelContext对象见 BuildKernelRunContext 实现。这里可以推断inputs中每个元素指向的数据如 shape 结构、TensorData结构等由调用方负责其生命周期ContextBuilder只是保存指针本身这也是参数类型为void*而非具体结构体的原因——它面向的是 TilingParse 约定的“第 N 个输入参数地址”这一通用契约。调用示例原文档给出的最小调用示例PlatformInfo platformInfo; auto contextBuilder context_ascendc::ContextBuilder().Inputs({nullptr, reinterpret_castvoid *(platformInfo)});示例中第一个元素为nullptr、第二个元素指向一个PlatformInfo对象演示了“按输入序号放置参数指针”的用法。结合仓库单元测试 TestKernelContextBuild一个更贴近实战的完整示例如下string active_type gelu; gert::Shape input1_shape {2, 1, 1, 1, 1, 1, 1, 2, 2}; int32_t input1_tensor_buffer[] {0, 2, 3, 3, 1, 0, 0, 1}; gert::TensorData input1_tensor_data{(void*)input1_tensor_buffer, nullptr}; gert::Shape output_shape {5, 3}; int64_t output_tensor_buffer[15]; gert::TensorData output_tensor_data{(void*)output_tensor_buffer, nullptr}; context_ascendc::ContextBuilder kernelRunContextBuilder; auto kernelHolder kernelRunContextBuilder .Inputs({reinterpret_castvoid*(input1_shape), reinterpret_castvoid*(input1_tensor_data)}) .Outputs({reinterpret_castvoid*(output_shape), reinterpret_castvoid*(output_tensor_data)}) .BuildKernelRunContext(); auto context kernelHolder-GetContextgert::KernelContext(); EXPECT_NE(context, nullptr);这段代码演示了典型的 TilingParse 验证场景准备两个输入参数gert::Shape输入张量的 shape和gert::TensorData输入张量数据内部指向一个int32_t缓冲区调用Inputs时按 TilingParse 函数约定的输入顺序将二者地址放入 vector对称地用Outputs设置输出参数shape 与TensorData调用BuildKernelRunContext()得到KernelRunContextHolder的智能指针通过GetContextgert::KernelContext()取出上下文之后即可将其传给 TilingParse 函数进行验证。需要注意BuildKernelRunContext失败时返回nullptr例如内部构建出错因此实际代码中应先判空再使用holder-GetContext...()。配套接口KernelRunContextHolder 与 OutputsInputs的产出最终由 KernelRunContextHolder 结构体承载其定义见 context_builder.hstruct KernelRunContextHolder { KernelRunContextHolder(); ~KernelRunContextHolder(); templatetypename T T *GetContext() const { return reinterpret_castT*(kernelContext); } gert::ComputeNodeInfo *MutableComputeNodeInfo(); std::unique_ptrValueHolderImpl valueHolder; std::unique_ptruint8_t[] computeNodeExtendHolder; KernelRunContext *context {nullptr}; // ...私有成员与私有构造函数略 };关键成员与方法的含义GetContextT()将内部kernelContext成员转换为模板类型T的指针。T可选KernelContext及其子类如TilingContextMutableComputeNodeInfo()返回构造出的gert::ComputeNodeInfo类指针valueHolder保证KernelRunContextHolder内部值不析构的智能指针computeNodeExtendHolder可转化成ComputeNodeInfo类的智能指针context指向KernelRunContext类的指针。与Inputs配对的Outputs将void*指针 vector 设置为 KernelContext 的 outputs原型与语义完全对称ContextBuilder Outputs(std::vectorvoid * outputs);两者均返回当前ContextBuilder对象且通常必须与BuildKernelRunContext组合使用才能拿到可用上下文。小结与验证入口ContextBuilder::Inputs是 Tiling 调测中“无框架手工构造 KernelContext”三步曲Inputs→Outputs→BuildKernelRunContext的第一步。理解它时把握三点即可参数是std::vectorvoid *按 TilingParse 约定的输入顺序存放各输入参数shape、TensorData等的地址返回ContextBuilder用于链式调用内部经ContextBuilderImpl转发至gert::OpKernelContextBuilder并在断言失败时优雅降级返回自身/空指针而不崩溃。相关的仓库验证入口包括头文件声明context_builder.h公有实现context_builder.cpp内部实现context_builder_impl.cpp单元测试test_tiling.cppTestKernelContextBuild用例接口文档族ContextBuilder.md、BuildKernelRunContext.md、Outputs.md赞分享人工智能深度学习算子库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::CompileInfo 接口详解向 TilingContext 注入编译期信息的完整用法与源码解析asc devkit 中 ContextBuilder::CompileInfo 接口详解向 TilingContext 注入编译期信息的完整用法与源码解析人工智能深度学习算子库CANNAscend上一篇Gatsby v2.27.0 发布解读create-gatsby 交互式建站与 develop 开发体验加速实验下一篇Tinycast 卸载应用功能解析只进废纸篓、绝不删除的 macOS 残留清理设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考