如何进行Tiling调测
在工程化算子开发过程中,开发者需实现Tiling函数,该函数原型是固定的,接受TilingContext作为输入。框架负责构造TilingContext并调用Tiling函数。若需单独进行Tiling调测,开发者可通过OpTilingRegistry加载编译后的Tiling动态库,获取Tiling函数的指针并进行调用,调用时Tiling函数的TilingContext入参使用ContextBuilder构建。
以下是具体步骤:
- 参考工程化算子开发的开发步骤,完成算子实现,并通过算子包编译或算子动态库编译获取对应的Tiling动态库文件。
- 算子包编译:Tiling实现对应的动态库为算子包部署目录下的liboptiling.so。具体路径可参考算子包部署。
- 动态库编译:Tiling实现集成在算子动态库libcust_opapi.so中。具体路径可参考算子动态库和静态库编译。
- 编写测试代码。
- 使用ContextBuilder配置输入输出Tensor的形状、数据类型、格式及平台信息等,构建TilingContext。
- 通过OpTilingRegistry的LoadTilingLibrary接口加载Tiling动态库;使用GetTilingFunc接口获取Tiling函数指针。
- 执行Tiling函数,验证其正确性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
// 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_holer = gert::ContinuousVector::Create<size_t>(4096); auto ws_size = reinterpret_cast<gert::ContinuousVector *>(workspace_size_holer.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->GetContext<gert::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; }
- 编译测试代码。
1
g++ test.cpp -I${INSTALL_DIR}/include -L${INSTALL_DIR}/lib64 -Wl,-rpath,${INSTALL_DIR}/lib64 -ltiling_api -lc_sec -lgraph_base -lregister -lascendalog -lplatform -o test
- ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。若安装的Ascend-cann-toolkit软件包,以root安装举例,则安装后文件存储路径为:/usr/local/Ascend/ascend-toolkit/latest。
- 开发者根据需要链接依赖的动态库,必需链接的动态库有:
- libtiling_api.so:Tiling功能相关的动态库,包含ContextBuilder类、OpTilingRegistry类等。
- libc_sec.so:安全函数库,libtiling_api.so依赖该库。
- libgraph_base.so:基础数据结构与接口库,libtiling_api.so依赖该库。
- libregister.so:业务函数注册相关库(例如Tiling函数注册,算子原型注册等)。
- libascendalog.so:log库,libtiling_api.so依赖该库。
- libplatform.so:平台信息库,libtiling_api.so依赖该库;Tiling函数中使用硬件平台信息时,需要依赖该库。
- 执行可执行文件。
1
./test
父主题: 常用操作