---
title: 单算子调用流程
description: "开发应用时，如果涉及执行单个算子，请先参见AscendCL接口调用流程了解整体流程，再查看本节中的流程说明。"
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/aadgc/aclcppdevg_000075.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/aadgc/aclcppdevg_000075.html
indexId: 88cdb0d5d988b9e31ed3f37bebd699f434d8eba1bf90e2e85241f050a24bbb0c104
---
# 单算子调用流程

开发应用时，如果涉及执行单个算子，请先参见AscendCL接口调用流程了解整体流程，再查看本节中的流程说明。

系统支持的算子请参见《算子清单(https://www.hiascend.com/document/detail/zh/canncommercial/700/oplist/operatorlist/operatorlist_0001.html)》。

对于系统不支持的算子，用户需先参见《TBE&AI CPU算子开发指南(https://www.hiascend.com/document/detail/zh/canncommercial/700/operatordev/tbeaicpudevg/atlasopdev_10_0001.html)》完成自定义算子开发。

#### 单算子模型执行接口调用流程

图1 单算子模型执行接口调用流程

关键接口的说明如下：1. 编译算子。
根据算子编译的方式，可分为以下两种：

  - 编译算子后，算子相关数据保存在*.om模型文件中
    该种方式下编译算子，需使用ATC工具，详细描述请参见《ATC工具使用指南(https://www.hiascend.com/document/detail/zh/canncommercial/700/inferapplicationdev/atctool/atlasatc_16_0001.html)》，将单算子定义文件（*.json）编译成适配昇腾AI处理器的离线模型（*.om文件）。

    编译算子后，依次进行2、3、4、5、6、7。

  - 编译算子后，算子相关数据保存在内存中
该种方式下编译算子，需调用AscendCL提供的接口，根据不同场景调用不同的接口：

    - 对于同一个算子，编译一次，多次执行的场景，建议调用      aclopCompile
接口编译算子。编译算子后，依次进行      3
、      4
、      5
、      6
、      7
。
    - 对于编译算子、执行算子次数相同的场景，建议先执行      3
，再调用      aclopCompileAndExecute
接口编译算子。编译算子后，再依次进行      6
、      7
。
2. 加载算子模型文件。
  支持以下2种方式中的一种加载单算子模型文件：
  - 调用    aclopSetModelDir
接口，设置加载模型文件的目录，目录下存放单算子模型文件（*.om文件）。
  - 调用    aclopLoad
接口，从内存中加载单算子模型数据，由用户管理内存。单算子模型数据是指“单算子编译成*.om文件后，再将om文件读取到内存中”的数据。


3. 调用  aclrtMalloc
接口申请Device上的内存，存放执行算子的输入、输出数据。
4. 动态Shape场景，如果无法明确算子的输出Shape时，在执行算子前，还需推导或预估算子的输出Shape。
  需用户调用aclopInferShape接口、aclGetTensorDescNumDims接口、aclGetTensorDescDimV2接口、aclGetTensorDescDimRange等接口，推导或预估算子的输出Shape，作为算子执行接口aclopExecuteV2的输入。

5. 执行算子。

  - 对于被封装成AscendCL接口的算子（参见CBLAS接口），包括GEMM算子、Cast算子，目前支持以下两种执行方式：

    - 不以handle方式执行算子，接口名称中不包含“Handle”关键字，例如，调用      aclblasGemmEx
接口（封装GEMM算子）、      aclopCast
接口（封装Cast算子）等执行算子。
    - 以handle方式执行算子，接口名称中包含“Handle”关键字，例如，调用      aclblasCreateHandleForGemmEx
接口、      aclopCreateHandleForCast
接口等创建handle后，还需要调用      aclopExecWithHandle
接口执行算子。
  - 对于未被封装成AscendCL接口的算子，目前支持以下两种执行方式：

    - 不以handle方式执行算子，调用      aclopExecuteV2
接口执行算子。
    - 以handle方式执行算子，调用      aclopCreateHandle
接口创建handle，再调用      aclopExecWithHandle
接口执行算子。
不以handle方式执行算子时，每次执行算子时，系统内部都会根据算子描述信息匹配内存中的模型。

以handle方式执行算子时，系统内部将算子描述信息匹配到内存中的模型，并缓存在Handle中，每次执行算子时，无需重复匹配算子与模型，因此在涉及多次执行同一个算子时，效率更高，但该方式不支持动态Shape算子，且Handle使用结束后，需调用aclopDestroyHandle接口释放。


6. 调用  aclrtSynchronizeStream
接口阻塞应用运行，直到指定Stream中的所有任务都完成。
7. 调用  aclrtFree
接口释放内存。
