前言:CANN 训练营的Ascend C算子课程,以在线课程的方式提供了一个沙箱实验环境。这将有助于帮助开发者了解Ascend C算子开发的软、硬件环境;熟悉自定义Ascend C算子的开发流程和关键代码;同时也可以了解到自定义算子包的部署路径及部署后的各类文件。
在线试验地址:在线实验>基于昇腾CANN的Ascend C算子开发
https://www.hiascend.com/zh/edu/experiment/operation/Tik_xl
配套课程地址:CANN训练营2023年第一季_TIK C++算子开发入门
https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682
一、系统环境
1、硬件芯片:昇腾910A
2、CANN版本
3、算子开发包
二、算子实现分析
沙箱实验,实现的是动态shape的add的Ascend C算子。
一)配置环境
二)下载代码包
样例工程关键目录和文件的用途如下所示:
三)代码分析及补全
1、kernel侧代码
实现代码在算子工程的/ai_core/op_kernel/add_tik2.cpp中。
1)算子类——init()
2)算子类——process()及3个基本任务CopyIn,Compute,CopyOut
基于矢量编程范式,将核函数的实现分为3个基本任务:CopyIn,Compute,CopyOut。Process函数中通过如下方式调用这三个函数。
CopyIn:使用DataCopy接口将GlobalTensor数据拷贝到LocalTensor;使用EnQue将LocalTensor放入VecIn的Queue中。
Compute:使用DeQue从VecIn中取出LocalTensor;使用Ascend C算子接口Add(2级接口)完成矢量计算;使用EnQue将计算结果LocalTensor放入到VecOut的Queue中。
CopyOut:使用DeQue接口从VecOut的Queue中取出LocalTensor;使用DataCopy接口将LocalTensor拷贝到GlobalTensor上。
2、host侧代码
host侧算子实现开发,包括算子原型注册、Shape推导等函数实现与注册、Tiling实现与注册和信息库配置。实现代码在算子工程的/ai_core/op_host/add_tik2.cpp中。
1)算子原型注册:
2)Shape推导等函数实现与注册:
3)Tiling实现与注册:
4)信息库配置及算子注册:
四)UT测试
UT的本质是使用内核调用符测试CPU模式下的Ascend C算子的用例,在算子工程UT测试目录下的add_tik2_ut.cc文件,增加CPU侧算子调用代码如下:
运行指令:
cd $HOME/cann_op_contrib/ ./build.sh -u tikcpp
运行结果:
五)编译部署
1、算子包打包
进入cann_op_contrib算子工程目录,执行算子包打包脚本,命令如下:
cd $HOME/cann_op_contrib/
./pack.sh
打包成功后,会在当前目录下创建output目录,并在output目录下生成自定义算子安装包CANN_OP_CONTRIB_linux-aarch64.run。
2. 自定义算子安装包部署
以运行用户执行如下命令,安装自定义算子包。
cd $HOME/cann_op_contrib/output
./CANN_OP_CONTRIB_linux-aarch64.run --install
命令执行成功后,自定义算子包中的相关文件会部署当前环境中。默认安装路径是tool-kit的“opp/vendors/”目录下,沙箱中的路径为:
/usr/local/Ascend/ascend-toolkit/latest/opp/vendors
目录结构与自定义TBE算子基本一致,在算子实现代码部分,多了cpp格式的实现代码。
六)ST测试
ST的本质是创建ACL应用程序测试NPU模式下的Ascend C算子用例,将开发好的算子,编译好后,打包成自定义算子包,部署到系统中。
通过msopst工具,将用户定义的ST测试配置的*.json生成单算子的om文件,使用AscendCL接口加载单算子模型文件并执行单算子om文件,验证算子执行结果的正确性。
1、在算子工程ST测试目录下的add_tik2.json增加测试用例
2、配置ST测试用例编译所需环境变量
ST测试的实质是,使用AscendCL接口加载单算子模型文件并执行,所以生成并编译ST测试用例前需要配置AscendCL应用编译所需的环境变量,如下所示:
export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub
3、使用msopst工具,生成并执行ST测试用例
cd /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/bin/
./msopst run -i $HOME/cann_op_contrib/community/tests/add_tik2/st/add_tik2.json -soc Ascend910A -out $HOME/out
执行结果: