TIK C++算子开发
本文旨在浅析在TIK C++算子开发过程中的一些步骤
TIK C++
矢量算子动态shape
输入的实现
回顾固定shape
算子
固定shape的输入
当算子shape
固定时,开发者使用不同shape
时需要重新对算子进行编译,带来大量的算子二进制文件。 动态shape
的算子可以将形状通过核函数的入参传入核函数内,参与内部逻辑计算,从而符合不同shape
下的使用场景。
区分 | 固定shape | 动态shape |
---|---|---|
使用场景 | 输入shape固定不变的场景 | 输入shape频繁变动的场景 |
实现难度 | 低,只需要考虑该shape的逻辑处理 | 高,需考虑shape带来的不同逻辑分支处理 |
优化难度 | 低,AI编译器可以进行更多优化 | 高,AI编译器对于未知数据采取保守策略 |
固定shape和动态shape对比
CPU模式下的算子功能调试
TIK C++
提供孪生调试技术,即在CPU模式下进行运算实际上会创建一个NPU的模型并模拟它的计算行为,以此进行业务功能的调试。相同的算子代码可以在CPU模式下进行精度调试,并无缝切换到NPU模式下运行。
1. 使用GDB进行调试
source /usr/local/Ascend/ascend-toolkit/setenv.sh
gdb --args add_tik2_cpu
set follow-fork-rode child
break add_tik2.cpp:45
run
list
backtrace
print i
break add_tik2.cpp:56
continue
display xLocal
quit
GBD调试
命令 | 功能 |
---|---|
step | 执行下一行语句,如语句为函数调用,进入函数中 |
next | 执行下一行语句,如语句为函数调用,不进入函数中 |
continue | 从当前位置继续运行程序 |
run | 从头开始运行程序 |
quit | 退出程序 |
输出变量值、调用函数、通过表达式改变变量值 | |
list | 查看当前位置代码 |
backtrace | 查看各级堆栈的函数调用及参数 |
break N | 在第N行上设置断点 |
display | 每次停下来时,显示设置的变量var的值 |
GDB常用api
2. 使用printf
或者std::cout
在CPU代码侧直接插入C/C++的打印命令,如printf
、std::cout
,但注意NPU模式下不支持打印语句,所以需要添加內置宏 __CCE_KT_TEST__
予以区分