---
title: 单算子调用基础知识
description: "如果AI应用中不仅仅包括模型推理，还有数学运算（例如BLAS基础线性代数运算）、数据类型转换等功能，也想使用昇腾的算力，昇腾CANN还能支持吗？"
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/aadgc/aclcppdevg_000074.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/aadgc/aclcppdevg_000074.html
indexId: 898082db9a3aabb81461b53b96e00decfb7bb87c5abbe83d9fdf10519c203cf0104
---
# 单算子调用基础知识

#### 单算子调用的使用场景

如果AI应用中不仅仅包括模型推理，还有数学运算（例如BLAS基础线性代数运算）、数据类型转换等功能，也想使用昇腾的算力，昇腾CANN还能支持吗？

答案是肯定的，昇腾CANN提供了单算子调用的方式，直接通过AscendCL接口加载并执行单个算子，省去模型构建、训练的过程，相对轻量级，又可以使用昇腾的算力。

另外，自定义的算子，也可以通过单算子调用的方式来验证算子的功能。


#### 单算子调用与模型推理的差别

在解释单算子调用与模型推理的差别前，我们先观察下面这个开发流程图，先找出基本的共同点、不同点。

- 共同点：

  - 不管是模型推理，还是单算子调用，都需要AscendCL初始化和去初始化、运行管理资源申请和释放。
  - 不管是模型推理，还是单算子调用，都涉及加载、执行的步骤，但是要注意，两者的加载、执行是调用不同的AscendCL接口。
- 不同点：

  - 模型推理涉及模型卸载的步骤，单算子调用不涉及。

图1 单算子调用与模型推理的流程对比


#### 单算子调用功能开发流程

图2 开发流程

1. 准备环境。
  请参见。

2. 创建代码目录。
  在开发应用前，您需要先创建目录，存放代码文件、编译脚本、测试图片数据、模型文件等。

  如下仅是示例，供参考：

```
├App名称
├── op_model              // 该目录下存放编译算子的算子描述文件
│   ├── xxx.json
├── data
│   ├── xxxxxx           // 测试数据
├── inc                   // 该目录下存放声明函数的头文件
│   ├── xxx.h
├── out                   // 该目录下存放输出结果
├── src
│   ├── xxx.json         // 系统初始化的配置文件
│   ├── CMakeLists.txt   // 编译脚本
│   ├── xxx.cpp          // 实现文件
```


3. 编译算子。
若基于“单算子模型执行”方式调用算子，则需编译算子，编译算子有以下两种方式：

  - 使用ATC工具编译算子生成om模型文件
    该种方式，需要先构造*.json格式单算子描述文件（描述算子的输入、输出及属性等信息），借助ATC工具，将单算子描述文件编译成om模型文件；再分别调用AscendCL接口加载om模型文件、执行算子。

    关于ATC工具的使用说明，请参见《ATC工具使用指南(https://www.hiascend.com/document/detail/zh/canncommercial/700/inferapplicationdev/atctool/atlasatc_16_0001.html)》。

  - 也可以调用AscendCL提供的编译算子接口
    该种方式，直接调用AscendCL接口编译、执行算子。

关于单算子模型执行详细的接口调用流程请参见单算子调用流程。


4. 开发应用。
  依赖的头文件和库文件的说明请参见调用接口依赖的头文件和库文件说明。

  单算子调用的流程请参见单算子调用流程及相关的示例代码。

5. 编译运行应用，请参见  应用调试
。
