---
title: aclmdlExecute
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendgraphapi/aclcppdevg_03_0298.html
sourcePath: /source/zh/canncommercial/900/API/ascendgraphapi/aclcppdevg_03_0298.html
indexId: aae50e057505689691e9a470dc11f1b713e210a66c10da22712ea8970d2c40f972
---
# aclmdlExecute

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | √ |
| Atlas 推理系列产品 | √ |
| Atlas 训练系列产品 | √ |


#### 功能说明

执行模型推理，直到返回推理结果。

模型加载、模型执行、模型卸载的操作必须在同一个Context下（关于Context的创建请参见aclrtCreateContext(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/runtimeapi/aclcppdevg_03_0059.html)）。


#### 函数原型

```
aclError aclmdlExecute(uint32_t modelId, const aclmdlDataset *input, aclmdlDataset *output)
```


#### 参数说明

| 参数名 | 输入/输出 | 说明 |  |  |
| --- | --- | --- | --- | --- |
| modelId | 输入 | 指定推理模型的ID。 调用模型加载接口（例如aclmdlLoadFromFile接口、aclmdlLoadFromMem等）成功后，会返回模型ID，该ID作为本接口的输入。 |  |  |
| input | 输入 | 模型推理的输入数据的指针。类型定义请参见aclmdlDataset。 |  |  |
| output | 输出 | 模型推理输出数据的指针。类型定义请参见aclmdlDataset。 调用aclCreateDataBuffer接口创建存放对应index输出数据的aclDataBuffer类型时，支持在data参数处传入nullptr，同时size需设置为0，表示创建一个空的aclDataBuffer类型，然后在模型执行过程中，系统内部自行计算并申请该index输出的内存。使用该方式可节省内存，但内存数据使用结束后，需由用户释放内存并重置aclDataBuffer，同时，系统内部申请内存时涉及内存拷贝，可能涉及性能损耗。 释放内存并重置aclDataBuffer的示例代码如下： 1 2 3 4 aclDataBuffer \*dataBuffer = aclmdlGetDatasetBuffer(output, 0); // 根据index获取对应的dataBuffer void \*data = aclGetDataBufferAddr(dataBuffer); // 获取data的Device指针 aclrtFree(data ); // 释放Device内存 aclUpdateDataBuffer(dataBuffer, nullptr, 0); // 重置dataBuffer里面内容，以便下次推理 | 1 2 3 4 | aclDataBuffer \*dataBuffer = aclmdlGetDatasetBuffer(output, 0); // 根据index获取对应的dataBuffer void \*data = aclGetDataBufferAddr(dataBuffer); // 获取data的Device指针 aclrtFree(data ); // 释放Device内存 aclUpdateDataBuffer(dataBuffer, nullptr, 0); // 重置dataBuffer里面内容，以便下次推理 |
| 1 2 3 4 | aclDataBuffer \*dataBuffer = aclmdlGetDatasetBuffer(output, 0); // 根据index获取对应的dataBuffer void \*data = aclGetDataBufferAddr(dataBuffer); // 获取data的Device指针 aclrtFree(data ); // 释放Device内存 aclUpdateDataBuffer(dataBuffer, nullptr, 0); // 重置dataBuffer里面内容，以便下次推理 |  |  |  |


#### 返回值说明

返回0表示成功，返回其他值表示失败，请参见aclError。


#### 约束说明

- 若由于业务需求，必须在多线程中使用同一个modelId，则用户线程间需加锁，保证刷新输入输出内存、保证执行是连续操作，例如：

```
// 线程A的接口调用顺序：
lock(handle1) -> aclrtMemcpy刷新输入输出内存 -> aclmdlExecute执行推理 -> unlock(handle1)
// 线程B的接口调用顺序：
lock(handle1) -> aclrtMemcpy刷新输入输出内存 -> aclmdlExecute执行推理 -> unlock(handle1)
```


- 存放模型输入/输出数据的内存为Device内存，可以调用aclrtMalloc(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/runtimeapi/aclcppdevg_03_0095.html)、hi_mpi_dvpp_malloc(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/dvpp/aclcppdevg_03_0391.html)等接口申请Device内存。hi_mpi_dvpp_malloc(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/dvpp/aclcppdevg_03_0391.html)接口是媒体数据处理功能专用的内存申请接口，一般从性能角度，为了减少拷贝，媒体数据处理的输出作为模型推理的输入，实现内存复用。但由于媒体数据处理访问的地址空间有限，为确保媒体数据处理时内存足够，除媒体数据处理功能外的其它功能（例如，模型加载），建议调用其它接口申请内存，例如aclrtMalloc(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/runtimeapi/aclcppdevg_03_0095.html)接口。


#### 接口调用示例

接口调用流程及示例代码，参见模型执行(https://www.hiascend.comdocument/detail/zh/canncommercial/900/programug/acldevg/aclcppdevg_000030.html)。
