asc-devkit 算子原型注册:使用 OpAICPUDef::KernelSo 配置 AICPU 算子动态库名称
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载本文是 CANN asc-devkit 算子原型注册与管理prototype register management系列中的一篇 API 实战指南核心讲解 OpAICPUDef 的KernelSo配置接口它用于指定 AI CPUAICPU算子实现文件编译生成的动态库.so文件名称是自定义 AICPU 算子原型定义中把核函数实现产物与算子注册信息关联起来的关键一环。读完本文你将掌握KernelSo的签名、参数语义与链式调用方式并理解它和 AI CPU 算子编译、OP_ADD原型注册流程之间的完整关系。KernelSo 是什么一句话定位在 asc-devkit 的算子原型注册体系中算子原型通过一个继承自OpDef的 C 类承载详见算子原型定义而 AI CPU 算子的实现信息由OpAICPUDef描述。OpDef::AICPU() 返回OpAICPUDef引用开发者在该引用上链式调用Engine、OpkernelLib、KernelSo、FunctionName等接口完成 AICPU 算子配置。KernelSo的职责非常单一明确配置 AICPU 算子实现文件编译生成的动态库文件的名称。也就是说开发者编写的 AICPU 算子核函数实现.aicpu文件或-x aicpu方式编译的.cpp文件最终会被编译成动态库.soKernelSo(...)中的字符串值即用于向框架声明这个动态库的名字供算子调度与加载时定位使用。它属于部署前注册信息与OpkernelLib固定为CUSTAICPUKernel、FunctionName固定为RunCpuKernel等配置共同构成 AICPU 自定义算子被框架识别、编译和执行所需的完整描述。函数原型与参数语义KernelSo的函数原型如下OpAICPUDef KernelSo(const char *value)参数说明参数输入/输出说明value输入AI CPU 算子实现文件编译生成的动态库文件的名称其中value是const char *类型的字符串应当与编译 AICPU 算子实现文件后产出的动态库文件名保持一致。例如使用bisheng -shared -x aicpu编译出的libxxx.so其库名通常即对应此处的value。建议在原型定义中显式、准确填写避免算子注册信息与实际产物名称不一致导致运行时无法定位实现库。返回值说明返回类型为OpAICPUDef 即返回算子定义对象自身的引用支持继续链式调用其他配置接口例如this-AICPU() .Engine(DNN_VM_AICPU) .OpkernelLib(CUSTAICPUKernel) .KernelSo(libxxx.so) .FunctionName(RunCpuKernel);关于OpAICPUDef的完整说明请参考 OpAICPUDef。约束说明无。KernelSo没有额外使用约束但需注意其语义强依赖编译产物命名实际开发中应保证配置值与构建产物一致。使用场景AICPU 算子原型注册流程KernelSo出现在 AICPU 自定义算子原型定义阶段。整体流程如下编写 AICPU 算子实现以.aicpu为后缀或.cpp-x aicpu编译选项定义__global__ __aicpu__修饰的核函数例如仓库示例 aicpu_tiling.aicpu 中的MyAicpuKernel。AI CPU 编程规范详见 AI CPU编程。编译生成动态库使用bisheng或 CMake 将实现文件编译为.so。在 Host 侧原型文件中通过继承OpDef的算子类构造函数调用this-AICPU()获取OpAICPUDef链式配置Engine、OpkernelLib、KernelSo、FunctionName等。在文件末尾通过OP_ADD(opType)注册算子类型见 OP_ADD编译工具据此识别算子原型并生成 aclnn 接口、图模式原型等相关代码。一个典型的 AICPU 原型定义骨架如下namespace ops { class AddCustom : public OpDef { public: explicit AddCustom(const char* name) : OpDef(name) { // 输入输出、属性定义Input/Output/Attr this-Input(x) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16}) .Format({ge::FORMAT_ND}); this-Output(z) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16}) .Format({ge::FORMAT_ND}); // AICPU 实现信息引擎、kernelLib、动态库名称、核函数接口名 this-AICPU() .Engine(DNN_VM_AICPU) .OpkernelLib(CUSTAICPUKernel) .KernelSo(libadd_custom_aicpu.so) .FunctionName(RunCpuKernel); } }; OP_ADD(AddCustom); } // namespace ops与 KernelSo 配套的 OpAICPUDef 配置项速查KernelSo是OpAICPUDef提供的众多链式配置接口之一。为了正确填写原型定义下表汇总了同系列接口的固定取值要求均可在原型注册与管理目录下找到对应 API 文档接口功能取值要求Engine配置算子调用的引擎固定为DNN_VM_AICPUOpkernelLib配置算子调用的 kernelLib固定为CUSTAICPUKernelKernelSo配置实现文件编译生成的动态库名称与编译产物.so名称一致FunctionName配置核函数Kernel接口名称固定为RunCpuKernelUserDefined配置是否为用户自定义算子仅支持True缺省默认为TrueComputeCost预留参数固定为100FlagPartial预留参数固定为FalseFlagAsync预留参数固定为FalseExtendCfgInfo额外添加键值对形式的扩展配置keyvalue自定义从这张表可以推断KernelSo是整个 AICPU 注册信息中唯一需要开发者根据自己工程实际填写产物名称的字段其余多数字段都是框架约定的固定值因此它也是最容易因拼写或命名不一致而引发问题的配置项。深度原理KernelSo 对应的动态库从何而来KernelSo的取值不是凭空约定而是与 AI CPU 算子的编译产物一一对应。仓库中的 AI CPU算子编译 文档说明了动态库的生成方式与 AI Core 算子只需一个.asc文件即可编译不同AI CPU 算子需要同时包含.aicpu文件核函数定义和.asc文件通过内核调用符调用核函数才能编译生成可执行文件。当需要把 AI CPU 算子实现打包为动态库时使用 bisheng 命令行# 编译 test_aicpu.cpp 生成算子动态库 # -lxxx 表示默认链接库 bisheng -shared -x aicpu test_aicpu.cpp -o libtest_aicpu.so -lxxx ...其中-shared/--shared编译生成动态链接库-x aicpu指定编译语言为 AICPU表明编译的是 AI CPU 算子编程语言代码-o libtest_aicpu.so指定输出动态库文件名该名称正是KernelSo(...)中应填写的值。若单独编译 AI CPU 算子代码生成动态库、静态库需要手动链接内置链接库如ascendc_runtime、ascendcl、runtime等。使用 CMake 时同样可以将.aicpu文件直接打入动态库例如# 将 .cpp 文件置为 AICPU 属性支持 AI CPU 算子编译 set_source_files_properties( aicpu_kernel.cpp PROPERTIES LANGUAGE AICPU ) add_library(kernel_lib SHARED add_custom_base.cpp aicpu_kernel.cpp # 支持 AI CPU 算子与 AI Core 算子一起打包为动态库 )从上述编译链路可以推断KernelSo本质上是在算子原型注册信息中登记运行时按名加载的库文件标识——框架拿到算子注册信息后需要根据这个名称在部署目录中找到对应的.so再结合FunctionNameRunCpuKernel定位库内核函数入口。因此动态库名称的拼写、大小写与编译输出必须严格一致这是KernelSo配置正确的核心要求。实际工程中的注意事项结合仓库文档与示例使用KernelSo时有几点值得留意产物命名一致性KernelSo的值应与bisheng -shared -x aicpu ... -o name或 CMakeadd_library(... SHARED)产出的库文件名一致。若使用默认库前缀lib请确认注册时填写的字符串与最终文件名匹配。与固定字段协同AICPU 自定义算子的Engine固定为DNN_VM_AICPU、OpkernelLib固定为CUSTAICPUKernel、FunctionName固定为RunCpuKernel不要擅自改动这些约定值见各字段文档的取值要求。原型注册位置KernelSo的调用位于 Host 侧算子原型文件如op_host/add_custom.cpp中自定义算子类的构造函数内通过this-AICPU()进入OpAICPUDef配置链最终由文件末尾的OP_ADD(AddCustom)完成注册详见算子原型定义。可参考仓库样例04_aicpu 样例 展示了 AICPU 算子含 Tiling 下沉从核函数实现到工程组织的完整形态其中 aicpu_tiling.aicpu 演示了__global__ __aicpu__核函数的标准写法可作为编写实现文件、进而配置KernelSo的参照。总结OpAICPUDef::KernelSo是 asc-devkit 自定义 AICPU 算子原型注册中的一个小而关键的配置接口它用一个字符串把算子原型和算子实现编译产出的动态库绑定起来。掌握它的签名OpAICPUDef KernelSo(const char *value)、取值语义与.so编译产物名称一致以及在OpAICPUDef链式配置中的位置再结合Engine、OpkernelLib、FunctionName等固定字段和OP_ADD注册流程即可完整、正确地完成一个 AICPU 自定义算子的原型定义与注册。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit 算子原型注册OpAICPUDef::Engine 接口详解与 AICPU 算子引擎配置实战asc devkit 算子原型注册OpAICPUDef::Engine 接口详解与 AICPU 算子引擎配置实战 本篇技术指南围绕 asc devkitCA人工智能深度学习算子库CANNAscendasc-devkit 算子原型注册系列OpAICPUDef::ExtendCfgInfo 扩展配置接口详解asc devkit 算子原型注册系列OpAICPUDef::ExtendCfgInfo 扩展配置接口详解 导读 ExtendCfgInfo 是 asc de人工智能深度学习算子库CANNAscendasc-devkit 算子原型注册详解OpAICPUDef::FlagAsync 预留参数的语义与正确用法asc devkit 算子原型注册详解OpAICPUDef::FlagAsync 预留参数的语义与正确用法 导读 FlagAsync 是 CANN asc d人工智能深度学习算子库CANNAscend上一篇LiteLLM Grafana 监控看板实战导入 gen_ai 与 litellm_* 指标 JSON读懂每一块 Panel 的 PromQL下一篇TypeScript 与 React Native Game Engine完整的类型安全游戏开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考