feat 优化edge和blob耗时

dev_lsy
liusiyang 7 days ago
parent 226a1ad2af
commit acb5a9d872

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include <thread> #include <thread>
#include <mutex> #include <mutex>
#include <atomic>
#include "NvInfer.h" #include "NvInfer.h"
#include "cuda_runtime_api.h" #include "cuda_runtime_api.h"
#include "AI_Factory.h" #include "AI_Factory.h"
@ -213,8 +214,8 @@ private:
int m_nALLStreamNum; int m_nALLStreamNum;
private: private:
// 上次使用的GPU stream Idx; // 上次使用的GPU stream Idx(多线程并发调用,需原子自增避免竞争);
int m_nLast_GPUStreamIdx; std::atomic<int> m_nLast_GPUStreamIdx;
}; };
#endif #endif

@ -20,7 +20,7 @@ AIModel_Impl::AIModel_Impl()
m_pNode_output_1 = NULL; m_pNode_output_1 = NULL;
m_pNode_output_2 = NULL; m_pNode_output_2 = NULL;
m_DetGPUStream.clear(); m_DetGPUStream.clear();
m_nLast_GPUStreamIdx = 0; m_nLast_GPUStreamIdx.store(0);
m_nALLStreamNum = 0; m_nALLStreamNum = 0;
} }
AIModel_Impl::~AIModel_Impl() 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 "); // printf("=== s1 ");
std::shared_ptr<Det_GPU_Stram> pdetStream; std::shared_ptr<Det_GPU_Stram> pdetStream;
GetStream(pdetStream); if (GetStream(pdetStream) != 0 || !pdetStream)
{
printf("AI_Det_In_1_Out_1: GetStream error \n");
return 3;
}
// printf("=== s2 "); // printf("=== s2 ");
std::lock_guard<std::mutex> lock(pdetStream->AI_mutex); std::lock_guard<std::mutex> lock(pdetStream->AI_mutex);
// printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx); // 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<Det_GPU_Stram> &pdetStream) int AIModel_Impl::GetStream(std::shared_ptr<Det_GPU_Stram> &pdetStream)
{ {
int sidx = m_nLast_GPUStreamIdx; if (m_nALLStreamNum <= 0 || m_DetGPUStream.empty())
{
return 1;
}
sidx++; // 多线程并发时原子轮询分配 stream
if (sidx >= m_nALLStreamNum) 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; return 0;
} }
int AIModel_Impl::AI_Det_In_1_Out_1_class(unsigned char *p_indata_0, float *fmaxScore) int AIModel_Impl::AI_Det_In_1_Out_1_class(unsigned char *p_indata_0, float *fmaxScore)
{ {
std::shared_ptr<Det_GPU_Stram> pdetStream; std::shared_ptr<Det_GPU_Stram> 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 "); // printf("=== s2 ");
std::lock_guard<std::mutex> lock(pdetStream->AI_mutex); std::lock_guard<std::mutex> lock(pdetStream->AI_mutex);
// printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx); // printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx);

@ -45,7 +45,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig)
edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/DefectLight.engine"; edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/DefectLight.engine";
edge_config.strName = "Defect"; edge_config.strName = "Defect";
edge_config.inputType = AIModel_Base::Input_CHW; edge_config.inputType = AIModel_Base::Input_CHW;
edge_config.Stream_num = 2; edge_config.Stream_num = 4;
Defect->Init(edge_config); Defect->Init(edge_config);
} }
if (!Class) 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.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/BadLabel.engine";
edge_config.strName = "Tag_Loc"; edge_config.strName = "Tag_Loc";
edge_config.inputType = AIModel_Base::Input_CHW; edge_config.inputType = AIModel_Base::Input_CHW;
edge_config.Stream_num = 2; edge_config.Stream_num = 4;
Tag_Loc->Init(edge_config); Tag_Loc->Init(edge_config);
} }
if (!Align_Outer) 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.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/ProductLoc.engine";
edge_config.strName = "Align_Outer"; edge_config.strName = "Align_Outer";
edge_config.inputType = AIModel_Base::Input_CHW; edge_config.inputType = AIModel_Base::Input_CHW;
edge_config.Stream_num = 2;
Align_Outer->Init(edge_config); Align_Outer->Init(edge_config);
} }
if (!Align_Inner) 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.strPath = "/home/aidlux/BOE/UseModel_ZB/BM/ClampLoc.engine";
edge_config.strName = "Align_Inner"; edge_config.strName = "Align_Inner";
edge_config.inputType = AIModel_Base::Input_CHW; edge_config.inputType = AIModel_Base::Input_CHW;
edge_config.Stream_num = 2;
Align_Inner->Init(edge_config); Align_Inner->Init(edge_config);
} }
m_bInitSucc = true; m_bInitSucc = true;

@ -450,7 +450,8 @@ int ALLImgCheckAnalysisy::InitData()
int ALLImgCheckAnalysisy::Det_Product(std::shared_ptr<Product> &product) int ALLImgCheckAnalysisy::Det_Product(std::shared_ptr<Product> &product)
{ {
string cur_time_s = CheckUtil::getCurTimeHMS();
printf("[%s]>>>>>>>>>>>>>>>Det_Product****************det Start************\n", cur_time_s.c_str());
// 处理每个相机 // 处理每个相机
while (true) while (true)
{ {

@ -10,6 +10,7 @@
#include "ImgCheckAnalysisy.hpp" #include "ImgCheckAnalysisy.hpp"
#include "CheckUtil.hpp" #include "CheckUtil.hpp"
#include "Define.h" #include "Define.h"
#include <atomic>
CameraCheckAnalysisy::CameraCheckAnalysisy() CameraCheckAnalysisy::CameraCheckAnalysisy()
{ {
@ -675,10 +676,18 @@ int CameraCheckAnalysisy::InitRun()
int CameraCheckAnalysisy::InitCheckAnalysisy() int CameraCheckAnalysisy::InitCheckAnalysisy()
{ {
int re = 0; int re = 0;
// 全局递增的 CPU 核偏移:
static std::atomic<int> s_cpuOffset{0};
for (int i = 0; i < IMGCHECKANALYSISY_NUM; i++) for (int i = 0; i < IMGCHECKANALYSISY_NUM; i++)
{ {
RunInfoST RunConfig; RunInfoST RunConfig;
RunConfig.nThreadIdx = i; 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(); m_pImgCheckAnalysisy[i] = ImgCheckBase::GetInstance();
re = m_pImgCheckAnalysisy[i]->UpdateConfig((void *)&RunConfig, CHECK_CONFIG_Run); re = m_pImgCheckAnalysisy[i]->UpdateConfig((void *)&RunConfig, CHECK_CONFIG_Run);

@ -371,28 +371,20 @@ int deal::preCheck()
setReadThreadStart(); setReadThreadStart();
// 遍历所有图片 开始读图处理 // 遍历所有图片 开始读图处理
AllImgNum = 0; AllImgNum = 0;
// 每张图对应一个通道,独立读入送检;多张图(多通道)分别处理,不能合并为 AB 双相机
for (const auto pcam : product->camera_list) for (const auto pcam : product->camera_list)
{ {
std::shared_ptr<JC_IMAGE_INFO_> tem = std::make_shared<JC_IMAGE_INFO_>();
tem->strCamID = pcam->strCamName;
for (const auto pimage : pcam->image_list) for (const auto pimage : pcam->image_list)
{ {
std::shared_ptr<JC_IMAGE_INFO_> tem = std::make_shared<JC_IMAGE_INFO_>();
tem->strCamID = pcam->strCamName;
tem->strchannelName = pimage->strchannelName; tem->strchannelName = pimage->strchannelName;
tem->strName = pimage->strName; tem->strName = pimage->strName;
tem->strProductID = pimage->strProductID; tem->strProductID = pimage->strProductID;
tem->strPath = pimage->strPath;
if (tem->strPath == "") InsertReadImgInfo(tem);
{ AllImgNum++;
tem->strPath = pimage->strPath;
}
else
{
tem->strPath_B = pimage->strPath;
}
} }
InsertReadImgInfo(tem);
AllImgNum++;
// break;
} }
// AllImgNum = 1; // AllImgNum = 1;
{ {
@ -1024,12 +1016,16 @@ int deal::SendImgToCheck(std::shared_ptr<JC_IMAGE_INFO_> pDetImageInfo, IN_IMG_S
} }
if (status == IN_IMG_Status_End) if (status == IN_IMG_Status_End)
{ {
std::shared_ptr<shareImage> tem = std::make_shared<shareImage>(); // 一张图上下拆分成两个产品_0 上半、_1 下半),给两个产品分别发送结束标志
tem->strImgProductID = pDetImageInfo->strProductID; for (int pi = 0; pi < 2; pi++)
tem->Status = -1;
if (m_pALLImgCheckAnalysisy)
{ {
m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(tem); std::shared_ptr<shareImage> tem = std::make_shared<shareImage>();
tem->strImgProductID = pDetImageInfo->strProductID + "_" + std::to_string(pi);
tem->Status = -1;
if (m_pALLImgCheckAnalysisy)
{
m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(tem);
}
} }
return 0; return 0;
} }
@ -1100,7 +1096,8 @@ int deal::SendImgToCheck(std::shared_ptr<JC_IMAGE_INFO_> pDetImageInfo, IN_IMG_S
*sub = *tem; *sub = *tem;
sub->img = splitList[i]; sub->img = splitList[i];
sub->strImgProductID = tem->strImgProductID + "_" + std::to_string(i); sub->strImgProductID = tem->strImgProductID + "_" + std::to_string(i);
sub->Status = IN_IMG_Status_OneImg; // 同一产品(上半/下半)可能包含多个通道的图,子图作为中间图,待所有通道送完后再统一发送结束标志
sub->Status = IN_IMG_Status_Other;
if (m_pALLImgCheckAnalysisy) if (m_pALLImgCheckAnalysisy)
{ {
re = m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(sub); re = m_pALLImgCheckAnalysisy->SetDataRun_SharePtr(sub);

Loading…
Cancel
Save