cann
固定Shape算子
更新时间:2021/01/27 GMT+08:00
对于昇腾AI处理器不支持的算子,用户需参考《TBE自定义算子开发指南》先完成自定义算子的开发,再参考如下内容执行单算子。
基本原理
单算子执行的基本流程如下,详细样例请参见数据后处理(调用单算子),回传结果到Host:
- 资源初始化,包括AscendCL初始化、设置单算子模型文件的加载目录、指定用于运算的Device等。
- 调用aclInit接口实现AscendCL初始化。
- 单算子模型文件,需要用户提前参见《ATC工具使用指南》将单算子定义文件(*.json)编译成适配昇腾AI处理器的离线模型(*.om文件)。
- 加载单算子模型文件,有两种方式:
调用aclopSetModelDir接口,设置加载模型文件的目录,目录下存放单算子模型文件(*.om文件)。
调用aclopLoad接口,从内存中加载单算子模型数据,由用户管理内存。单算子模型数据是指“单算子编译成*.om文件后,再将om文件读取到内存中”的数据。
- 调用aclrtSetDevice接口指定运算的Device。
- 调用aclrtCreateContext接口显式创建一个Context,调用aclrtCreateStream接口显式创建一个Stream。
若没有显式创建Stream,则使用默认Stream,默认Stream是在调用aclrtSetDevice接口时隐式创建的,默认Stream作为接口入参时,直接传NULL。
- 将算子输入数据从Host复制到Device上。
- 调用aclrtMemcpy接口实现同步内存复制。
- 调用aclrtMemcpyAsync接口实现异步内存复制。
- 执行单算子。
- 您需自行构造算子描述信息(输入输出Tensor描述、算子属性等)、申请存放算子输入输出数据的内存、调用aclopExecute接口加载并执行算子。
该方式下,每次调用aclopExecute接口执行算子,系统内部都会根据算子描述信息匹配内存中的模型。
- 您需自行构造算子描述信息(输入输出Tensor描述、算子属性等)、申请存放算子输入输出数据的内存、调用aclopCreateHandle接口创建一个Handle、再调用aclopExecWithHandle接口加载并执行算子。
该方式下,在调用aclopCreateHandle接口时,系统内部将算子描述信息匹配到内存中的模型,并缓存在Handle中,每次调用aclopExecWithHandle接口执行算子时,无需重复匹配算子与模型,因此在涉及多次执行同一个算子时,效率更高。Handle使用结束后,需调用aclopDestroyHandle接口释放。
- 您需自行构造算子描述信息(输入输出Tensor描述、算子属性等)、申请存放算子输入输出数据的内存、调用aclopExecute接口加载并执行算子。
- 将算子运算的输出数据从Device上复制到Host上(提前申请Host上的内存)。
- 调用aclrtMemcpy接口实现同步内存复制。
- 调用aclrtMemcpyAsync接口实现异步内存复制。
- 按顺序先释放Stream资源,再释放Context资源,最后释放Device资源。
- 调用aclrtDestroyStream接口释放Stream。
不涉及显式创建Stream,使用默认Stream时,无需调用aclrtDestroyStream接口释放Stream。
- 调用aclrtDestroyContext接口释放Context。
不涉及显式创建Context,使用默认Context时,无需调用aclrtDestroyContext接口释放Context。
- 调用aclrtResetDevice接口释放Device。
- 调用aclrtDestroyStream接口释放Stream。
- 调用aclFinalize接口实现AscendCL去初始化。
父主题: 未被封装成AscendCL接口的算子
