feat 优化edge和blob耗时

dev_lsy
liusiyang 7 days ago
parent 226a1ad2af
commit acb5a9d872

@ -12,6 +12,7 @@
#include <vector>
#include <thread>
#include <mutex>
#include <atomic>
#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<int> m_nLast_GPUStreamIdx;
};
#endif

@ -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<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 ");
std::lock_guard<std::mutex> 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<Det_GPU_Stram> &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<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 ");
std::lock_guard<std::mutex> lock(pdetStream->AI_mutex);
// 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.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;

@ -450,7 +450,8 @@ int ALLImgCheckAnalysisy::InitData()
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)
{

@ -10,6 +10,7 @@
#include "ImgCheckAnalysisy.hpp"
#include "CheckUtil.hpp"
#include "Define.h"
#include <atomic>
CameraCheckAnalysisy::CameraCheckAnalysisy()
{
@ -675,10 +676,18 @@ int CameraCheckAnalysisy::InitRun()
int CameraCheckAnalysisy::InitCheckAnalysisy()
{
int re = 0;
// 全局递增的 CPU 核偏移:
static std::atomic<int> 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);

@ -371,28 +371,20 @@ int deal::preCheck()
setReadThreadStart();
// 遍历所有图片 开始读图处理
AllImgNum = 0;
// 每张图对应一个通道,独立读入送检;多张图(多通道)分别处理,不能合并为 AB 双相机
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)
{
std::shared_ptr<JC_IMAGE_INFO_> tem = std::make_shared<JC_IMAGE_INFO_>();
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;
}
}
InsertReadImgInfo(tem);
AllImgNum++;
// break;
}
}
// AllImgNum = 1;
{
@ -1023,14 +1015,18 @@ int deal::SendImgToCheck(std::shared_ptr<JC_IMAGE_INFO_> pDetImageInfo, IN_IMG_S
return -1;
}
if (status == IN_IMG_Status_End)
{
// 一张图上下拆分成两个产品_0 上半、_1 下半),给两个产品分别发送结束标志
for (int pi = 0; pi < 2; pi++)
{
std::shared_ptr<shareImage> tem = std::make_shared<shareImage>();
tem->strImgProductID = pDetImageInfo->strProductID;
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<JC_IMAGE_INFO_> 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);

Loading…
Cancel
Save