开发工程对比

为了更好的匹配开发者的多种使用场景,Ascend C提供如下两种算子开发工程对上文中的算子核心实现进行组织:

基于Kernel直调工程的算子开发编程流程图如下:

基于自定义算子工程的算子开发流程图如下:

下面具体介绍两种开发工程的对比:主要的差异体现在算子的调用方式、开发过程和发布方式,其中自定义算子工程可以支持单算子API执行(aclnn接口调用)、图接口调用、ATC模型转换后离线推理等,而kernel直调工程只支持kernel直调接口调用。

差异点

自定义算子工程

Kernel直调工程

调用方式

单算子API(aclnn接口)调用

支持

不支持

图接口调用

支持

不支持

ATC模型转换后离线推理

支持

不支持

kernel直调接口调用

不支持

支持

开发过程

算子原型定义

需要

不需要

Tiling函数

需要

可选

Tiling开发不受CANN框架的限制。

Infershape、InferDataType函数

可选,入图需要

不需要

Kernel函数

需要

需要

发布形式

.run包

.a/.so/bin

调用方式对比

开发过程对比

自定义算子工程含分离的host/kernel开发目录,以及整体编译入口脚本、代码生成、打包脚本等,Kernel直调工程只有一个CMakeListst入口和kernel源码、测试代码目录。

自定义算子工程需要完整开发算子的实现文件,如算子原型定义、tiling函数、infershape函数(可选,入图时需要)、kernel函数;Kernel直调工程只需要开发kernel函数。

代码文件

自定义算子工程

Kernel直调工程

算子原型定义

需要

不需要

Tiling函数

需要

可选

Tiling开发不受CANN框架的限制。

Infershape、InferDataType函数

可选,入图需要

不需要

Kernel函数

需要

需要

发布形式

自定义算子工程当前以run包形式发布,内部包含了tiling函数库、入图接口库、aclnn库、device object等;Kernel直调工程则最终只发布成静态库、动态库、可执行程序形式。