# AscendCL接口调用流程

#### 接口调用流程

调用AscendCL接口，可开发包含模型推理、媒体数据处理、单算子调用等功能的应用，这些功能可以独立存在，也可以组合存在。下图给出了使用AscendCL接口开发AI应用的整体接口调用流程。

图1 接口调用流程图

上图根据应用开发中的典型功能抽象出主要的接口调用流程，例如，如果模型对输入图片的宽高要求与用户提供的源图不一致，则需要媒体数据处理，将源图裁剪成符合模型的要求；如果需要实现模型推理的功能，则需要先加载模型，模型推理结束后，则需要卸载模型；如果模型推理后，需要从推理结果中查找最大置信度的类别标识对图片分类，则需要数据后处理。

1. AscendCL初始化。
  调用aclInit接口实现初始化AscendCL。

2. 运行管理资源申请。
  依次申请运行管理资源：Device、Context、Stream。

  具体流程，请参见运行管理资源申请与释放。

3. 模型推理/单算子调用/媒体数据处理。

  - 模型推理

    a. 模型加载：模型推理前，需要先将对应的模型加载到系统中。
      接口调用流程，请参见模型加载。

      但加载模型前，必须要有适配昇腾AI处理器的离线模型，需提前构建模型，请参见模型构建。

    b. （可选）媒体数据处理：可实现JPEG图片解码、视频解码、抠图/图片缩放/格式转换、JPEG图片编码等功能。
      接口调用流程，请参见媒体数据处理（含图像/视频等）

    c. 模型执行：使用模型实现图片分类、目标识别等功能。
      接口调用流程，请参见模型执行。

    d. （可选）数据后处理：处理模型推理的结果，此处根据用户的实际需求来处理推理结果，例如用户可以将获取到的推理结果写入文件、从推理结果中找到每张图片最大置信度的类别标识等。
    e. 模型卸载：调用      aclmdlUnload
接口卸载模型。
  - 单算子调用
    如果AI应用中不仅仅包括模型推理，还有数学运算（例如BLAS基础线性代数运算）、数据类型转换等功能，也想使用昇腾的算力，直接通过AscendCL接口加载并执行单个算子，省去模型构建、训练的过程，相对轻量级，又可以使用昇腾的算力。另外，自定义的算子，也可以通过单算子调用的方式来验证算子的功能。

    算子调用的接口调用流程，请参见单算子调用流程。

4. 运行管理资源释放。
  所有数据处理都结束后，需要依次释放运行管理资源：Stream、Context、Device。

  接口调用流程，请参见运行管理资源申请与释放。

5. AscendCL去初始化。
  调用aclFinalize接口实现AscendCL去初始化。


在应用开发过程中，各环节都涉及内存的申请与释放、数据传输（通过内存复制实现）、数据类型的创建与销毁，因此未在图中一一标识，关于内存申请与释放、内存复制的接口请参见内存管理，数据类型的创建与销毁的接口请参见数据类型及其操作接口。


#### 调用接口依赖的头文件和库文件说明

您需要根据实际使用的接口来include依赖的文件，AscendCL中各头文件的用途如下表所示。

AscendCL头文件在“CANN软件安装后文件存储路径/include/”目录下，AscendCL库文件在“CANN软件安装后文件存储路径/lib64/”目录下。

编译基于AscendCL接口的代码逻辑时，请按照include的头文件依赖对应的库文件，如果引用多余的so文件（例如libascendcl.a），可能导致版本功能异常或后续版本升级时存在兼容性问题。


**表1 头文件列表**

