已合并
【PR】: aclGraph optimize #3457
houyanbao创建于 7月7日
【PR】: aclGraph optimize #3457
已合并
共 15 个文件变更+72-70
| @@ -870,7 +870,7 @@ public: | |||
| 870 | void SetSoftwareSqEnable(void); | 870 | void SetSoftwareSqEnable(void); |
| 871 | rtError_t BuildSqCq(Stream * const exeStream); | 871 | rtError_t BuildSqCq(Stream * const exeStream); |
| 872 | void DeconstructSqCq(void); | 872 | void DeconstructSqCq(void); |
| 873 | - rtError_t ReleaseSqCq(uint32_t &releaseNum); | 873 | + rtError_t ReleaseSqCqAndNotifyId(uint32_t &releaseSqNum, uint32_t &releaseNtyNum); |
| 874 | 874 | ||
| 875 | // Notify 管理 | 875 | // Notify 管理 |
| 876 | rtError_t SetNotifyBeforeExecute(Stream * const exeStm, CaptureModel* const captureMdl); | 876 | rtError_t SetNotifyBeforeExecute(Stream * const exeStm, CaptureModel* const captureMdl); |
| @@ -1328,7 +1328,7 @@ if ((curCaptureStream->GetCaptureSqeNum() + reserved) >= curCaptureStream->GetSq | |||
| 1328 | ### 5.3 Software SQ 动态绑定 | 1328 | ### 5.3 Software SQ 动态绑定 |
| 1329 | 1329 | ||
| 1330 | - 支持 SQ/CQ 的动态分配和绑定 | 1330 | - 支持 SQ/CQ 的动态分配和绑定 |
| 1331 | -- 执行时 BuildSqCq,完成后 ReleaseSqCq | 1331 | +- 执行时 BuildSqCq,完成后 ReleaseSqCqAndNotifyId |
| 1332 | - 通过 SqSwitchStreamBatch 实现批量流切换 | 1332 | - 通过 SqSwitchStreamBatch 实现批量流切换 |
| 1333 | 1333 | ||
| 1334 | ### 5.4 Notify 同步机制 | 1334 | ### 5.4 Notify 同步机制 |
| @@ -345,7 +345,7 @@ public: | |||
| 345 | // endGraph + alloc sq cq + Send sqe + bind sq cq + load complete + update task | 345 | // endGraph + alloc sq cq + Send sqe + bind sq cq + load complete + update task |
| 346 | rtError_t BuildSqCq(Stream * const exeStream); | 346 | rtError_t BuildSqCq(Stream * const exeStream); |
| 347 | void DeconstructSqCq(void); | 347 | void DeconstructSqCq(void); |
| 348 | - rtError_t ReleaseSqCq(uint32_t &releaseNum); | 348 | + rtError_t ReleaseSqCqAndNotifyId(uint32_t &releaseSqNum, uint32_t &releaseNtyNum); |
| 349 | void CaptureModelExecuteFinish(const uint32_t errCode); | 349 | void CaptureModelExecuteFinish(const uint32_t errCode); |
| 350 | 350 | ||
| 351 | // 子模型资源管理相关方法 | 351 | // 子模型资源管理相关方法 |
| @@ -3305,6 +3305,13 @@ rtError_t Stream::StarsAddTaskToStream(TaskInfo * const tsk, const uint32_t send | |||
| 3305 | "Pack task group failed, stream_id=%d, task_id=%hu.", streamId_, tsk->id); | 3305 | "Pack task group failed, stream_id=%d, task_id=%hu.", streamId_, tsk->id); |
| 3306 | taskPersistentTail_.Set(newPosTail); | 3306 | taskPersistentTail_.Set(newPosTail); |
| 3307 | delayRecycleTaskid_.push_back(tsk->id); | 3307 | delayRecycleTaskid_.push_back(tsk->id); |
| 3308 | + | ||
| 3309 | + Model *model = tsk->stream->Model_(); | ||
| 3310 | + if ((model != nullptr) && (model->GetModelType() == RT_MODEL_CAPTURE_MODEL)) { | ||
| 3311 | + tsk->modelSeqId = dynamic_cast<CaptureModel *>(model)->GenerateSeqId(); | ||
| 3312 | + RT_LOG(RT_LOG_INFO, "device_id=%u, stream_id=%d, task_id=%hu, sequence id=%u.", | ||
| 3313 | + tsk->stream->Device_()->Id_(), streamId_, tsk->id, tsk->modelSeqId); | ||
| 3314 | + } | ||
| 3308 | } else { | 3315 | } else { |
| 3309 | const uint32_t posHead = bind ? taskPersistentHead_.Value() : taskPosHead_.Value(); | 3316 | const uint32_t posHead = bind ? taskPersistentHead_.Value() : taskPosHead_.Value(); |
| 3310 | const bool stmFullFlag = IsStreamFull(posHead, posTail, rtsqDepth, sendSqeNum); | 3317 | const bool stmFullFlag = IsStreamFull(posHead, posTail, rtsqDepth, sendSqeNum); |
| @@ -702,6 +702,13 @@ rtError_t DavidStream::StarsAddTaskToStream(TaskInfo * const tsk, const uint32_t | |||
| 702 | this->Model_()->SetKernelTaskId(tsk->taskSn, GetExposedStreamId()); | 702 | this->Model_()->SetKernelTaskId(tsk->taskSn, GetExposedStreamId()); |
| 703 | } | 703 | } |
| 704 | delayRecycleTaskid_.push_back(tsk->id); | 704 | delayRecycleTaskid_.push_back(tsk->id); |
| 705 | + | ||
| 706 | + Model *model = tsk->stream->Model_(); | ||
| 707 | + if ((model != nullptr) && (model->GetModelType() == RT_MODEL_CAPTURE_MODEL)) { | ||
| 708 | + tsk->modelSeqId = dynamic_cast<CaptureModel *>(model)->GenerateSeqId(); | ||
| 709 | + RT_LOG(RT_LOG_INFO, "device_id=%u, stream_id=%d, task_id=%hu, sequence id=%u.", | ||
| 710 | + tsk->stream->Device_()->Id_(), streamId_, tsk->id, tsk->modelSeqId); | ||
| 711 | + } | ||
| 705 | } | 712 | } |
| 706 | RT_LOG(RT_LOG_INFO, "%s stream, stream_id=%d, task_id=%hu, task_sn=%u, type=%d(%s), " | 713 | RT_LOG(RT_LOG_INFO, "%s stream, stream_id=%d, task_id=%hu, task_sn=%u, type=%d(%s), " |
| 707 | "sqe_num=%u, device_id=%u", GetBindFlag() ? "model" : "single-operator", streamId_, tsk->id, | 714 | "sqe_num=%u, device_id=%u", GetBindFlag() ? "model" : "single-operator", streamId_, tsk->id, |
| @@ -316,14 +316,6 @@ static rtError_t AllocCaptureTaskInfo(TaskInfo **taskInfo, Stream * const stm, u | |||
| 316 | taskResMang = RtPtrToPtr<TaskResManageDavid *, TaskResManage *>(curCaptureStream->taskResMang_); | 316 | taskResMang = RtPtrToPtr<TaskResManageDavid *, TaskResManage *>(curCaptureStream->taskResMang_); |
| 317 | if (taskResMang->AllocTaskInfoAndPos(sqeNum, pos, taskInfo) == RT_ERROR_NONE) { | 317 | if (taskResMang->AllocTaskInfoAndPos(sqeNum, pos, taskInfo) == RT_ERROR_NONE) { |
| 318 | Runtime::Instance()->AllocTaskSn((*taskInfo)->taskSn); | 318 | Runtime::Instance()->AllocTaskSn((*taskInfo)->taskSn); |
| 319 | - Model *m = curCaptureStream->Model_(); | ||
| 320 | - if ((m != nullptr) && (m->GetModelType() == RT_MODEL_CAPTURE_MODEL)) { | ||
| 321 | - (*taskInfo)->modelSeqId = dynamic_cast<CaptureModel *>(m)->GenerateSeqId(); | ||
| 322 | - RT_LOG(RT_LOG_DEBUG, "Alloc capture task, device_id=%u, origin stream_id=%d, " | ||
| 323 | - "capture stream_id=%d, task_id=%hu, task_sn=%u, sequence id=%u.", | ||
| 324 | - stm->Device_()->Id_(), stm->Id_(), curCaptureStream->Id_(), | ||
| 325 | - (*taskInfo)->id, (*taskInfo)->taskSn, (*taskInfo)->modelSeqId); | ||
| 326 | - } | ||
| 327 | } else { | 319 | } else { |
| 328 | stm->SingleStreamTerminateCapture(); | 320 | stm->SingleStreamTerminateCapture(); |
| 329 | } | 321 | } |
| @@ -580,11 +580,12 @@ rtError_t CaptureModel::UpdateNotifyId(Stream * const exeStream) | |||
| 580 | "Origin capture stream and end graph notify cannot be NULL pointers, model_id=%u.", Id_()); | 580 | "Origin capture stream and end graph notify cannot be NULL pointers, model_id=%u.", Id_()); |
| 581 | 581 | ||
| 582 | rtError_t error = RT_ERROR_NONE; | 582 | rtError_t error = RT_ERROR_NONE; |
| 583 | + rtError_t errorTmp = RT_ERROR_NONE; | ||
| 583 | do { | 584 | do { |
| 584 | COND_PROC(ntf->GetNotifyId() != MAX_UINT32_NUM, break;); // 所有子模型共用一个notify,其中一个申请,其他的就不用再申请了 | 585 | COND_PROC(ntf->GetNotifyId() != MAX_UINT32_NUM, break;); // 所有子模型共用一个notify,其中一个申请,其他的就不用再申请了 |
| 585 | error = ntf->AllocId(); | 586 | error = ntf->AllocId(); |
| 586 | - COND_PROC(error != RT_ERROR_NONE, error = Context_()->TryRecycleCaptureModelResource(0U, 1U, this)); | 587 | + COND_PROC(error != RT_ERROR_NONE, errorTmp = Context_()->TryRecycleCaptureModelResource(0U, 1U, this)); |
| 587 | - COND_PROC(error != RT_ERROR_NONE, mmSleep(1U)); | 588 | + COND_PROC(errorTmp != RT_ERROR_NONE, mmSleep(1U)); |
| 588 | } while (error != RT_ERROR_NONE); | 589 | } while (error != RT_ERROR_NONE); |
| 589 | 590 | ||
| 590 | if (!this->IsSubCaptureModel()) { // 只有根模型才刷新,其他各层级子模型发给ts的notify id均为根模型的id,异常时直接解执行流的endgraph wait | 591 | if (!this->IsSubCaptureModel()) { // 只有根模型才刷新,其他各层级子模型发给ts的notify id均为根模型的id,异常时直接解执行流的endgraph wait |
| @@ -682,16 +683,18 @@ rtError_t CaptureModel::BuildSqCq(Stream * const exeStream) | |||
| 682 | 683 | ||
| 683 | void CaptureModel::DeconstructSqCq(void) | 684 | void CaptureModel::DeconstructSqCq(void) |
| 684 | { | 685 | { |
| 685 | - uint32_t releaseNum = 0U; | 686 | + uint32_t releaseSqNum = 0U; |
| 687 | + uint32_t releaseNtyNum = 0U; | ||
| 686 | const std::unique_lock<std::mutex> lk(sqBindMutex_); | 688 | const std::unique_lock<std::mutex> lk(sqBindMutex_); |
| 687 | 689 | ||
| 688 | - (void)ReleaseSqCq(releaseNum); | 690 | + (void)ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); |
| 689 | return; | 691 | return; |
| 690 | } | 692 | } |
| 691 | 693 | ||
| 692 | -rtError_t CaptureModel::ReleaseSqCq(uint32_t &releaseNum) | 694 | +rtError_t CaptureModel::ReleaseSqCqAndNotifyId(uint32_t &releaseSqNum, uint32_t &releaseNtyNum) |
| 693 | { | 695 | { |
| 694 | - releaseNum = 0U; | 696 | + releaseSqNum = 0U; |
| 697 | + releaseNtyNum = 0U; | ||
| 695 | if ((sqCqNum_ == 0U) || (refCount_ != 0U)) { | 698 | if ((sqCqNum_ == 0U) || (refCount_ != 0U)) { |
| 696 | RT_LOG(RT_LOG_DEBUG, "model cannot be released, model_id=%u, sqCqNum=%u, refCount=%u.", | 699 | RT_LOG(RT_LOG_DEBUG, "model cannot be released, model_id=%u, sqCqNum=%u, refCount=%u.", |
| 697 | Id_(), sqCqNum_, refCount_); | 700 | Id_(), sqCqNum_, refCount_); |
| @@ -699,7 +702,7 @@ rtError_t CaptureModel::ReleaseSqCq(uint32_t &releaseNum) | |||
| 699 | } | 702 | } |
| 700 | 703 | ||
| 701 | // 先递归释放子模型资源 | 704 | // 先递归释放子模型资源 |
| 702 | - rtError_t error = ReleaseAllSubModelSqCq(releaseNum); | 705 | + rtError_t error = ReleaseAllSubModelSqCq(releaseSqNum); |
| 703 | if (error != RT_ERROR_NONE) { | 706 | if (error != RT_ERROR_NONE) { |
| 704 | RT_LOG(RT_LOG_ERROR, "release all sub models sqcq failed, model_id=%u, retCode=%#x.", | 707 | RT_LOG(RT_LOG_ERROR, "release all sub models sqcq failed, model_id=%u, retCode=%#x.", |
| 705 | Id_(), static_cast<uint32_t>(error)); | 708 | Id_(), static_cast<uint32_t>(error)); |
| @@ -714,12 +717,11 @@ rtError_t CaptureModel::ReleaseSqCq(uint32_t &releaseNum) | |||
| 714 | COND_RETURN_ERROR((error != RT_ERROR_NONE), error, | 717 | COND_RETURN_ERROR((error != RT_ERROR_NONE), error, |
| 715 | "free sq cq failed, model_id=%u, retCode=%#x.", Id_(), static_cast<uint32_t>(error)); | 718 | "free sq cq failed, model_id=%u, retCode=%#x.", Id_(), static_cast<uint32_t>(error)); |
| 716 | 719 | ||
| 717 | - releaseNum += sqCqNum_; | 720 | + releaseSqNum += sqCqNum_; |
| 718 | DELETE_A(sqCqArray_); | 721 | DELETE_A(sqCqArray_); |
| 719 | sqCqNum_ = 0U; | 722 | sqCqNum_ = 0U; |
| 720 | 723 | ||
| 721 | - uint32_t notifReleaseNum = 0; | 724 | + (void)ReleaseNotifyId(releaseNtyNum); |
| 722 | - (void)ReleaseNotifyId(notifReleaseNum); | ||
| 723 | 725 | ||
| 724 | return RT_ERROR_NONE; | 726 | return RT_ERROR_NONE; |
| 725 | } | 727 | } |
| @@ -944,8 +946,9 @@ void CaptureModel::BackupArgHandle(const uint16_t streamId, const uint16_t taskI | |||
| 944 | 946 | ||
| 945 | rtError_t CaptureModel::Update(void) | 947 | rtError_t CaptureModel::Update(void) |
| 946 | { | 948 | { |
| 947 | - uint32_t releaseNum = 0U; | 949 | + uint32_t releaseSqNum = 0U; |
| 948 | - rtError_t error = ReleaseSqCq(releaseNum); | 950 | + uint32_t releaseNtyNum = 0U; |
| 951 | + rtError_t error = ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 949 | ERROR_RETURN(error, "release sq cq failed, model_id=%d.", Id_()); | 952 | ERROR_RETURN(error, "release sq cq failed, model_id=%d.", Id_()); |
| 950 | for (Stream* stm : StreamList_()) { | 953 | for (Stream* stm : StreamList_()) { |
| 951 | const int32_t streamId = stm->Id_(); | 954 | const int32_t streamId = stm->Id_(); |
| @@ -962,7 +965,8 @@ rtError_t CaptureModel::Update(void) | |||
| 962 | } | 965 | } |
| 963 | 966 | ||
| 964 | SetIsSendSqe(false); | 967 | SetIsSendSqe(false); |
| 965 | - RT_LOG(RT_LOG_INFO, "update finish, model_id=%u, releaseNum=%u.", Id_(), releaseNum); | 968 | + RT_LOG(RT_LOG_INFO, "update finish, model_id=%u, releaseSqNum=%u, releaseNtyNum=%u.", Id_(), |
| 969 | + releaseSqNum, releaseNtyNum); | ||
| 966 | return RT_ERROR_NONE; | 970 | return RT_ERROR_NONE; |
| 967 | } | 971 | } |
| 968 | void CaptureModel::SetModelCacheOpInfoSwitch(const uint32_t status) const { | 972 | void CaptureModel::SetModelCacheOpInfoSwitch(const uint32_t status) const { |
| @@ -1322,9 +1326,6 @@ rtError_t CaptureModel::ReleaseSqCqInternal(uint32_t &releaseNum) | |||
| 1322 | DELETE_A(sqCqArray_); | 1326 | DELETE_A(sqCqArray_); |
| 1323 | sqCqNum_ = 0U; | 1327 | sqCqNum_ = 0U; |
| 1324 | 1328 | ||
| 1325 | - uint32_t notifReleaseNum = 0; | ||
| 1326 | - ReleaseNotifyId(notifReleaseNum); | ||
| 1327 | - | ||
| 1328 | return RT_ERROR_NONE; | 1329 | return RT_ERROR_NONE; |
| 1329 | } | 1330 | } |
| 1330 | 1331 | ||
| @@ -405,12 +405,6 @@ rtError_t Context::AddNotifyToAddedCaptureStream(Stream * const oriSingleStm, Ca | |||
| 405 | "capture model_id=%u, stream_id=%d, notify_id=%u, retCode=%#x", | 405 | "capture model_id=%u, stream_id=%d, notify_id=%u, retCode=%#x", |
| 406 | device_->Id_(), oriSingleStm->Id_(), captureMdl->Id_(), | 406 | device_->Id_(), oriSingleStm->Id_(), captureMdl->Id_(), |
| 407 | streamObj.second.back()->Id_(), notify->GetNotifyId(), error); | 407 | streamObj.second.back()->Id_(), notify->GetNotifyId(), error); |
| 408 | - TaskInfo *task = device_->GetTaskFactory()->GetTask(lastStm->Id_(), lastStm->GetLastTaskId()); | ||
| 409 | - if (task != nullptr) { | ||
| 410 | - task->modelSeqId = captureMdl->GenerateSeqId(); | ||
| 411 | - RT_LOG(RT_LOG_INFO, "Alloc task sequence id=%u, device id=%u, stream_id=%d, task_id=%u", | ||
| 412 | - task->modelSeqId, device_->Id_(), lastStm->Id_(), lastStm->GetLastTaskId()); | ||
| 413 | - } | ||
| 414 | error = apiObj->NotifyWait(notify, oriSingleStm, MAX_UINT32_NUM); | 408 | error = apiObj->NotifyWait(notify, oriSingleStm, MAX_UINT32_NUM); |
| 415 | ERROR_RETURN(error, | 409 | ERROR_RETURN(error, |
| 416 | "Notify wait failed, device_id=%u, original stream_id=%d, " | 410 | "Notify wait failed, device_id=%u, original stream_id=%d, " |
| @@ -18,6 +18,7 @@ rtError_t Context::TryRecycleCaptureModelResource(const uint32_t allocSqNum, con | |||
| 18 | UNUSED(excludeMdl); | 18 | UNUSED(excludeMdl); |
| 19 | rtError_t error = RT_ERROR_NONE; | 19 | rtError_t error = RT_ERROR_NONE; |
| 20 | uint32_t releaseSqNum = 0U; | 20 | uint32_t releaseSqNum = 0U; |
| 21 | + uint32_t releaseNtyNum = 0U; | ||
| 21 | uint32_t totalReleaseSqNum = 0U; | 22 | uint32_t totalReleaseSqNum = 0U; |
| 22 | uint32_t totalReleaseNtfNum = 0U; | 23 | uint32_t totalReleaseNtfNum = 0U; |
| 23 | 24 | ||
| @@ -32,23 +33,15 @@ rtError_t Context::TryRecycleCaptureModelResource(const uint32_t allocSqNum, con | |||
| 32 | continue; | 33 | continue; |
| 33 | } | 34 | } |
| 34 | 35 | ||
| 35 | - if (allocSqNum > totalReleaseSqNum) { | 36 | + if ((allocSqNum > totalReleaseSqNum) || (ntfCnt > totalReleaseNtfNum)) { |
| 36 | if (captureMdl->ModelSqOperTryLock()) { | 37 | if (captureMdl->ModelSqOperTryLock()) { |
| 37 | releaseSqNum = 0U; | 38 | releaseSqNum = 0U; |
| 38 | - error = captureMdl->ReleaseSqCq(releaseSqNum); | 39 | + releaseNtyNum = 0U; |
| 40 | + error = captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 39 | captureMdl->ModelSqOperUnLock(); | 41 | captureMdl->ModelSqOperUnLock(); |
| 40 | COND_PROC(error != RT_ERROR_NONE, break); | 42 | COND_PROC(error != RT_ERROR_NONE, break); |
| 41 | totalReleaseSqNum += releaseSqNum; | 43 | totalReleaseSqNum += releaseSqNum; |
| 42 | - } | 44 | + totalReleaseNtfNum += releaseNtyNum; |
| 43 | - } | ||
| 44 | - | ||
| 45 | - if (ntfCnt > totalReleaseNtfNum) { | ||
| 46 | - if (captureMdl->ModelSqOperTryLock()) { | ||
| 47 | - releaseSqNum = 0U; | ||
| 48 | - error = captureMdl->ReleaseNotifyId(releaseSqNum); | ||
| 49 | - captureMdl->ModelSqOperUnLock(); | ||
| 50 | - COND_PROC(error != RT_ERROR_NONE, continue); | ||
| 51 | - totalReleaseNtfNum += releaseSqNum; | ||
| 52 | } | 45 | } |
| 53 | } | 46 | } |
| 54 | } | 47 | } |
| @@ -115,10 +115,6 @@ rtError_t Stream::AllocCaptureTaskWithoutLock(tsTaskType_t taskType, uint32_t sq | |||
| 115 | curCaptureStream->AddCaptureSqeNum(sqeNum); | 115 | curCaptureStream->AddCaptureSqeNum(sqeNum); |
| 116 | (*task)->stream = curCaptureStream; | 116 | (*task)->stream = curCaptureStream; |
| 117 | Runtime::Instance()->AllocTaskSn((*task)->taskSn); // 只有A5用了这个字段,其他形态的分配了不用 | 117 | Runtime::Instance()->AllocTaskSn((*task)->taskSn); // 只有A5用了这个字段,其他形态的分配了不用 |
| 118 | - Model *m = curCaptureStream->Model_(); | ||
| 119 | - if ((m != nullptr) && (m->GetModelType() == RT_MODEL_CAPTURE_MODEL)) { | ||
| 120 | - (*task)->modelSeqId = dynamic_cast<CaptureModel *>(m)->GenerateSeqId(); | ||
| 121 | - } | ||
| 122 | } else { | 118 | } else { |
| 123 | SingleStreamTerminateCapture(); | 119 | SingleStreamTerminateCapture(); |
| 124 | return errCode; | 120 | return errCode; |
| @@ -68,7 +68,7 @@ rtError_t CaptureModel::BuildSqCq(Stream * const exeStream) { UNUSED(exeStream); | |||
| 68 | 68 | ||
| 69 | void CaptureModel::DeconstructSqCq(void) {} | 69 | void CaptureModel::DeconstructSqCq(void) {} |
| 70 | 70 | ||
| 71 | -rtError_t CaptureModel::ReleaseSqCq(uint32_t &releaseNum) { UNUSED(releaseNum); return RT_ERROR_FEATURE_NOT_SUPPORT; } | 71 | +rtError_t CaptureModel::ReleaseSqCqAndNotifyId(uint32_t &releaseSqNum, uint32_t &releaseNtyNum) { UNUSED(releaseSqNum); UNUSED(releaseNtyNum); return RT_ERROR_FEATURE_NOT_SUPPORT; } |
| 72 | 72 | ||
| 73 | void CaptureModel::CaptureModelExecuteFinish(const uint32_t errCode) { UNUSED(errCode); } | 73 | void CaptureModel::CaptureModelExecuteFinish(const uint32_t errCode) { UNUSED(errCode); } |
| 74 | 74 | ||
| @@ -181,9 +181,10 @@ TEST_F(CloudV2CaptureModelTest, PRINT_DFX_INFO) | |||
| 181 | notify.Setup(); | 181 | notify.Setup(); |
| 182 | notify.FreeId(); | 182 | notify.FreeId(); |
| 183 | notify.AllocId(); | 183 | notify.AllocId(); |
| 184 | - uint32_t releaseNum = 0U; | 184 | + uint32_t releaseSqNum = 0U; |
| 185 | + uint32_t releaseNtyNum = 0; | ||
| 185 | captureModel->UpdateNotifyId(stm); | 186 | captureModel->UpdateNotifyId(stm); |
| 186 | - captureModel->ReleaseSqCq(releaseNum); | 187 | + captureModel->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); |
| 187 | 188 | ||
| 188 | captureModel->BuildSqCq(stm); | 189 | captureModel->BuildSqCq(stm); |
| 189 | 190 | ||
| @@ -1069,8 +1070,9 @@ TEST_F(CloudV2CaptureModelTest, capture_mode_api_normal) | |||
| 1069 | 1070 | ||
| 1070 | CaptureModel *captureMdl1 = static_cast<CaptureModel *>(rt_ut::UnwrapOrNull<Model>(model1)); | 1071 | CaptureModel *captureMdl1 = static_cast<CaptureModel *>(rt_ut::UnwrapOrNull<Model>(model1)); |
| 1071 | captureMdl1->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1072 | captureMdl1->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1072 | - uint32_t releaseNum; | 1073 | + uint32_t releaseSqNum = 0U; |
| 1073 | - captureMdl1->ReleaseSqCq(releaseNum); | 1074 | + uint32_t releaseNtyNum = 0; |
| 1075 | + captureMdl1->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1074 | captureMdl1->BuildSqCq(rt_ut::UnwrapOrNull<Stream>(streamExe)); | 1076 | captureMdl1->BuildSqCq(rt_ut::UnwrapOrNull<Stream>(streamExe)); |
| 1075 | 1077 | ||
| 1076 | error = rtModelDestroy(model1); | 1078 | error = rtModelDestroy(model1); |
| @@ -1241,8 +1243,9 @@ TEST_F(CloudV2CondHandleTest, CondHandleWhileE2E) | |||
| 1241 | EXPECT_EQ(ret, RT_ERROR_NONE); | 1243 | EXPECT_EQ(ret, RT_ERROR_NONE); |
| 1242 | 1244 | ||
| 1243 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1245 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1244 | - uint32_t releaseNum; | 1246 | + uint32_t releaseSqNum = 0U; |
| 1245 | - captureMdl->ReleaseSqCq(releaseNum); | 1247 | + uint32_t releaseNtyNum = 0; |
| 1248 | + captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1246 | 1249 | ||
| 1247 | delete rawDrv; | 1250 | delete rawDrv; |
| 1248 | ret = rtModelDestroy(parentModelResult); | 1251 | ret = rtModelDestroy(parentModelResult); |
| @@ -1338,8 +1341,9 @@ TEST_F(CloudV2CondHandleTest, CondHandleWhileWithAssignDefault) | |||
| 1338 | EXPECT_EQ(ret, RT_ERROR_NONE); | 1341 | EXPECT_EQ(ret, RT_ERROR_NONE); |
| 1339 | 1342 | ||
| 1340 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1343 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1341 | - uint32_t releaseNum; | 1344 | + uint32_t releaseSqNum = 0U; |
| 1342 | - captureMdl->ReleaseSqCq(releaseNum); | 1345 | + uint32_t releaseNtyNum = 0; |
| 1346 | + captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1343 | 1347 | ||
| 1344 | delete rawDrv; | 1348 | delete rawDrv; |
| 1345 | ret = rtModelDestroy(parentModelResult); | 1349 | ret = rtModelDestroy(parentModelResult); |
| @@ -1444,8 +1448,9 @@ TEST_F(CloudV2CondHandleTest, CondHandleIfE2E) | |||
| 1444 | EXPECT_EQ(ret, RT_ERROR_NONE); | 1448 | EXPECT_EQ(ret, RT_ERROR_NONE); |
| 1445 | 1449 | ||
| 1446 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1450 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1447 | - uint32_t releaseNum; | 1451 | + uint32_t releaseSqNum = 0U; |
| 1448 | - captureMdl->ReleaseSqCq(releaseNum); | 1452 | + uint32_t releaseNtyNum = 0; |
| 1453 | + captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1449 | 1454 | ||
| 1450 | delete rawDrv; | 1455 | delete rawDrv; |
| 1451 | ret = rtModelDestroy(parentModelResult); | 1456 | ret = rtModelDestroy(parentModelResult); |
| @@ -1542,8 +1547,9 @@ TEST_F(CloudV2CondHandleTest, CondHandleIfSizeOneE2E) | |||
| 1542 | EXPECT_EQ(ret, RT_ERROR_NONE); | 1547 | EXPECT_EQ(ret, RT_ERROR_NONE); |
| 1543 | 1548 | ||
| 1544 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1549 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1545 | - uint32_t releaseNum; | 1550 | + uint32_t releaseSqNum = 0U; |
| 1546 | - captureMdl->ReleaseSqCq(releaseNum); | 1551 | + uint32_t releaseNtyNum = 0; |
| 1552 | + captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1547 | 1553 | ||
| 1548 | delete rawDrv; | 1554 | delete rawDrv; |
| 1549 | ret = rtModelDestroy(parentModelResult); | 1555 | ret = rtModelDestroy(parentModelResult); |
| @@ -1643,8 +1649,9 @@ TEST_F(CloudV2CondHandleTest, CondHandleSwitchE2E) | |||
| 1643 | EXPECT_EQ(ret, RT_ERROR_NONE); | 1649 | EXPECT_EQ(ret, RT_ERROR_NONE); |
| 1644 | 1650 | ||
| 1645 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1651 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1646 | - uint32_t releaseNum; | 1652 | + uint32_t releaseSqNum = 0U; |
| 1647 | - captureMdl->ReleaseSqCq(releaseNum); | 1653 | + uint32_t releaseNtyNum = 0; |
| 1654 | + captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1648 | 1655 | ||
| 1649 | delete rawDrv; | 1656 | delete rawDrv; |
| 1650 | ret = rtModelDestroy(parentModelResult); | 1657 | ret = rtModelDestroy(parentModelResult); |
| @@ -1786,8 +1793,9 @@ MOCKER_CPP_VIRTUAL(rawDrv, &NpuDriver::DevMemFree) | |||
| 1786 | EXPECT_EQ(ret, RT_ERROR_NONE); | 1793 | EXPECT_EQ(ret, RT_ERROR_NONE); |
| 1787 | 1794 | ||
| 1788 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1795 | captureMdl->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1789 | - uint32_t releaseNum; | 1796 | + uint32_t releaseSqNum = 0U; |
| 1790 | - captureMdl->ReleaseSqCq(releaseNum); | 1797 | + uint32_t releaseNtyNum = 0; |
| 1798 | + captureMdl->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1791 | 1799 | ||
| 1792 | delete rawDrv; | 1800 | delete rawDrv; |
| 1793 | ret = rtModelDestroy(parentModelResult); | 1801 | ret = rtModelDestroy(parentModelResult); |
| @@ -1037,6 +1037,7 @@ TEST_F(ApiCloudV2DisableThreadTest, ModelDebugJsonPrint_AicpuTask) | |||
| 1037 | 1037 | ||
| 1038 | // aicpu task; | 1038 | // aicpu task; |
| 1039 | TaskInfo task = {}; | 1039 | TaskInfo task = {}; |
| 1040 | + InitByStream(&task, (rt_ut::UnwrapOrNull<Stream>(stream1))); | ||
| 1040 | task.type = TS_TASK_TYPE_KERNEL_AICPU; | 1041 | task.type = TS_TASK_TYPE_KERNEL_AICPU; |
| 1041 | AicpuTaskInfo *aicpuTask = &(task.u.aicpuTaskInfo); | 1042 | AicpuTaskInfo *aicpuTask = &(task.u.aicpuTaskInfo); |
| 1042 | aicpuTask->kernel = nullptr; | 1043 | aicpuTask->kernel = nullptr; |
| @@ -1710,8 +1710,9 @@ TEST_F(TaskTestDavid, CaptureModeExecute) | |||
| 1710 | 1710 | ||
| 1711 | CaptureModel *captureMdl1 = static_cast<CaptureModel *>(rt_ut::UnwrapOrNull<Model>(model1)); | 1711 | CaptureModel *captureMdl1 = static_cast<CaptureModel *>(rt_ut::UnwrapOrNull<Model>(model1)); |
| 1712 | captureMdl1->CaptureModelExecuteFinish(RT_ERROR_NONE); | 1712 | captureMdl1->CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 1713 | - uint32_t releaseNum; | 1713 | + uint32_t releaseSqNum = 0U; |
| 1714 | - captureMdl1->ReleaseSqCq(releaseNum); | 1714 | + uint32_t releaseNtyNum = 0; |
| 1715 | + captureMdl1->ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum); | ||
| 1715 | captureMdl1->BuildSqCq(rt_ut::UnwrapOrNull<Stream>(streamExe)); | 1716 | captureMdl1->BuildSqCq(rt_ut::UnwrapOrNull<Stream>(streamExe)); |
| 1716 | 1717 | ||
| 1717 | error = rtModelDestroy(model1); | 1718 | error = rtModelDestroy(model1); |
| @@ -1066,6 +1066,7 @@ TEST_F(ApiCloudV2DisableThreadTest, ModelDebugJsonPrint_AicpuTask) | |||
| 1066 | 1066 | ||
| 1067 | // aicpu task; | 1067 | // aicpu task; |
| 1068 | TaskInfo task = {}; | 1068 | TaskInfo task = {}; |
| 1069 | + InitByStream(&task, (rt_ut::UnwrapOrNull<Stream>(stream1))); | ||
| 1069 | task.type = TS_TASK_TYPE_KERNEL_AICPU; | 1070 | task.type = TS_TASK_TYPE_KERNEL_AICPU; |
| 1070 | AicpuTaskInfo *aicpuTask = &(task.u.aicpuTaskInfo); | 1071 | AicpuTaskInfo *aicpuTask = &(task.u.aicpuTaskInfo); |
| 1071 | aicpuTask->kernel = nullptr; | 1072 | aicpuTask->kernel = nullptr; |
| @@ -933,8 +933,9 @@ TEST_F(TinyStubTest, capture_model_sqcq_stub) | |||
| 933 | CaptureModel captureModel(RT_MODEL_NORMAL); | 933 | CaptureModel captureModel(RT_MODEL_NORMAL); |
| 934 | EXPECT_EQ(captureModel.BuildSqCq(nullptr), RT_ERROR_FEATURE_NOT_SUPPORT); | 934 | EXPECT_EQ(captureModel.BuildSqCq(nullptr), RT_ERROR_FEATURE_NOT_SUPPORT); |
| 935 | captureModel.DeconstructSqCq(); | 935 | captureModel.DeconstructSqCq(); |
| 936 | - uint32_t releaseNum = 0; | 936 | + uint32_t releaseSqNum = 0; |
| 937 | - EXPECT_EQ(captureModel.ReleaseSqCq(releaseNum), RT_ERROR_FEATURE_NOT_SUPPORT); | 937 | + uint32_t releaseNtyNum = 0; |
| 938 | + EXPECT_EQ(captureModel.ReleaseSqCqAndNotifyId(releaseSqNum, releaseNtyNum), RT_ERROR_FEATURE_NOT_SUPPORT); | ||
| 938 | captureModel.CaptureModelExecuteFinish(RT_ERROR_NONE); | 939 | captureModel.CaptureModelExecuteFinish(RT_ERROR_NONE); |
| 939 | EXPECT_EQ(captureModel.MarkStreamActiveTask(nullptr), RT_ERROR_FEATURE_NOT_SUPPORT); | 940 | EXPECT_EQ(captureModel.MarkStreamActiveTask(nullptr), RT_ERROR_FEATURE_NOT_SUPPORT); |
| 940 | EXPECT_EQ(captureModel.RestoreForSoftwareSq(nullptr), RT_ERROR_FEATURE_NOT_SUPPORT); | 941 | EXPECT_EQ(captureModel.RestoreForSoftwareSq(nullptr), RT_ERROR_FEATURE_NOT_SUPPORT); |
🟡 Medium Priority
变更行:
capture_model.cc第 698-702 行(ReleaseSqCqAndNotifyId的提前返回条件)。受影响的合约/行为:旧代码中
ReleaseSqCq与ReleaseNotifyId是两次独立调用,各自有独立的执行条件。新代码将二者合并为ReleaseSqCqAndNotifyId,但在sqCqNum_ == 0U时直接return RT_ERROR_NONE,此时 Notify 释放代码(第 724 行的(void)ReleaseNotifyId(releaseNtyNum))被跳过。失败模式:
TryRecycleCaptureModelResource首次调用时,ReleaseSqCqAndNotifyId成功释放 SQ(sqCqNum_变为 0),但ReleaseNotifyId内部的Notify::FreeId()失败 →releaseNtyNum保持为 0。TryRecycleCaptureModelResource需要释放 Notify 时,进入同一 model,但sqCqNum_ == 0U触发提前返回,Notify 永远不会被释放。DeconstructSqCq和Update两个调用点。建议:修改
ReleaseSqCqAndNotifyId的早期返回逻辑:即使在sqCqNum_ == 0U时,也应尝试释放 Notify(ReleaseNotifyId自身有refCount_ == 0U保护,不会误释放)。可将第 698-702 行改为仅当refCount_ != 0U时提前返回;当仅sqCqNum_ == 0U时,仍调用(void)ReleaseNotifyId(releaseNtyNum)后再返回。