调用Ascend CL单算子
完成自定义算子的开发部署后,通过单算子API执行的方式调用,添加使用-O0 -g编译选项重新编译算子并部署,并导入算子动态加载路径,最后用msdebug工具加载算子可执行文件进行上板调试。
- 参考算子工程创建完成算子工程的创建,并完成kernel侧实现及host侧实现的相关准备。
- 参考算子编译部署,完成算子的编译部署。自定义算子编译部署后,会自动生成单算子API,可直接在应用程序中调用。算子工程build_out/auto_gen目录下会自动生成单算子API执行所需文件,如下所示:
├── aclnn_Xxx.cpp // 自动生成的单算子API执行接口实现文件 ├── aclnn_Xxx.h // 自动生成的单算子API执行接口头文件
- 在kernel侧和host侧实现中增加编译选项-g -O0。在kernel侧增加编译选项,可在op_kernel/CMakeLists.txt中进行编辑。
add_ops_compile_options(ALL OPTIONS -g -O0)
- 进入自定义算子工程目录下重新编译部署算子。
- 单击LINK,获取验证代码的样例工程。
├──input // 存放脚本生成的输入数据目录 ├──output // 存放算子运行输出数据和真值数据的目录 ├── inc // 头文件目录 │ ├── common.h // 声明公共方法类,用于读取二进制文件 │ ├── operator_desc.h // 算子描述声明文件,包含算子输入/输出,算子类型以及输入描述与输出描述 │ ├── op_runner.h // 算子运行相关信息声明文件,包含算子输入/输出个数,输入/输出大小等 ├── src │ ├── CMakeLists.txt // 编译规则文件 │ ├── common.cpp // 公共函数,读取二进制文件函数的实现文件 │ ├── main.cpp // 单算子调用应用的入口 │ ├── operator_desc.cpp // 构造算子的输入与输出描述 │ ├── op_runner.cpp // 单算子调用主体流程实现文件 ├── scripts │ ├── verify_result.py // 真值对比文件 │ ├── gen_data.py // 输入数据和真值数据生成脚本文件 │ ├── acl.json // acl配置文件
- 检查单算子调用主体流程实现文件中同步等待接口的超时参数。
如在AclNNInvocation/src/op_runner.cpp文件中使用了具有超时参数的同步接口aclrtSynchronizeStreamWithTimeout,则需要适当调整或取消超时参数,否则在调试过程中,程序在断点停止时间过长,调用程序会认为执行失败并中断执行。
# 在op_runner.cpp中进行接口同步时,假如原定的超时时间为5000毫秒 aclrtSynchronizeStreamWithTimeout(stream, 5000)
可参考以下方式进行修改:- 手动增大超时时间。
aclrtSynchronizeStreamWithTimeout(stream, 5000000)
- 使用不带超时参数的同步接口。
aclrtSynchronizeStream(stream)
- 手动增大超时时间。
- 编译单算子调用应用并得到可执行文件execute_add_op。
- 导入算子动态加载路径。
将自定义算子工程编译后输出在build_out目录下kernel侧的.o文件路径导入环境变量。
export LAUNCH_KERNEL_PATH=/{path_to_kernel}/kernel_name.o
{path_to_kernel}表示对算子kernel侧实现编译后生成的算子二进制文件*.o所在路径,请根据实际情况进行替换。
kernel侧对算子的多个dtype可能会编译出多个.o文件,任选一个文件导入即可,原则上都会包含源码路径信息。
- 使用msdebug工具加载步骤8中得到的单算子可执行文件execute_add_op。
cd AclNNInvocation/output msdebug execute_add_op (msdebug) target create "execute_add_op" Current executable set to '/home/AclNNInvocation/output/execute_add_op' (aarch64). (msdebug)
- 断点设置。
b add_custom.cpp:55
如果host侧和kernel侧存在同名的算子实现文件,在设置断点时,推荐采用绝对路径进行设置,确保断点打在预期的文件上。
- 运行算子程序,等待直到命中断点。
(msdebug) r Process 1385976 launched: '$home/shelltest/test/samples/operator/AddCustomSample/FrameworkLaunch/AclNNInvocatioNaive/build/execute_add_op' (aarch64) [Launch of Kernel anonymous on Device 0] Process 1385976 stopped [Switching to focus on Kernel anonymous, CoreId 24, Type aiv] * thread #1, name = 'execute_add_op', stop reason = breakpoint 1.1 frame #0: 0x0000000000001564 AddCustom_1e04ee05ab491cc5ae9c3d5c9ee8950b.o`KernelAdd::Compute(this=0x000000000028f8a8, progress=0) (.vector) at add_custom.cpp:55:19 52 LocalTensor<DTYPE_Y> yLocal = inQueueY.DeQue<DTYPE_Y>(); 53 LocalTensor<DTYPE_Z> zLocal = outQueueZ.AllocTensor<DTYPE_Z>(); 54 Add(zLocal, xLocal, yLocal, this->tileLength); -> 55 outQueueZ.EnQue<DTYPE_Z>(zLocal); 56 inQueueX.FreeTensor(xLocal); 57 inQueueY.FreeTensor(yLocal); 58 } (msdebug)
父主题: 使用示例