diff --git a/AIEngineModule/include/AIModel_Impl.h b/AIEngineModule/include/AIModel_Impl.h index ab4c872..03e38d8 100644 --- a/AIEngineModule/include/AIModel_Impl.h +++ b/AIEngineModule/include/AIModel_Impl.h @@ -12,6 +12,7 @@ #include #include #include +#include #include "NvInfer.h" #include "cuda_runtime_api.h" #include "AI_Factory.h" @@ -213,8 +214,8 @@ private: int m_nALLStreamNum; private: - // 上次使用的GPU stream Idx; - int m_nLast_GPUStreamIdx; + // 上次使用的GPU stream Idx(多线程并发调用,需原子自增避免竞争); + std::atomic m_nLast_GPUStreamIdx; }; #endif \ No newline at end of file diff --git a/AIEngineModule/src/AIModel_Impl.cpp b/AIEngineModule/src/AIModel_Impl.cpp index f90c263..4c07740 100644 --- a/AIEngineModule/src/AIModel_Impl.cpp +++ b/AIEngineModule/src/AIModel_Impl.cpp @@ -20,7 +20,7 @@ AIModel_Impl::AIModel_Impl() m_pNode_output_1 = NULL; m_pNode_output_2 = NULL; m_DetGPUStream.clear(); - m_nLast_GPUStreamIdx = 0; + m_nLast_GPUStreamIdx.store(0); m_nALLStreamNum = 0; } AIModel_Impl::~AIModel_Impl() @@ -169,6 +169,19 @@ int AIModel_Impl::Init(AIModelRun_Config config) } m_bInitSuccess = true; + + // warm-up:首次推理会触发 TensorRT/CUDA 懒初始化(kernel 加载、workspace 分配、首次 enqueueV3 建图等), + // 提前用一张空图预热,避免首张检测图耗时飙升。 + { + cv::Mat warmIn = InitMat(m_pNode_input_0->channel, m_pNode_input_0->width, m_pNode_input_0->height); + cv::Mat warmOut; + int warmRe = AIDet(warmIn, warmOut); + if (warmRe != 0) + { + printf("%s warm-up error = %d\n", m_modelRun_Config.strName.c_str(), warmRe); + } + } + return 0; } cv::Mat AIModel_Impl::InitMat(int channel, int w, int h) @@ -479,7 +492,11 @@ int AIModel_Impl::AI_Det_In_1_Out_1(Node_Config *pConfig_in, Node_Config *pConfi { // printf("=== s1 "); std::shared_ptr pdetStream; - GetStream(pdetStream); + if (GetStream(pdetStream) != 0 || !pdetStream) + { + printf("AI_Det_In_1_Out_1: GetStream error \n"); + return 3; + } // printf("=== s2 "); std::lock_guard lock(pdetStream->AI_mutex); // printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx); @@ -508,22 +525,40 @@ int AIModel_Impl::AI_Det_In_1_Out_1(Node_Config *pConfig_in, Node_Config *pConfi int AIModel_Impl::GetStream(std::shared_ptr &pdetStream) { - int sidx = m_nLast_GPUStreamIdx; + if (m_nALLStreamNum <= 0 || m_DetGPUStream.empty()) + { + return 1; + } - sidx++; - if (sidx >= m_nALLStreamNum) + // 多线程并发时原子轮询分配 stream: + int sidx = m_nLast_GPUStreamIdx.load(); + while (true) { - sidx = 0; + int next = sidx + 1; + if (next >= m_nALLStreamNum) + { + next = 0; + } + if (m_nLast_GPUStreamIdx.compare_exchange_weak(sidx, next)) + { + sidx = next; + break; + } + // CAS 失败时 sidx 已被更新为当前实际值,重新计算 next } - pdetStream = m_DetGPUStream.at(sidx); - m_nLast_GPUStreamIdx = sidx; + pdetStream = m_DetGPUStream.at(sidx); return 0; } int AIModel_Impl::AI_Det_In_1_Out_1_class(unsigned char *p_indata_0, float *fmaxScore) { std::shared_ptr pdetStream; - GetStream(pdetStream); + if (GetStream(pdetStream) != 0 || !pdetStream) + { + printf("AI_Det_In_1_Out_1_class: GetStream error \n"); + *fmaxScore = 0.0f; + return -3; + } // printf("=== s2 "); std::lock_guard lock(pdetStream->AI_mutex); // printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx); diff --git a/AIEngineModule/src/AI_Factory.cpp b/AIEngineModule/src/AI_Factory.cpp index 5f27557..4fd79c7 100644 --- a/AIEngineModule/src/AI_Factory.cpp +++ b/AIEngineModule/src/AI_Factory.cpp @@ -89,6 +89,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig) edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/KK/AlignOuter.engine"; edge_config.strName = "Align_Outer"; edge_config.inputType = AIModel_Base::Input_CHW; + edge_config.Stream_num = 2; Align_Outer->Init(edge_config); } if (!Align_Inner) @@ -99,6 +100,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig) edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/KK/AlignInner.engine"; edge_config.strName = "Align_Inner"; edge_config.inputType = AIModel_Base::Input_CHW; + edge_config.Stream_num = 2; Align_Inner->Init(edge_config); } m_bInitSucc = true; diff --git a/AlgorithmModule/src/CameraCheckAnalysisy.cpp b/AlgorithmModule/src/CameraCheckAnalysisy.cpp index bca4451..31427c1 100644 --- a/AlgorithmModule/src/CameraCheckAnalysisy.cpp +++ b/AlgorithmModule/src/CameraCheckAnalysisy.cpp @@ -10,6 +10,7 @@ #include "ImgCheckAnalysisy.hpp" #include "CheckUtil.hpp" #include "Define.h" +#include CameraCheckAnalysisy::CameraCheckAnalysisy() { @@ -676,10 +677,18 @@ int CameraCheckAnalysisy::InitRun() int CameraCheckAnalysisy::InitCheckAnalysisy() { int re = 0; + // 全局递增的 CPU 核偏移: + static std::atomic s_cpuOffset{0}; for (int i = 0; i < IMGCHECKANALYSISY_NUM; i++) { RunInfoST RunConfig; RunConfig.nThreadIdx = i; + { + int range = (m_RunConfig.nCpu_num > 0) ? m_RunConfig.nCpu_num : 1; + int offset = s_cpuOffset.fetch_add(1) % range; + RunConfig.nCpu_start_Idx = m_RunConfig.nCpu_start_Idx + offset; + } + RunConfig.nCpu_num = 1; m_pImgCheckAnalysisy[i] = ImgCheckBase::GetInstance(); re = m_pImgCheckAnalysisy[i]->UpdateConfig((void *)&RunConfig, CHECK_CONFIG_Run); diff --git a/AlgorithmModule/src/ImageResultJudge.cpp b/AlgorithmModule/src/ImageResultJudge.cpp index 92e5bc5..a3df8f2 100644 --- a/AlgorithmModule/src/ImageResultJudge.cpp +++ b/AlgorithmModule/src/ImageResultJudge.cpp @@ -559,9 +559,7 @@ int ImageResultJudge::ResultJudge(std::shared_ptr pImageResult) GetAIDetImg(pImageResult, pCenter, tem.AI_in_Img, tem.AI_out_img); m_CheckResult_shareP->qxImageResult.push_back(tem); - pQxLog->bPrintStr = true; pQxLog->AddCheckstr(PrintLevel_4, DET_LOG_LEVEL_3, " result ", " ---name: %s ---code: %s ---srcImgroi.x: %d ---srcImgroi.y: %d\n", tem.strTypeName.c_str(), tem.qx_Code.c_str(), tem.srcImgroi.x, tem.srcImgroi.y); - pQxLog->bPrintStr = false; } else { diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index a246056..0d0ef8d 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -427,7 +427,7 @@ int ImgCheckAnalysisy::CheckRun() { m_pdetlog->bPrintStr = true; } - m_pdetlog->bPrintStr = true; + // m_pdetlog->bPrintStr = true; m_pdetlog->AddCheckstr(PrintLevel_0, "1、basic Info", "---------------------------1、basic Info---------------------------------"); m_pdetlog->AddCheckstr(PrintLevel_0, "Version", "%s", GetVersion().c_str());