| 定义接口的头文件 | 用途 | 对应的库文件 |
| --- | --- | --- |
| acl/acl\_base.h | 用于定义基本的数据类型（例如aclDataBuffer、aclTensorDesc等）及其操作接口、枚举值（例如aclFormat）、日志管理接口等。 | libascendcl.so |
| acl/acl.h | 该头文件中已包含acl/acl\_mdl.h、acl/acl\_rt.h、acl/acl\_op.h。包含acl.h文件后，可以引用初始化/去初始化、Device管理、算力Group查询与设置、Context管理、Stream管理、同步等待、内存管理、模型加载与执行、算子编译（不包括aclopCompile接口）、算子加载与执行（不包括aclopCompileAndExecute接口）等接口。 | libascendcl.so |
| acl/acl\_prof.h | 用于定义Profiling配置的接口。 | libmsprofiler.so 说明： 为了兼容旧版本，旧版本中支持使用libascendcl.so，但后续版本这种方式会废弃，建议使用libmsprofiler.so，防止后续版本出现兼容性问题。 |
| acl/ops/acl\_cblas.h | 用于定义CBLAS接口。 | libacl\_cblas.so |
| acl/ops/acl\_dvpp.h | 用于定义媒体数据处理V1版本的接口。 | libacl\_dvpp.so |
| acl/ops/acl\_fv.h | 用于定义特征向量检索的接口。 Atlas 200/500 A2推理产品，不支持引用该头文件中的接口。 | libacl\_retr.so |
| acl/acl\_op\_compiler.h | 用于定义aclopCompile、aclopCompileAndExecute、aclSetCompileopt等算子在线编译相关的接口、数据类型、枚举值等。 | libacl\_op\_compiler.so |
| acl/acl\_tdt.h | 用于定义Tensor数据传输接口。 Atlas 200/500 A2推理产品，不支持引用该头文件中的接口。 | libacl\_tdt\_channel.so |
| acl/acl\_tdt\_queue.h | 用于定义共享队列管理、共享Buffer管理接口。 | libacl\_tdt\_queue.so |
| acl/dvpp/hi\_dvpp.h | 用于定义媒体数据处理V2版本的接口。 | libacl\_dvpp\_mpi.so |
| acl/media目录下： hi\_mpi\_vi.h hi\_common\_vi.h hi\_common\_dis.h hi\_common\_gdc.h hi\_media\_common.h hi\_media\_type.h hi\_mpi\_sys.h | 用于定义VI（Vedio Input）视频数据获取功能的接口。 | libacl\_vi\_mpi.so libacl\_dvpp\_mpi.so |
| acl/media目录下： hi\_mpi\_isp.h hi\_common\_isp.h hi\_common\_3a.h hi\_mpi\_ae.h hi\_common\_ae.h hi\_mpi\_awb.h hi\_common\_awb.h hi\_common\_sns.h hi\_media\_common.h hi\_media\_type.h hi\_mpi\_sys.h | 用于定义ISP（Image Signal Processing）系统控制功能的接口。 | libacl\_isp\_ae\_mpi.so libacl\_isp\_awb\_mpi.so libacl\_isp\_mpi.so libacl\_dvpp\_mpi.so |
| acl/media目录下： hi\_mpi\_vpss.h hi\_media\_common.h hi\_media\_type.h hi\_mpi\_sys.h | 用于定义VPSS（Video Process Sub\-System）图像处理功能的接口。 | libacl\_vpss\_mpi.so libacl\_dvpp\_mpi.so |
| acl/media/hi\_mipi\_rx.h | 用于定义MIPI Rx ioctl命令字。 | \- |
| acl/media目录下： hi\_mpi\_audio.h hi\_common\_aio.h | 用于定义频输入、音频输出功能的接口。 | libacl\_audio\_mpi.so |
| acl/media/hi\_acodec.h | 用于定义音量调整的命令字。 | \- |
| acl/media目录下： hi\_common\_vo.h hi\_mpi\_vo.h | 用于定义视频输出接口。 | libacl\_vo\_mpi.so |
| acl/media/hi\_mpi\_hdmi.h | 用于定义对接外设的HDMI接口。 | libacl\_hdmi\_mpi.so |
| acl/media/hi\_mpi\_tde.h | 用于定义TDE图形绘制接口。 | libacl\_tde\_mpi.so |
| acl/media/hifb.h | 用于定义叠加图形层管理接口。 | \- |
| aclnn/acl\_meta.h | 用于定义依赖的AscendCL meta接口，通过这些元接口可构建不同数据结构，如aclTensor、aclScalar、aclIntArray等。 Atlas 200/500 A2推理产品，不支持引用该头文件中的接口。 | libnnopbase.so |
| aclnn/aclnn\_base.h | 用于定义NN类算子公共的base接口，即aclnnInit和aclnnFinalize。 Atlas 200/500 A2推理产品，不支持引用该头文件中的接口。 | libnnopbase.so |
| aclnnop/aclnn\_\*.h （\*表示具体的算子名称） 说明： 为兼容旧版本，旧版本NN类算子头文件路径是aclnnop/level2/aclnn\_\*.h，但后续版本该路径会废弃，建议使用新路径aclnnop/aclnn\_\*.h，防止后续版本出现兼容性问题。 | 用于定义NN类算子的功能接口。 Atlas 200/500 A2推理产品，不支持引用该头文件中的接口。 | libopapi.so |
| acldvppop/acldvpp\_base.h acldvppop/acldvpp\_op\_api.h | 用于定义DVPP媒体数据处理类算子的功能接口。 Atlas 200/500 A2推理产品，不支持引用该头文件中的接口。 | libacl\_dvpp\_op.so |
