
CANN opbase 中 OP_ATTR_NAMES 宏详解AI CPU 算子属性名的封装与传递机制【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读OP_ATTR_NAMES是 CANN opbase 框架库中用于封装 AI CPU 算子属性名的核心宏它把一组算子属性名如Tindices、T、use_locking封装成op::FVectorstd::string并作为算子注册/启动宏如ADD_TO_LAUNCHER_LIST_AICPU的参数参与算子执行任务在aclOpExecutor中的构建。读完本文你将掌握该宏的原型、参数语义、与属性值序列化的底层配合机制以及在实际算子二次开发中的标准用法。宏定位AI CPU 算子声明体系中的属性名载体在 opbase 的算子开发接口中一个 AI CPU 算子的执行任务通过ADD_TO_LAUNCHER_LIST_AICPU宏注册其完整形态为ADD_TO_LAUNCHER_LIST_AICPU(KERNEL_NAME, attrNames, opArgs...)其中第二个参数attrNames即由OP_ATTR_NAMES(...)生成。换言之OP_ATTR_NAMES是算子启动宏中专门负责声明哪些参数属于算子属性Attribute的部分它与声明输入OP_INPUT、输出OP_OUTPUT、属性值OP_ATTR的宏各司其职OP_ATTR_NAMES({accumulate})声明属性名字集合OP_ATTR(accumulate)声明属性值算子原型中的属性参数OP_INPUT(...)/OP_OUTPUT(...)声明输入/输出张量。两者按属性名——属性值的顺序对应最终在框架内部完成装配。可见 common_macros_and_classes.md 中的宏清单以及与 ADD_TO_LAUNCHER_LIST_AICPU、OP_ATTR 的关系。宏原型与类型本质OP_ATTR_NAMES的原型声明如下OP_ATTR_NAMES::op::FVectorstd::string这里的OP_ATTR_NAMES本质上是一个类型别名宏并非函数调用。其真实定义位于 aicpu_task.h#define OP_ATTR_NAMES ::op::FVectorstd::string也就是说OP_ATTR_NAMES({Tindices, T, use_locking})展开后等价于构造一个op::FVectorstd::string类型的临时对象其初始化列表即算子属性名集合。而FVector是 opbase 提供的高性能容器别名定义于 fast_vector.htemplate typename T, size_t N 8 using FVector op::internal::SmallVectorT, N, op::internal::PoolAllocatorT;可以看到FVectorstd::string由三层组件叠加而成组成作用SmallVectorT, N小对象优化容器元素数量不超过 8 时直接在栈上存储避免堆分配PoolAllocatorT池化分配器复用已释放的内存块降低频繁构造/析构std::string的开销std::string属性名的实际数据类型因此OP_ATTR_NAMES在声明属性名之外还天然继承了 opbase 面向算子注册热路径的性能优化属性名列表通常只有 1~3 项正好落进SmallVector的栈上容量不会触发堆内存分配。参数说明参数输入/输出说明/无显式命名参数输入AI CPU 算子的属性名列表类型为std::string的FVector。默认值为空的FVector即OP_ATTR_NAMES()。需要说明的是该宏不接受单个字符串而是接受一个字符串初始化列表当算子没有任何属性时直接使用空括号形式OP_ATTR_NAMES()这在 test_op_cache.cpp 的注释示例中可以看到// ADD_TO_LAUNCHER_LIST_AICPU(Gelu, OP_ATTR_NAMES(), OP_INPUT(self.get()), OP_OUTPUT(out.get()));调用示例官方示例封装三个属性名OP_ATTR_NAMES.md 给出的标准示例// 封装 AI CPU 算子的 3 个属性名为 Tindices、T 和 use_locking OP_ATTR_NAMES({Tindices, T, use_locking});实战示例IndexPut 算子的完整注册ADD_TO_LAUNCHER_LIST_AICPU.md 展示了OP_ATTR_NAMES在真实算子中的完整用法——IndexPut算子带一个名为accumulate的属性ADD_TO_LAUNCHER_LIST_AICPU(IndexPut, OP_ATTR_NAMES({accumulate}), OP_INPUT(selfRef, values, masks, indices), OP_OUTPUT(out), OP_ATTR(accumulate));这条语句的语义是为IndexPut算子创建一个 AI CPU 执行任务并放入aclOpExecutor执行队列任务在二段式 APIaclnn_IndexPut被调用时真正执行。其中OP_ATTR_NAMES({accumulate})负责告诉框架该算子有一个名为accumulate的属性OP_ATTR(accumulate)则把实际属性值传下去。底层原理属性名如何一路传递到 AI CPU 任务OP_ATTR_NAMES的价值不仅在于声明更在于它驱动了框架内部属性名→属性值的装配流程。从源码看完整的调用链如下宏展开入口ADD_TO_LAUNCHER_LIST_AICPU展开为对CreatAicpuKernelLauncher的调用见 aicpu_task.hattrNames即OP_ATTR_NAMES(...)产生的FVectorstd::string作为参数传入addToLaunchRet CreatAicpuKernelLauncher(KERNEL_NAME##OpTypeId(), space, executor, attrNames, opArgCtx);创建/复用任务在 aicpu_task.cpp 中CreatAicpuKernelLauncher调用space.GetOrCreateTask(executor, attrNames, args)属性名列表参与算子执行任务的创建与缓存查询随后构造AiCpuKernelLauncher并将其加入执行器的启动器列表。按名装配属性值在 aicpu_task_base.cpp 中CreateAicpuAttrs遍历OP_ATTR传入的属性值参数并按下标与attrNames一一对应static aclnnStatus CreateAicpuAttrs(OpArgList attrsArg, const FVectorstd::string attrNames, AicpuAttrs attrs) { AICPU_ASSERT_TRUE_RETVAL(attrsArg.count attrNames.size()); // 个数必须一致 attrsArg.VisitByNoReturn( { CreateAicpuAttrsImpl(arg, idx, attrNames, attrs); }); }其中CreateAicpuAttrsImpl根据属性值的实际类型aclIntArray、aclFloatArray、aclTensorList、bool、int64_t、float、double、op::DataType、std::string等调用AddAicpuAttr最终以attrs[attrNames[idx]] AnyValue::CreateFrom(value)的形式写入AicpuAttrs键值容器供 AI CPU 内核侧通过属性名读取。从这条链路可以归纳出两个关键实现事实属性名与属性值按下标一一对应因此OP_ATTR_NAMES中属性的书写顺序必须与OP_ATTR一致且二者个数必须相等框架会以attrsArg.count attrNames.size()断言校验属性名是属性在框架内的键AI CPU 内核通过字符串名字从AicpuAttrs中取值所以名字必须与内核实现约定的属性名完全一致如accumulate、Tindices。约束与注意事项配合INFER_SHAPE使用若算子需要INFER_SHAPEADD_TO_LAUNCHER_LIST_AICPU必须在INFER_SHAPE之后调用见 ADD_TO_LAUNCHER_LIST_AICPU.mdOP_ATTR_NAMES同样遵循此顺序约束。无属性算子当算子没有属性时使用OP_ATTR_NAMES()空FVector无需显式写std::string类型。类型匹配属性名必须是const char*字符串字面量或可隐式转换为std::string的值属性名集合与OP_ATTR属性值集合必须等长且顺序一致否则在任务构建阶段会被断言拦截。作用范围OP_ATTR_NAMES仅用于 AI CPU 算子AI Core 算子对应ADD_TO_LAUNCHER_LIST_AICORE等接口其头文件依赖位于 aicpu_task.h 对应的 AICPU 任务处理模块中。总结OP_ATTR_NAMES看似只是一个简单的类型别名宏却是 AI CPU 算子属性声明体系的关键一环它以op::FVectorstd::string承载属性名借助SmallVector与PoolAllocator获得注册热路径上的性能优势并通过ADD_TO_LAUNCHER_LIST_AICPU将属性名一路传递到任务创建与属性装配阶段最终以名值对的形式供内核侧访问。理解这一机制是编写规范、可复用 AI CPU 算子注册代码的前提。延伸阅读OP_ATTR算子属性参数的封装ADD_TO_LAUNCHER_LIST_AICPUAI CPU 执行任务的创建与入队公共宏与类清单中文版OP_ATTR_NAMES关键源码aicpu_task.h、aicpu_task.cpp、aicpu_task_base.cpp、fast_vector.h【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考