人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载导读在 CANN asc-devkit 的算子工程化开发流程中Tiling分片/切分逻辑负责根据输入 shape 等信息在 Host 侧计算出算子运行所需的 Tiling 数据。OpTilingRegistry类位于context_ascendc命名空间提供了LoadTilingLibrary接口用于在运行时按路径加载算子编译产出的 Tiling 动态库将库中注册的 Tiling 实现纳入全局算子实现注册表配合GetTilingFunc获取 Tiling 函数指针即可在脱离完整推理框架的情况下对单个算子的 Tiling 逻辑进行独立调试与验证。读完本文你将掌握LoadTilingLibrary的函数原型、参数与返回值语义、底层加载原理dlopen/dlsym调用链、两种 Tiling 动态库获取方式以及完整的调用示例与失败排查思路。一、接口概述OpTilingRegistry 与 LoadTilingLibraryOpTilingRegistry是 asc-devkit 中用于 Tiling 调测的注册表类公开成员包括构造/析构函数、GetTilingFunc和LoadTilingLibrary其类声明位于 include/utils/context/context_builder.hclass OpTilingRegistry { public: OpTilingRegistry() default; ~OpTilingRegistry() default; TilingFunc GetTilingFunc(const char *opType) const; bool LoadTilingLibrary(const char *tilingSoPath) const; private: std::shared_ptrOpTilingRegistryImpl impl_; };从接口设计看两个公开方法的职责是互补的LoadTilingLibrary负责把 Tiling 动态库加载进来并写入全局注册表GetTilingFunc负责按算子类型OpType从注册表中取出对应的 Tiling 函数指针。二者通常配合ContextBuilder使用——后者用于构造 Tiling 函数所需的输入参数shape、attr、平台信息等具体组合调测流程可参考 Tiling 调测指南。使用前提头文件与库文件按照 OpTilingRegistry 简介 的说明使用该类需要包含头文件#include tiling/context/context_builder.h链接静态库libtiling_api.a二、功能说明加载什么、为什么需要加载LoadTilingLibrary的功能是根据输入的路径加载对应的 Tiling 动态库。开发者基于工程化算子开发方式完成算子实现后可通过“算子包编译”或“算子动态库编译”两种方式获取 Tiling 动态库文件获取方式Tiling 实现所在文件参考文档算子包编译算子包部署目录下的liboptiling.so编译与部署基本流程算子动态库编译算子动态库libcust_opapi.so中的 Tiling 实现算子动态库和静态库编译以默认安装场景为例算子包部署后liboptiling.so位于opp/vendors/vendor_name1/op_impl/ai_core/tbe/op_tiling/lib/目录下见 basic_process.md 中的部署目录结构而动态库编译模式下Tiling 实现与算子主体一同集成在libcust_opapi.so中该动态库由TYPE SHARED模式产出用于应用或图模式流程的动态链接。为什么要显式加载因为在 Tiling 调测场景中算子 Tiling 逻辑并不是常驻内存的需要在调测程序启动后将编译产物中的 Tiling 符号动态装载进进程才能通过GetTilingFunc查询并使用。这正是LoadTilingLibrary存在的意义。三、函数原型与参数说明函数原型定义见 LoadTilingLibrary.mdbool LoadTilingLibrary(const char *tilingSoPath) const参数说明参数名输入/输出描述tilingSoPath输入Tiling 动态库的路径支持相对路径与绝对路径返回值说明trueTiling 动态库加载成功falseTiling 动态库加载失败具体错误可参考 Log 信息。关于日志配置与查看可参考《环境变量参考》中日志相关环境变量asc-devkit 中 Tiling 侧日志宏CXT_ASCENDC_LOGE/CXT_ASCENDC_LOGD的定义与使用见 context_builder.cpp。约束说明无。四、底层实现原理从路径校验到符号注册LoadTilingLibrary的实现位于 impl/utils/context/context_builder.cpp核心调用链如下tilingSoPath └─ 空指针校验tilingSoPath nullptr → false └─ 路径长度校验strlen PATH_MAX → false └─ realpath() 解析为绝对路径文件不存在 → false └─ dlopen(path, RTLD_LAZY) 打开动态库失败 → false └─ dlsym(handle, TbeLoadSoAndSaveToRegistry) 查找注册函数失败 → dlclose false └─ 调用 registryFunc(absFilePath) 将 Tiling 实现写入全局注册表 └─ dlclose(handle) 关闭句柄返回 true各步骤对应的源码逻辑bool OpTilingRegistry::LoadTilingLibrary(const char* tilingSoPath) const { if (tilingSoPath nullptr) { CXT_ASCENDC_LOGE(tilingSoPath is null.); return false; } if (strlen(tilingSoPath) PATH_MAX) { CXT_ASCENDC_LOGE(OpTilingRegistry tiling so path [%s] is too long., tilingSoPath); return false; } char resovedPath[PATH_MAX] {0}; if (realpath(tilingSoPath, resovedPath) nullptr) { CXT_ASCENDC_LOGE(OpTilingRegistry Tiling so path [%s] is not exist., tilingSoPath); return false; } std::string absFilePath(resovedPath); void* handle nullptr; void (*registryFunc)(const char*); handle dlopen(absFilePath.c_str(), RTLD_LAZY); if (handle nullptr) { CXT_ASCENDC_LOGE(OpTilingRegistry dlopen so path [%s] failed., absFilePath.c_str()); return false; } registryFunc reinterpret_castvoid (*)(const char*)(dlsym(handle, TbeLoadSoAndSaveToRegistry)); if (registryFunc nullptr) { dlclose(handle); CXT_ASCENDC_LOGE(OpTilingRegistry get TbeLoadSoAndSaveToRegistry func failed.); return false; } registryFunc(absFilePath.c_str()); dlclose(handle); return true; }几个值得注意的实现细节路径规范化传入的相对路径会先经realpath()解析为绝对路径再交给dlopen因此文档中“支持相对路径与绝对路径”的约束在实现层得到了保证同时路径不存在的场景会在realpath阶段被提前拦截并记录错误日志。符号约定动态库中必须导出TbeLoadSoAndSaveToRegistry(const char*)符号。该符号是 Tiling 库与 asc-devkit 运行时之间的“握手协议”其职责是接收库的绝对路径并完成 Tiling 实现的注册dlsym找不到该符号时函数会先dlclose再返回false避免句柄泄漏。加载模式dlopen使用RTLD_LAZY延迟绑定符号在首次被引用时才解析配合加载完成后立即dlclose的设计说明该接口的主要目的是“触发注册动作”而非长期持有动态库句柄——注册动作完成后Tiling 函数指针已保存在全局注册表gert::DefaultOpImplSpaceRegistryV2中后续由GetTilingFunc按 OpType 查询其查询实现见 context_builder.cpp。五、调用示例与完整调测流程官方给出的最小调用示例如下context_ascendc::OpTilingRegistry tmpIns; bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); if (flag false) { std::cout Load tiling so failed std::endl; ... } // ...在实际的 Tiling 调测场景中更完整的用法是与GetTilingFunc配合加载后按算子类型取出 Tiling 函数指针#include tiling/context/context_builder.h context_ascendc::OpTilingRegistry tmpIns; // 1. 加载 Tiling 动态库算子包编译产物或动态库编译产物 bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); if (flag false) { std::cout Load tiling so failed std::endl; return -1; } // 2. 按算子类型获取 Tiling 函数指针OpType 与原型定义时保持一致 context_ascendc::TilingFunc tilingFunc tmpIns.GetTilingFunc(AddCustom); if (tilingFunc ! nullptr) { // 构造 TilingContext 并调用 tilingFunc验证 Tiling 数据 ... } else { std::cout get tiling func failed. std::endl; return -1; }其中TilingFunc的函数指针类型定义为using TilingFunc uint32_t(*)(gert::TilingContext*);即 Tiling 函数接收gert::TilingContext*作为输入返回uint32_t状态码。结合ContextBuilder的BuildTilingContext()可以构造出携带 shape、attr、平台信息等内容的 Tiling 上下文从而独立于框架执行 Tiling 函数具体流程可参考 Tiling 调测指南 与 ContextBuilder 文档。六、失败场景与排查思路依据源码中的错误分支与 tests/api/utils/tiling/test_tiling.cpp 的测试覆盖LoadTilingLibrary返回false的典型场景如下失败场景源码中的判定排查方向传入空指针tilingSoPath nullptr检查路径字符串是否初始化路径过长strlen(tilingSoPath) PATH_MAX检查路径是否超出系统PATH_MAX通常为 4096路径不存在realpath()返回空核对动态库实际路径与文件名liboptiling.so或libcust_opapi.sodlopen失败handle nullptr确认动态库架构与运行环境匹配、依赖库可解析可先用ldd/file检查缺少导出符号dlsym(..., TbeLoadSoAndSaveToRegistry)返回空确认 Tiling 库确实由工程化算子开发流程产出内含TbeLoadSoAndSaveToRegistry注册入口测试用例TestOpTilingRegistryLoadTilingLibrary通过 mockrealpath/dlopen/dlsym分别覆盖了上述失败分支与成功路径可以作为理解接口行为的参考。所有失败路径都会通过CXT_ASCENDC_LOGE输出错误日志因此结合日志定位具体失败环节是最直接的排查手段。七、小结OpTilingRegistry::LoadTilingLibrary是 asc-devkit 中面向 Tiling 独立调测场景的关键入口它以动态库路径为输入内部完成路径校验、dlopen加载、TbeLoadSoAndSaveToRegistry符号查找与调用、句柄释放最终将编译产出的 Tiling 实现注册到全局算子实现注册表供GetTilingFunc按算子类型查询。理解其参数语义、导出符号约定与各失败分支能帮助开发者在算子 Tiling 调测中快速定位加载问题高效完成 Tiling 逻辑的独立验证。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐Slang 运算符表达式Operator Expressions完全指南内建运算符语义、求值顺序与重载机制Slang 运算符表达式Operator Expressions完全指南内建运算符语义、求值顺序与重载机制 Slang 的表达式Expression是人工智能深度学习算子库CANNAscendasc-devkit 算子 Tiling 独立调测OpTilingRegistry 加载 Tiling 动态库与获取 Tiling 函数指针详解asc devkit 算子 Tiling 独立调测OpTilingRegistry 加载 Tiling 动态库与获取 Tiling 函数指针详解 本文围绕 a人工智能深度学习算子库CANNAscendasc-devkit Tiling 调测指南基于 OpTilingRegistry 与 ContextBuilder 独立验证算子 Tiling 函数asc devkit Tiling 调测指南基于 OpTilingRegistry 与 ContextBuilder 独立验证算子 Tiling 函数 在 C人工智能深度学习算子库CANNAscend上一篇抖音批量下载终极指南3分钟搞定无水印视频小白也能轻松上手下一篇DashPlayer 完整安装教程3 步装好你的英语学习视频播放器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考