mxVision默认采用同步执行模式,部分接口已支持用户通过申请AscendStream异步执行,具体接口异步支持情况请参见API参考(C++)。
mxVision提供AscendStream类进行Stream管理,关键步骤说明如下:
用户通过向构造函数传入“deviceId”指定要创建Stream的设备,支持的“deviceId”根据用户环境存在差异。
如需保证异步执行结果在作为下一个接口入参时已执行完成,可调用Synchronize()成员函数显式同步Stream。
用户在业务流程完成或Stream结束时,需调用DestroyAscendStream()成员函数销毁Stream,否则可能会造成Stream耗尽情况。
// 初始化 MxBase::MxInit(); { // 用户创建目标deviceId的stream AscendStream stream(deviceId) stream.CreatAscendStream(); // 创建图像解码类实例 ImageProcessor imageProcessor(deviceId); // 解码后的Image类实例 Image decodedImage; // 根据图像路径进行解码 APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage); // 缩放后的图像类实例 Image resizedImage; // 异步调用缩放接口 ret = imageProcessor.Resize(decodedImage, Size(416, 416), resizedImage, Interpolation::HUAWEI_HIGH_ORDER_FILTER, stream); // 调用同步接口,可以显式保证调用后续接口时缩放已完成 stream.Synchronize(); // 将 Image 类转换为 Tensor 类 Tensor tensorImg = resizedImage.ConvertToTensor(); // yoloV3模型推理 string yoloPath = "./model/yolov3_tf_bs1_fp16.om"; Model yoloV3(yoloPath, deviceId); // 构造推理输入输出 (单batch) vector<Tensor> yoloV3Inputs = {tensorImg}; vector<Tensor> yoloV3Outputs = {}; // 开始异步推理 ret = yoloV3.Infer(yoloV3Inputs, yoloV3Outputs,stream); // 调用同步接口,可以显式保证调用后续接口时缩放已完成 // 用户也可选择同步前在该stream串行其他异步接口 stream.Synchronize(); // 调用DestroyAscendStream销毁stream stream.DestroyAscendStream(); } //去初始化 MxBase::MxDeInit();