异步调用
AscendStream
[!NOTICE] 通过AscendStream创建的Stream,不能直接通过AscendCL接口进行操作,否则会导致异常。
类说明
该类用于异步流程控制。
相关使用流程请参考异步调用。
Atlas 200I/500 A2 推理产品
Atlas 推理系列产品
Atlas 800I A2推理产品
- 对于Atlas 推理系列产品,同一设备(deviceId)Stream最大支持创建1020个。具体请参见《CANN 应用开发指南 (C&C++)》。
- 对于Atlas 200I/500 A2 推理产品,同一设备(deviceId),Stream创建个数推荐不超过256个。
- 对于Atlas 800I A2推理产品,同一设备(deviceId),Stream创建个数推荐不超过1024个。
- AscendStream需显式调用DestroyAscendStream()接口销毁资源,因此在右值使用场景下可能会存在未调用DestroyAscendStream接口所导致的资源泄漏,请用户谨慎使用该场景。
- 请勿使用赋值运算符。
公共参数
| 参数名 | 数据类型 | 参数说明 |
|---|---|---|
| stream | void* | Stream对应的指针,默认值为nullptr。 |
| isDefault_ | bool | 声明当前创建的Stream是否为默认Stream,默认值为false(即非默认)。 |
AddTensorRefPtr
将输入Tensor挂载到AscendStream对象上,延长输入Tensor的生命周期。当调用Synchronize或者DestroyAscendStream时,AscendStream对象会释放被挂载的Tensor。
APP_ERROR AscendStream::AddTensorRefPtr(const Tensor& inputTensor);
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| inputTensor | 输入 | Tensor类,需要挂载到AscendStream对象上的张量。 |
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |
AscendStream
AscendStream类的构造函数。
原型1:
explicit AscendStream::AscendStream(int32_t deviceId = 0);
原型2:
explicit AscendStream::AscendStream(int32_t deviceId, AscendStream::FlagType flag); // 支持用户传入FlagType,构造快速流和异步流。构造失败时,会抛出std::runtime_error异常。
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| deviceId | 输入 | 指定Stream对应的设备ID。 |
| flag | 输入 | 当前创建Stream的flag类型,数据结构如下:enum FlagType { DEFAULT = 0, FAST_LAUNCH = 1, FAST_SYNC = 2, LAUNCH_SYNC = 3,};数据结构说明: 对于Atlas 200I/500 A2 推理产品,只支持“DEFAULT”模式。 |
~AscendStream
AscendStream类的默认析构函数。
AscendStream::~AscendStream();
CreateAscendStream
在当前进程或线程中创建一个Stream,同步接口。
Note
该接口会注册处理Stream上回调函数的线程,线程统一命名为“mx_stream”。
APP_ERROR AscendStream::CreateAscendStream();
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |
CreateChannel
创建一个Stream的通道,最多仅支持创建255个,如超出该限制将会出现异常。
APP_ERROR AscendStream::CreateChannel();
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |
DestroyAscendStream
销毁一个Stream。
用户在创建Stream之后,必须在调用MxDeInit()接口进行去初始化之前调用此接口,否则会有资源泄漏的风险。具体使用流程可参考异步调用。
APP_ERROR AscendStream::DestroyAscendStream();
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |
DefaultStream
在当前进程创建一个默认Stream,静态对象,不支持异步调用。使用前需初始化设备并调用SetDevice指定具体设备ID。
static AscendStream &AscendStream::DefaultStream();
| 数据结构 | 说明 |
|---|---|
| AscendStream | 返回AscendStream类。 |
GetChannel
获取指定Stream的通道号。
APP_ERROR AscendStream::GetChannel(int* channelId);
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| channelId | 输出 | Stream对应的通道号指针。 |
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |
GetDeviceId
获取Stream所在设备ID(deviceId)。
int32_t AscendStream::GetDeviceId() const;
| 数据结构 | 说明 |
|---|---|
| int32_t | Stream所在的设备ID。 |
GetErrorCode
获取并返回已记录的错误码,以pair(对)形式返回。
与SetErrorCode配合使用,需在调用Synchronize之后使用。
std::pair<APP_ERROR, APP_ERROR> AscendStream::GetErrorCode();
| 数据结构 | 说明 |
|---|---|
| std::pair<APP_ERROR, APP_ERROR> | 返回已记录的错误码对,其中第一个字段为第一次记录的错误码,第二个字段为最后记录的错误码。 |
LaunchCallBack
提供异步回调功能。
需在调用CreateAscendStream之后使用。
APP_ERROR AscendStream::LaunchCallBack(aclrtCallback fn, void* userData);
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| fn | 输入 | 指定要增加的回调函数。回调函数的函数原型参见如下。typedef void (*aclrtCallback)(void *userData) |
| userData | 输入 | 回调函数所需的参数。 |
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |
SetErrorCode
记录异步任务中产生的错误码。
接口将会记录第一次以及最后一次产生的错误码,可通过GetErrorCode接口获取。
void AscendStream::SetErrorCode(APP_ERROR errCode);
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| errCode | 输入 | 错误码,记录单次产生的错误码。 |
Synchronize
阻塞应用程序运行,直到指定Stream中的所有任务都完成,同步接口。
APP_ERROR AscendStream::Synchronize() const;
| 数据结构 | 说明 |
|---|---|
| APP_ERROR | 程序执行返回的错误码,请参考APP_ERROR说明。 |