人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载本文围绕 asc-devkit 提供的OpTilingRegistry类展开讲解其在工程化算子开发中独立进行 Tiling 调测场景下的完整用法如何加载编译产物中的 Tiling 动态库、如何按算子类型获取 Tiling 函数指针以及该函数指针如何与ContextBuilder构建的TilingContext配合执行。读完本文你可以独立编写一套脱离图引擎的 Tiling 单元测试程序并结合仓库源码理解其底层dlopen加载与注册表查询机制。一、OpTilingRegistry 是什么在工程化算子开发流程中开发者需要实现一个固定原型的 Tiling 函数它接受TilingContext作为输入负责完成数据分片、平台信息填充等工作正常在线运行时由框架负责构造TilingContext并调用 Tiling 函数。但为了单独调试 Tiling 逻辑例如在算子未入图、或未部署到目标机器时验证 Tiling 代码正确性asc-devkit 提供了OpTilingRegistry类。OpTilingRegistry类属于context_ascendc命名空间主要用于加载 Tiling 实现的动态库并获取算子的 Tiling 函数指针以进行调试和验证该类通常与ContextBuilder类配合使用后者用于构造 Tiling 函数所需的输入参数TilingContext。所需的头文件和库文件类型内容需要包含的头文件#include tiling/context/context_builder.h需要链接的库文件libtiling_api.a动态链接场景对应libtiling_api.soPublic 成员函数OpTilingRegistry() ~OpTilingRegistry() TilingFunc GetTilingFunc(const char *opType) const bool LoadTilingLibrary(const char *tilingSoPath) const四类接口职责清晰构造/析构负责对象生命周期管理LoadTilingLibrary负责把 Tiling 动态库加载进进程并注册到全局实现注册表GetTilingFunc负责按算子类型OpType查表返回 Tiling 函数指针。二、类声明与源码结构OpTilingRegistry的对外声明位于 include/utils/context/context_builder.husing TilingFunc uint32_t (*)(gert::TilingContext *); class OpTilingRegistryImpl; class OpTilingRegistry { public: OpTilingRegistry() default; ~OpTilingRegistry() default; TilingFunc GetTilingFunc(const char *opType) const; bool LoadTilingLibrary(const char *tilingSoPath) const; private: std::shared_ptrOpTilingRegistryImpl impl_; };从源码结构看有三点值得注意TilingFunc类型别名Tiling 函数指针的返回类型为uint32_t入参为gert::TilingContext*返回值即 Tiling 执行状态码如ge::GRAPH_SUCCESS与 Tiling 函数固定原型保持一致Pimpl 设计类内部仅持有一个std::shared_ptrOpTilingRegistryImpl私有实现指针对外头文件不暴露任何内部数据结构与 ContextBuilder 同头文件ContextBuilder、KernelRunContextHolder与OpTilingRegistry共同定义在该头文件中印证了官方文档两者配合使用的设计意图——ContextBuilder负责构建上下文OpTilingRegistry负责提供被调用的 Tiling 函数。说明官方 API 文档中给出的 include 路径为tiling/context/context_builder.hCANN 安装目录下的头文件布局而在本仓库源码中该头文件位于 include/utils/context/context_builder.h。两者对应同一 API编译时以实际安装环境的 include 目录为准。三、构造和析构函数功能说明创建与释放OpTilingRegistry对象。函数原型OpTilingRegistry() ~OpTilingRegistry()参数说明无。返回值说明无。约束说明无。调用示例context_ascendc::OpTilingRegistry tmpIns; // ... ...从源码看构造函数与析构函数均为 default见 include/utils/context/context_builder.h即对象本身不持有任何需要显式初始化的状态真正的加载动作发生在LoadTilingLibrary调用时注册结果保存在进程级的全局注册表中而非对象内部。因此同一个进程内一次加载即可服务多次GetTilingFunc查询对象本身可以随用随建。四、LoadTilingLibrary加载 Tiling 动态库功能说明根据输入的路径加载对应的 Tiling 动态库。开发者基于工程化算子开发方式完成算子实现后可通过算子包编译或算子动态库编译获取对应的 Tiling 动态库文件算子包编译Tiling 实现对应的动态库为算子包部署目录下的liboptiling.so。具体路径可参考算子包部署动态库编译Tiling 实现集成在算子动态库libcust_opapi.so中。具体路径可参考算子动态库和静态库编译。在算子包目录结构中liboptiling.so位于算子包部署目录的op_api库路径下见 basic_process.md 中给出的部署目录树。函数原型bool LoadTilingLibrary(const char *tilingSoPath) const参数说明参数名输入/输出描述tilingSoPath输入Tiling 动态库的路径支持相对路径与绝对路径。返回值说明trueTiling 动态库加载成功falseTiling 动态库加载失败。具体错误可参考 Log 信息关于日志配置和查看可参考 CANN 环境变量参考文档中日志相关环境变量。约束说明无。调用示例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; ... } // ...源码级实现剖析LoadTilingLibrary的完整实现位于 impl/utils/context/context_builder.cpp内部流程可拆解为 5 步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 dlopen(absFilePath.c_str(), RTLD_LAZY); if (handle nullptr) { CXT_ASCENDC_LOGE(OpTilingRegistry dlopen so path [%s] failed., absFilePath.c_str()); return false; } void (*registryFunc)(const char*); 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; }各步骤含义空指针与长度校验入参为nullptr或长度达到PATH_MAX时直接返回falserealpath解析绝对路径这也解释了文档中支持相对路径的原因——相对路径会在函数内部被解析为绝对路径文件不存在时同样返回falsedlopen(absFilePath, RTLD_LAZY)以延迟绑定方式加载动态库加载失败如架构不匹配、依赖库缺失时返回false查找注册符号通过dlsym查找导出符号TbeLoadSoAndSaveToRegistry。该符号由算子包编译产物提供是 Tiling 库与宿主程序之间的约定接口调用注册函数后dlcloseregistryFunc(absFilePath)会被调用把该库中的 Tiling 实现注册到进程级注册表注册完成后句柄随即释放。从源码结构看注册表本身持有实现所需的状态因此dlclose并不影响后续GetTilingFunc的使用。由此可以推断出加载失败的完整边界条件与源码日志一一对应入参为空、路径超长、文件不存在、dlopen失败、找不到TbeLoadSoAndSaveToRegistry符号任一环节失败均返回false需结合 Log 信息定位。仓库中的测试用例 tests/api/utils/tiling/test_tiling.cppTestOpTilingRegistryLoadTilingLibrary正是通过 mockrealpath、dlopen、dlsym分别覆盖了上述空路径、超长路径、dlopen失败、符号查找失败与成功注册这五类分支。五、GetTilingFunc按算子类型获取 Tiling 函数功能说明根据算子类型 OpType 获取对应的 Tiling 函数。函数原型TilingFunc GetTilingFunc(const char *opType) const参数说明参数名输入/输出描述opType输入算子类型与原型定义时的算子类型保持一致。注意此处传入的是算子类型OpType如AddCustom而不是算子名OpName。若与自定义算子原型声明中的类型名不一致查询将返回空指针。返回值说明获取成功则返回对应的 Tiling 函数指针失败则返回空指针。Tiling 函数指针定义如下using TilingFunc uint32_t(*)(gert::TilingContext*);约束说明无。调用示例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; return -1; } context_ascendc::TilingFunc tilingFunc tmpIns.GetTilingFunc(AddCustom); if (tilingFunc ! nullptr) { // use tiling func ... } else { std::cout get tiling func failed. std::endl; return -1; } // ...源码级实现剖析GetTilingFunc的实现位于 impl/utils/context/context_builder.cppTilingFunc OpTilingRegistry::GetTilingFunc(const char* opType) const { auto registry gert::DefaultOpImplSpaceRegistryV2::GetInstance().GetSpaceRegistry(); const gert::OpImplKernelRegistry::OpImplFunctionsV2* funcs; if (registry nullptr) { CXT_ASCENDC_LOGD(failed to find implfuncs in 2.0 way, registery is null. op type is %s., opType); return nullptr; } funcs registry-GetOpImpl(opType); if (funcs nullptr || funcs-tiling nullptr || funcs-tiling_parse nullptr) { return nullptr; } CXT_ASCENDC_LOGD(find implfuncs in 2.0 way, op type is %s., opType); return funcs-tiling; }从源码看其查询链路为通过单例gert::DefaultOpImplSpaceRegistryV2::GetInstance()获取默认实现空间注册表GetSpaceRegistry()——这正是LoadTilingLibrary中TbeLoadSoAndSaveToRegistry写入数据的目标容器二者构成写注册表 / 读注册表的对应关系调用registry-GetOpImpl(opType)按算子类型查表取出OpImplFunctionsV2结构只有当查到的实现中tiling与tiling_parse两个函数指针均非空时才返回funcs-tiling否则返回nullptr。由此可以推断出返回空指针的几种情形尚未调用LoadTilingLibrary注册表为空、opType 与原型声明不一致、或该库中不存在对应类型的 Tiling 实现。对应的测试用例 tests/api/utils/tiling/test_tiling.cppTestOpTilingRegistryGetTilingFunc通过 mock 注册表分别验证了注册表为 null算子未注册返回空指针以及注册成功返回非空指针三条路径。六、完整调测流程构建 TilingContext 并执行 Tiling 函数OpTilingRegistry解决的是拿到 Tiling 函数的问题而要真正执行它还需要一个构造好的TilingContext。官方指南如何进行 Tiling 调测给出了端到端流程这里完整继承并串讲。步骤 1完成算子实现并获取 Tiling 动态库算子包编译得到liboptiling.so或动态库编译得到libcust_opapi.so。步骤 2编写测试代码——使用ContextBuilder配置输入输出 Tensor 的形状、数据类型、格式及平台信息等构建TilingContext通过LoadTilingLibrary加载 Tiling 动态库GetTilingFunc获取函数指针最后执行 Tiling 函数验证正确性// test.cpp #include iostream #include exe_graph/runtime/storage_shape.h #include tiling/context/context_builder.h int main() { gert::StorageShape x_shape {{2, 32}, {2, 32}}; gert::StorageShape y_shape {{2, 32}, {2, 32}}; gert::StorageShape z_shape {{2, 32}, {2, 32}}; auto param gert::TilingData::CreateCap(4096); auto workspace_size_holder gert::ContinuousVector::Createsize_t(4096); auto ws_size reinterpret_castgert::ContinuousVector *(workspace_size_holder.get()); auto holder context_ascendc::ContextBuilder() .NodeIoNum(2, 1) .IrInstanceNum({1, 1}) .AddInputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, x_shape) .AddInputTd(1, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, y_shape) .AddOutputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND, z_shape) .TilingData(param.get()) .Workspace(ws_size) .AddPlatformInfo(Ascendxxxyy) .BuildTilingContext(); auto tilingContext holder-GetContextgert::TilingContext(); context_ascendc::OpTilingRegistry tmpIns; bool flag tmpIns.LoadTilingLibrary(/your/path/to/so_path/liboptiling.so); // 加载对应的Tiling动态库文件 if (flag false) { std::cout Failed to load tiling so std::endl; return -1; } context_ascendc::TilingFunc tilingFunc tmpIns.GetTilingFunc(AddCustom); // 获取AddCustom算子对应的Tiling函数,此处入参为OpType if (tilingFunc ! nullptr) { ge::graphStatus ret tilingFunc(tilingContext); // 执行Tiling函数 if (ret ! ge::GRAPH_SUCCESS) { std::cout Exec tiling func failed. std::endl; return -1; } } else { std::cout Get tiling func failed. std::endl; return -1; } return 0; }示例中各ContextBuilder链式调用的作用NodeIoNum(2, 1)声明算子 2 输入 1 输出IrInstanceNum({1, 1})声明各 IR 实例数量AddInputTd/AddOutputTd按索引填充每个 Tensor 的数据类型ge::DataType、原始格式与存储格式ge::Format、存储形状gert::StorageShapeTilingData(param.get())提供 Tiling 数据输出缓冲gert::TilingData::CreateCap申请容量 4096 字节Workspace(ws_size)提供 workspace 大小输出指针gert::ContinuousVector承载AddPlatformInfo(Ascendxxxyy)指定模拟的平台版本请替换为实际 SoC 版本如Ascend910B用于填充 Tiling 函数中用到的硬件信息。步骤 3编译测试代码g test.cpp -I${INSTALL_DIR}/include -L${INSTALL_DIR}/lib64 -Wl,-rpath,${INSTALL_DIR}/lib64 -ltiling_api -lc_sec -lgraph_base -lregister -lunified_dlog -lplatform -o test${INSTALL_DIR}请替换为 CANN 软件安装后文件存储路径。以 root 用户安装为例安装后文件默认存储路径为/usr/local/Ascend/cann开发者根据需要链接依赖的动态库必需链接的动态库有libtiling_api.soTiling 功能相关的动态库包含ContextBuilder类、OpTilingRegistry类等libc_sec.so安全函数库libtiling_api.so依赖该库libgraph_base.so基础数据结构与接口库libtiling_api.so依赖该库libregister.so业务函数注册相关库例如 Tiling 函数注册、算子原型注册等——这正是承载TbeLoadSoAndSaveToRegistry注册机制的库libunified_dlog.solog 库libtiling_api.so依赖该库libplatform.so平台信息库libtiling_api.so依赖该库Tiling 函数中使用硬件平台信息时需要依赖该库。步骤 4执行可执行文件./test七、使用要点小结要点说明调用顺序必须先LoadTilingLibrary成功再调用GetTilingFunc未加载时注册表为空查不到实现opType 取值必须与算子原型声明中的算子类型完全一致而不是算子名路径要求tilingSoPath支持相对/绝对路径内部经realpath解析文件不存在、长度 ≥PATH_MAX均会失败库来源算子包编译 →liboptiling.so算子动态库编译 →libcust_opapi.soTiling 实现集成其中失败排查任一环节失败均返回false/ 空指针需结合 Log 信息判断是路径问题、dlopen问题还是符号缺失问题配套类ContextBuilder负责构建TilingContext接口详情可参考 ContextBuilder 文档更多 API 细节可继续查阅 OpTilingRegistry 简介、构造和析构函数、GetTilingFunc、LoadTilingLibrary实现代码见 include/utils/context/context_builder.h 与 impl/utils/context/context_builder.cpp行为验证用例见 tests/api/utils/tiling/test_tiling.cpp。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit 中 GetTilingFunc 接口详解按算子类型获取 Tiling 函数并独立调测asc devkit 中 GetTilingFunc 接口详解按算子类型获取 Tiling 函数并独立调测 本篇以 asc devkit 的 Tiling 调人工智能深度学习算子库CANNAscendasc-devkit ContextBuilder 详解手动构造 TilingContext 与 KernelContext独立验证 Tiling 函数与 TilingParseasc devkit ContextBuilder 详解手动构造 TilingContext 与 KernelContext独立验证 Tiling 函数与人工智能深度学习算子库CANNAscendasc-devkit Tiling 上下文构建指南用 ContextBuilder::BuildTilingContext 离线验证算子 Tiling 函数asc devkit Tiling 上下文构建指南用 ContextBuilder::BuildTilingContext 离线验证算子 Tiling 函数人工智能深度学习算子库CANNAscend上一篇网盘直链下载助手告别限速困扰的终极解决方案下一篇网盘直链下载助手九大网盘高速下载终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考