ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CANN opbase 算子开发指南:ADD_TO_LAUNCHER_LIST_AICORE 宏解析与 AI Core 算子执行任务注册

2026/9/19 1:45:35 拓冰建站 浏览量
CANN opbase 算子开发指南:ADD_TO_LAUNCHER_LIST_AICORE 宏解析与 AI Core 算子执行任务注册 人工智能算子库CANNAscend【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址https://gitcode.com/cann/opbase点击查看免费下载导读ADD_TO_LAUNCHER_LIST_AICORE是 CANN opbase 算子库中用于创建 AI Core 算子执行任务的核心宏它把算子的输入、输出、属性等参数封装为执行任务并挂载到aclOpExecutor执行队列中待二阶接口aclnn_Xxx被调用时才真正执行。本文以该宏为核心详细讲解其函数语义、原型与参数约定、与INFER_SHAPE等配套宏的调用顺序约束、底层实现原理基于 make_op_executor.h 与 op_executor.cpp 的源码级证据并给出完整可复制的开发示例帮助算子开发者正确编写 AI Core 算子的 L0 接口注册逻辑。一、宏的功能定位把算子挂进执行队列在 CANN opbase 的算子开发模型中一个完整的算子 L0 接口aclnn_Xxx通常分两个阶段第一阶段创建算子执行任务准备阶段即把算子名、输入张量、输出张量、属性等参数组装成一个可执行的任务描述放入aclOpExecutor执行队列第二阶段调用二阶接口aclnn_Xxx真正的执行阶段此时任务才在指定 stream 上被调度执行。ADD_TO_LAUNCHER_LIST_AICORE负责完成第一阶段中创建 AI Core 算子执行任务这一步。从 make_op_executor.h 的宏定义可以看到该宏实际展开为一次对CreatAiCoreKernelLauncher的调用#define ADD_TO_LAUNCHER_LIST_AICORE(KERNEL_NAME, op_args...) \ ({ \ aclnnStatus addToLaunchRet; \ do { \ op::OpArgContext* opArgCtx GetOpArgContext(op_args); \ addToLaunchRet CreatAiCoreKernelLauncher(#KERNEL_NAME, KERNEL_NAME##OpTypeId(), executor, opArgCtx); \ } while (0); \ addToLaunchRet; \ })关键信息#KERNEL_NAME把算子名转为字符串L0 名称KERNEL_NAME##OpTypeId()通过宏拼接获得该算子注册的 OpTypeIduint32_t类型二者共同定位算子在框架中的唯一身份executor为当前接口上下文中已创建的aclOpExecutor通常由CREATE_EXECUTOR()宏在接口函数入口获得执行任务最终被添加到该执行器的内核启动器列表中整个宏体使用 GNU 语句表达式({...})包裹并返回aclnnStatus因此可以直接作为返回值使用例如return ADD_TO_LAUNCHER_LIST_AICORE(Add, ...);。二、原型与参数说明宏的原型如下ADD_TO_LAUNCHER_LIST_AICORE(KERNEL_NAME, op_args...)参数输入/输出说明KERNEL_NAME输入算子名称例如Add。宏会基于该名称拼接出KERNEL_NAME##OpTypeId()与字符串形式的 L0 名称。op_args...输入算子参数集合由 OP_INPUT、OP_OUTPUT 和 OP_ATTR 等封装宏组合而成用于描述算子的输入张量、输出张量和属性。其中op_args...是可变参数由一系列参数描述宏组成。从 make_op_executor.h 中GetOpArgContext(op_args)的用法可以确认这些宏会先被收集到op::OpArgContext上下文中再按OP_INPUT_ARG、OP_OUTPUT_ARG、OP_ATTR_ARG等参数类型分类提取。参数描述宏速查ADD_TO_LAUNCHER_LIST_AICORE内部会调用或间接使用以下参数宏算子开发者可根据算子签名按需组合OP_INPUT(x...) // 封装算子输入aclTensor / aclTensorList见 OP_INPUT.md OP_OUTPUT(x...) // 封装算子输出aclTensor / aclTensorList OP_ATTR(x...) // 封装算子属性int64_t / double / bool 等标量属性 OP_WORKSPACE(x...) // 声明算子工作空间workspace通常与动态 shape 场景配合 OP_OUTSHAPE(x...) // 指定输出 shape绕过 InferShape 直接给定输出形状 OP_OPTION(x...) // 设置算子执行选项如算子实现模式 OpImplMode OP_EMPTY_ARG // 占位空参数用于某些没有输入或输出的算子 OP_MODE(x...) // 设置算子执行模式见 OpExecMode其中 OP_INPUT 专门用于封装算子的输入aclTensor与aclTensorList若算子包含非aclTensor/aclTensorList类型的输入参数文档明确要求先通过aclOpExecutor::ConvertToTensor将其转换为aclTensor后再用OP_INPUT封装。三、使用约束与 INFER_SHAPE 的调用顺序ADD_TO_LAUNCHER_LIST_AICORE文档的 Restrictions 部分明确了两个关键约束若算子需要 shape 推导INFER_SHAPE必须先调用 INFER_SHAPE再调用本宏。INFER_SHAPE会在任务入队前根据输入 shape 与属性推导出输出 shape确保输出张量在创建执行任务时已经具备正确的形状信息。反过来看INFER_SHAPE 文档也明确要求如果算子需要INFER_SHAPE它必须在本宏之前调用二者形成严格的先后顺序约定。宏定义内部会调用前文列出的一系列参数宏因此调用方传入的op_args...必须与这些宏的用法兼容不能混入未定义的自定义参数形式。为什么顺序如此重要从实现上可以找到两条线索INFER_SHAPE展开为一次独立的InferShape调用只做 shape 推导见 make_op_executor.h不修改执行队列CreatAiCoreKernelLauncher在 op_executor.cpp 中会读取OP_INPUT_ARG、OP_OUTPUT_ARG、OP_ATTR_ARG并据此构建算子图BuildGraph、获取 workspace 大小GetWorkspace。如果输出 shape 尚未通过InferShape推导出来那么入队时拿到的输出张量信息是不完整的后续图构建与执行阶段都可能出错。四、底层执行流程从宏到 AI Core 启动器ADD_TO_LAUNCHER_LIST_AICORE只是入口真正的任务创建逻辑在CreatAiCoreKernelLauncher声明见 op_executor.h实现见 op_executor.cpp。该函数的核心流程可以概括为四步参数校验与选项设置检查args与executor非空否则返回ACLNN_ERR_PARAM_NULLPTR并通过SetOpImplModeCtx将OP_OPTION_ARG中的算子实现模式写入上下文缓存与 workspace 预处理若参数中包含OP_OUTSHAPE_ARG则调用executor-AbandonCache(true)放弃可能已缓存的执行方案因为输出 shape 由调用方显式指定缓存不再可信随后清空 tiling 缓存并通过GetWorkspace依据输入、输出、属性计算工作空间大小将结果AppendOpWorkspaceArg追加到参数上下文创建 AI Core 启动器以opType即KERNEL_NAME##OpTypeId()、op::AI_CORE执行引擎、Profiling 信息与参数上下文构造op::AiCoreKernelLauncher并通过SaveLaunchCtx保存启动上下文入队并构图调用executor-AddToKernelLauncherList(launcher)将启动器挂入aclOpExecutor的执行队列再调用BuildGraph把输入、输出、workspace、outshape 信息构建成算子执行图为第二阶段aclnn_Xxx的实际执行准备好全部材料。值得注意的是make_op_executor.h 中的宏注释给出了一个重要的工程提醒宏参数是右值且会被移动move但由于参数在宏体内可能被使用两次因此不要在op_args...中放置右值——否则第二次使用时右值对象可能已被置空。这是开发者在使用本宏时最容易踩到的坑之一。五、完整使用示例以 Add 算子为例标准的用法是在aclnn_Add接口的第一阶段创建执行任务// 1. 创建/获取执行器executor 已在接口上下文中就绪 // 2. 若算子需要 shape 推导先调用 INFER_SHAPE // INFER_SHAPE(Add, OP_INPUT(self, other), OP_OUTPUT(addOut)); // 3. 调用 ADD_TO_LAUNCHER_LIST_AICORE 创建 AI Core 执行任务 // Add 是算子名称self 和 other 是算子输入参数addOut 是算子输出参数 ADD_TO_LAUNCHER_LIST_AICORE(Add, OP_INPUT(self, other), OP_OUTPUT(addOut));该示例对应的任务语义self与other两个输入张量经OP_INPUT封装addOut输出张量经OP_OUTPUT封装宏把三者组装成 Add 算子的 AI Core 执行任务放入执行队列当二阶接口aclnn_Add被调用时任务才在指定 stream 上真正执行。带属性算子的写法若算子带有属性如 BatchMatMul 的转置开关、偏移量等只需在op_args...中追加OP_ATTR// 参考 INFER_SHAPE 文档中的 BatchMatMulV3 示例ADD_TO_LAUNCHER_LIST_AICORE 的写法一致 ADD_TO_LAUNCHER_LIST_AICORE(BatchMatMulV3, OP_INPUT(x1, x2, bias, nullptr), OP_OUTPUT(bmmOut), OP_ATTR(adjX1, adjX2, offsetX, opImplModeEnum));可以看到op_args...中OP_INPUT、OP_OUTPUT、OP_ATTR的排列顺序与数量非常灵活框架通过OpArgContext按参数类型分类提取并不要求严格的书写顺序。六、配套宏与相关文档导航ADD_TO_LAUNCHER_LIST_AICORE是 common_macros_and_classes 宏与类家族中的一员。围绕 AI Core 算子执行任务注册以下文档与宏密切相关建议组合阅读INFER_SHAPE输出 shape 推导须在本宏之前调用ADD_TO_LAUNCHER_LIST_AICPUAICPU 算子对应的任务注册宏执行引擎为 CPUCREATE_EXECUTOR在接口入口创建aclOpExecutorOP_INPUT / OP_OUTPUT / OP_ATTR算子参数封装宏OP_WORKSPACE / OP_OUTSHAPE工作空间与显式输出 shape 声明OP_OPTION / OP_MODE / OP_EMPTY_ARG执行选项、执行模式与空参数占位OpImplMode / OpExecMode算子实现模式与执行模式枚举说明。仓库中的相关实现与测试证据宏定义 make_op_executor.h底层启动器创建与图构建 op_executor.cpp启动器函数声明 op_executor.h宏在真实算子接口中的调用示例 aclnn_mul_stub.cpp执行器相关单测 test_op_executor.cpp、test_op_cache.cpp。七、常见问题与注意事项不要忘记调用顺序需要 shape 推导的算子若先调用ADD_TO_LAUNCHER_LIST_AICORE再调用INFER_SHAPE输出 shape 信息缺失会导致任务入队与执行异常不要在参数中放置右值宏参数会被移动且可能被使用两次右值会在第二次使用时被置空应使用具名左值变量输入参数必须是 aclTensor 类型非张量输入需先用aclOpExecutor::ConvertToTensor转换参见 OP_INPUT 的 Restrictionsworkspace 与 outshape 的取舍若显式提供OP_OUTSHAPE框架会放弃相关执行缓存AbandonCache(true)若需动态 workspace可借助OP_WORKSPACE声明由框架在入队时通过GetWorkspace计算并追加返回值处理宏返回aclnnStatus应在接口函数中作为返回值传播或检查遵循框架统一的错误码约定如ACLNN_ERR_PARAM_NULLPTR、ACLNN_SUCCESS。结语ADD_TO_LAUNCHER_LIST_AICORE是连接算子参数描述与AI Core 执行队列的桥梁一方面通过OP_INPUT/OP_OUTPUT/OP_ATTR等宏把算子签名收敛为统一参数上下文另一方面通过CreatAiCoreKernelLauncher完成 workspace 计算、启动器创建与算子图构建为二阶接口aclnn_Xxx的异步执行铺平道路。理解它的宏展开细节、调用顺序约束与底层流程是正确编写 CANN AI Core 算子 L0 接口的关键一步。赞分享人工智能算子库CANNAscend【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址https://gitcode.com/cann/opbase点击查看免费下载相关推荐CANN opbase 中 AI CPU 算子执行任务注册宏 ADD_TO_LAUNCHER_LIST_AICPU 完全指南CANN opbase 中 AI CPU 算子执行任务注册宏 ADD_TO_LAUNCHER_LIST_AICPU 完全指南 导读 ADD_TO_LAUNCHE人工智能算子库CANNAscendSteam成就管理终极指南揭秘SAM架构设计与技术实现Steam成就管理终极指南揭秘SAM架构设计与技术实现 Steam Achievement ManagerSAM是一款专为Steam平台设计的开源成就管理人工智能算子库CANNAscendCANN opbase ADD_TO_LAUNCHER_LIST_AICPU 宏详解AI CPU 算子执行任务创建与队列入队CANN opbase ADD_TO_LAUNCHER_LIST_AICPU 宏详解AI CPU 算子执行任务创建与队列入队 导读 ADD_TO_LAUNCH人工智能算子库CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考