一、端到端的TIK C++算子开发流程
固定shape算子:
当算子shape固定时,开发者使用不同shape时需要重新对算子进行编译,带来大量的算子二进制文件。
动态shape的算子可以将形状通过核函数的入参传入核函数内,参与内部逻辑计算,从而符合不同shape下的使用场景。
动态shape算子:
基于现有的固定shape算子,将其改装为动态shape的算子。将控制形状的BLOCK_DIN,TOTAL_LENGTH,TILE_NUN这些变量依靠外界输入得到,在核函数中额外传入一个tiling,它将指向控制核函数逻辑处理的至关重要的这几个变量。
动态shape算子的tiling结构体
tiling结构体中的信息:
. BLOCK_DIM:并行计算使用的核数
. TOTAL_LENGTH:总共需要计算的数据个数. TILE_NUM:每个核上计算数据分块的个数
struct AddTik2TilingData {
uint32_t blockDim;
uint32_t totalLength;uint32_t tileNum;
};
动态shpe算子的tiling解析函数:
核函数传入tiLing指针,与x,y,z的角色相同,添加获得tiLing结构体的宏函数调用GET_TILING_DA
/ implementation of kernel function
extern "C”_global_aicore_ void add_tik2(_gm_ uint8 t*x,_gm_uint8_t*y,__uint8 t* z,_l_uint8 [* tiling)i
//解析tiling的逻辑
GET_TILING_DATA(tilingData,tiling);
固定与动态shape之间存在很多不同点:
主要是核函数、KernelAdd类、Init()函数、add_tik2.py和main.cpp由明显的区别,主要区别代码参考相关文件。
代码文件区别:
固定shape与动态shape代码文件的区别:
二、CPU模式下的算子调试技术
2.1、GPU模式下的算子功能调试
TIK C++提供孪生调试技术,即在CPU模式下进行运算实际上会创建一个NPU的模型并模拟它的计算行为,以此进行业务功能的调试。相同的算子代码可以在CPU模式下进行精度调试,并无缝切换到NPU模式下运行。
使用GDB调试
使用printf或者std::cout
在CPU代码侧直接插入CIC++的打印命令,如printf、std:cout,但注意NPU模式下不支持打印语句,所以需要添加内置宏_CCE_KT_TEST__予以区分。
三、UT和ST的测试编码方法
3.1、环境安装
依赖条件:
最新版本的昇腾社区toolKit安装包环境,使用root用户默认会安装到/usr/localAscendlascend-toolkit/latest
最新版本的昇腾社区Community SDK软件包,解压到Ascend安装目录下/usrlocal/Ascend/ascend-toolkitlatestlopens
参考昇腾社区: https : / /www.hiascend.com/software/cann/community
3.2、测试验证UT
UT测试步骤:
1.下载gitee生态仓: git clone https:/ /gitee.com/ascend/cann_op_contrib.git
2.设置安装路径: export ASCEND_CUSTOM_PATH=/usr/local/Ascend/ascend-toolkit/latest3.设置环境变量(昇腾实际安装的位置): source $ASCEND_CUSTOM_PATH/ ../set_env.sh
4.在cann_op_contrib仓中执行: ./build.sh -u tik2,运行uT测试用例
UT的本质是使用内核调用符测试CPU模式下的TIK C++算子用例
为TIK C++自定义算子添加UT的测试步骤:
- cann_op_contrib/community/ops中新建用例目录并添加代码实现文件
- cann_op_contrib/community/tests中新建用例目录并添加代码测试文件
- 在cann_op_contrib目录下执行./build.sh -u tik2
3.3、测试验证- ST
ST测试步骤:
1.下载gitee生态仓: git clone https: //gitee.com/ascend/cann_op_contrib.git
2.设置安装路径: export ASCEND_CUSTOM_PATH=/usr/local/Ascend/ascend-toolkit/latest3.设置环境变量(昇腾实际安装的位置): source $ASCEND_CUSTOM_PATH/../set_env.sh
4.在cann_op_contrib目录下执行: ./pack.sh,将TIK C++算子打包成自定义算子包
5.在camn_op_contrib目录下执行:(cd output;./CANN_OP_CONTRIB_linux-x86_64.run --install),安装部署自定义算子包6.在cann_op_contrib目录下执行: (cd community/tests/add_tik2/st;./run_case.sh),运行ST测试用例
注:如果之前安装过算子包,第二步应该先卸载,执行(cd output; /CAM_OP_CONTRI8_]inux-x86_64.run --uninstall),另外wumPy版本不高于1.24
为TIK C++自定义算子添加ST测试步骤:
1. cann_op_contrib/community/ops中新建用例目录并添加代码实现文件
实现文件包含: host(op_host) tiling源文件、主机侧算子源文件和kernel侧(op_kermel)算子核函数实现源文件,分别对应op_host目录下的add_tik2_tiling.h、add_tik2.cpp,和op_kernel下的add_tik2.cpp
注:目录名为{KERNEL_NAME},命名满足{KERNEL_NANE]_tiling. h和{KERNEL_NAME}.cpp
2. cann_op_contrib/community/tests中新建用例目录并添加代码测试文件测试文件包含算子测试用例定义文件、真值脚本生成文件和测试用例调用脚本,分别对应add_tik2.json, test_add_tik2_data.py和run_case.sh
注:目录名为{KERNEL_NAME},命名满足{KERNEL_NAME}.json和test_{KERNEL_NANE}_data.
3.在cann_op_contrib目录下执行后续打包算子,安装部署算子包和编译并执行测试用例的操作.
四、NPU模式下的性能采集与分析
4.1、性能采集工具——msprof
当使用内核调用符时,会生成相应的二进制可执行文件,可以使用性能采集工具运行NPU模式下生成的可执行文件从而采集TIKC++算子在昇腾平台上执行的性能数据
性能采集步骤:
1.设置环境变量(昇腾实际安装的位置): source /usr/local/Ascend/ascend-toolkit/ ../set_env.sh
2.测动NPU模式下的TIKC++算子,保证其精度正确,生成对应的二进制可执行文件: bash run.sh add_tik2 ascend910 AiCore npu
3.使用msprof工具采集性能,详细的介绍请参考社区文档——性能分析工具
kemel_add sample
4.使用命令(用户可以根据自身的需要灵活组合性能分析指令)∶
msprof --application="./add_tik2_npu"--output=". /out" --ai-core=on --aic-metrics="PipeUtilization"
5.在当前目录会生成out文件夹,在device_0/summary/op_summary_0_1.csv能够看到一些具体的数据
.mte2类型指令(DDR->AICORE搬运类指令)的cycle数在所有指令的cycle数中的占用比
inputout
mte3类型指令(AICORE->DDR概运类指令)的cvcle数在所右指今的cvcle数中的占用比. vector类型指令(向量类运算指令)的cycle数在所有指令的cycle数中的占用比