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 33fb10f..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() @@ -492,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); @@ -521,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 bcb46a8..8c057dc 100644 --- a/AIEngineModule/src/AI_Factory.cpp +++ b/AIEngineModule/src/AI_Factory.cpp @@ -45,7 +45,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig) edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/DefectLight.engine"; edge_config.strName = "Defect"; edge_config.inputType = AIModel_Base::Input_CHW; - edge_config.Stream_num = 2; + edge_config.Stream_num = 4; Defect->Init(edge_config); } if (!Class) @@ -67,7 +67,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig) edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/BadLabel.engine"; edge_config.strName = "Tag_Loc"; edge_config.inputType = AIModel_Base::Input_CHW; - edge_config.Stream_num = 2; + edge_config.Stream_num = 4; Tag_Loc->Init(edge_config); } if (!Align_Outer) @@ -78,6 +78,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig) edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/ProductLoc.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) @@ -88,6 +89,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig) edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/ClampLoc.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/ALLImgCheckAnalysisy.cpp b/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp index 151daae..5b1d34d 100644 --- a/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp @@ -450,7 +450,8 @@ int ALLImgCheckAnalysisy::InitData() int ALLImgCheckAnalysisy::Det_Product(std::shared_ptr &product) { - + string cur_time_s = CheckUtil::getCurTimeHMS(); + printf("[%s]>>>>>>>>>>>>>>>Det_Product****************det Start************\n", cur_time_s.c_str()); // 处理每个相机 while (true) { diff --git a/AlgorithmModule/src/CameraCheckAnalysisy.cpp b/AlgorithmModule/src/CameraCheckAnalysisy.cpp index 9653f72..131cebd 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() { @@ -675,10 +676,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/example/deal.cpp b/example/deal.cpp index e5ca67d..abaabc5 100644 --- a/example/deal.cpp +++ b/example/deal.cpp @@ -371,28 +371,20 @@ int deal::preCheck() setReadThreadStart(); // 遍历所有图片 开始读图处理 AllImgNum = 0; + // 每张图对应一个通道,独立读入送检;多张图(多通道)分别处理,不能合并为 AB 双相机 for (const auto pcam : product->camera_list) { - std::shared_ptr tem = std::make_shared(); - tem->strCamID = pcam->strCamName; for (const auto pimage : pcam->image_list) { + std::shared_ptr tem = std::make_shared(); + tem->strCamID = pcam->strCamName; tem->strchannelName = pimage->strchannelName; tem->strName = pimage->strName; tem->strProductID = pimage->strProductID; - - if (tem->strPath == "") - { - tem->strPath = pimage->strPath; - } - else - { - tem->strPath_B = pimage->strPath; - } + tem->strPath = pimage->strPath; + InsertReadImgInfo(tem); + AllImgNum++; } - InsertReadImgInfo(tem); - AllImgNum++; - // break; } // AllImgNum = 1; { @@ -1024,12 +1016,16 @@ int deal::SendImgToCheck(std::shared_ptr pDetImageInfo, IN_IMG_S } if (status == IN_IMG_Status_End) { - std::shared_ptr tem = std::make_shared(); - tem->strImgProductID = pDetImageInfo->strProductID; - tem->Status = -1; - if (m_pALLImgCheckAnalysisy) + // 一张图上下拆分成两个产品(_0 上半、_1 下半),给两个产品分别发送结束标志 + for (int pi = 0; pi < 2; pi++) { - m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(tem); + std::shared_ptr tem = std::make_shared(); + tem->strImgProductID = pDetImageInfo->strProductID + "_" + std::to_string(pi); + tem->Status = -1; + if (m_pALLImgCheckAnalysisy) + { + m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(tem); + } } return 0; } @@ -1100,7 +1096,8 @@ int deal::SendImgToCheck(std::shared_ptr pDetImageInfo, IN_IMG_S *sub = *tem; sub->img = splitList[i]; sub->strImgProductID = tem->strImgProductID + "_" + std::to_string(i); - sub->Status = IN_IMG_Status_OneImg; + // 同一产品(上半/下半)可能包含多个通道的图,子图作为中间图,待所有通道送完后再统一发送结束标志 + sub->Status = IN_IMG_Status_Other; if (m_pALLImgCheckAnalysisy) { re = m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(sub);