目录
- 基础Ascend C 算子开发
- 算子 Kernel直调实操
- 算子 AclNN调用
基础Ascend C 算子开发
硬件架构分为Host端(CPU)和Device端(NPU),基础加速算子的被调用流程为:数据搬入Device,切分,计算,数据聚合,数据搬出Device。 
在Kernel函数中,定义计算操作类op。类中定义参数列表,申请Local内存、注册输入输出队列。定义process函数,执行数据搬入、计算和数据搬出操作。
其中,计算函数能够通过基础API算子进行设计,详细算子可以参考Ascend C API文档。
而数据切分可以通过Host中的tiling实现,在Host中定义tiling fuction切分数据。之后Host函数推导数据shape、type,并将tiling参数传递到Kernel函数中,实现数据切分,从而尽量避免Device承担非矢量运算。
算子 Kernel直调实操
Ascend C算子的调用有多种,最简单的就是Kernel直调,即直接使用简单函数调用算子计算输入数据,得到的输出数据与python脚本计算的输出比对,验证其功能正确性。
本次实操要将加法算子Add改为双曲正弦算子Sinh,即
原有算子调用了基础API中的矢量计算Add函数. 要实现Sinh,则需要用到基础API中的矢量Exp函数、矢量标量乘法Muls,矢量减法Sub。 例如
改为
之后编译、构建工程,得到功能验证结果。
算子 AclNN调用
在Kernel直调中,输入数据的形状和类型是固定的。但是实际应用中,同一种算子可能会有多个实例,需要处理不同shape和type的计算。因此使用AclNN调用的模式,来验证算子动态计算的功能和精度。
在此例中,需要在Host端实现Tiling的定义和调用,用来切分数据。在Host函数中,通过输入数据推导出输出数据的shape和type,并将这些参数一并传入到Kernel函数中。
本次实操依然是实现Sinh,算子编写完成后,编译、构建工程,并安装生成的算子到库中。 在AclNNInvocation文件中调用算子计算,验证其功能和精度。
目录
基础Ascend C 算子开发
硬件架构分为Host端(CPU)和Device端(NPU),基础加速算子的被调用流程为:数据搬入Device,切分,计算,数据聚合,数据搬出Device。
在Kernel函数中,定义计算操作类
op。类中定义参数列表,申请Local内存、注册输入输出队列。定义process函数,执行数据搬入、计算和数据搬出操作。其中,计算函数能够通过基础API算子进行设计,详细算子可以参考Ascend C API文档。
而数据切分可以通过Host中的tiling实现,在Host中定义tiling fuction切分数据。之后Host函数推导数据shape、type,并将tiling参数传递到Kernel函数中,实现数据切分,从而尽量避免Device承担非矢量运算。
算子 Kernel直调实操
Ascend C算子的调用有多种,最简单的就是Kernel直调,即直接使用简单函数调用算子计算输入数据,得到的输出数据与python脚本计算的输出比对,验证其功能正确性。
本次实操要将加法算子Add改为双曲正弦算子Sinh,即
原有算子调用了基础API中的矢量计算Add函数. 要实现Sinh,则需要用到基础API中的矢量Exp函数、矢量标量乘法Muls,矢量减法Sub。 例如
改为
Exp(z, x); Muls(x, x, -1) Exp(x, x); Sub(z, z, x); Muls(z, z, 0.5);之后编译、构建工程,得到功能验证结果。
算子 AclNN调用
在Kernel直调中,输入数据的形状和类型是固定的。但是实际应用中,同一种算子可能会有多个实例,需要处理不同shape和type的计算。因此使用AclNN调用的模式,来验证算子动态计算的功能和精度。
在此例中,需要在Host端实现Tiling的定义和调用,用来切分数据。在Host函数中,通过输入数据推导出输出数据的shape和type,并将这些参数一并传入到Kernel函数中。
本次实操依然是实现Sinh,算子编写完成后,编译、构建工程,并安装生成的算子到库中。 在AclNNInvocation文件中调用算子计算,验证其功能和精度。