From 6c7f967160711af41c0fed527d9097bc6348fb95 Mon Sep 17 00:00:00 2001 From: sunwen Date: Mon, 3 Jul 2023 17:12:53 +0800 Subject: [PATCH] Fix the memory overflow caused by modifying the filter parameter. --- .../detection/getTransmissionData.cpp | 128 +++++++++++++----- 1 file changed, 92 insertions(+), 36 deletions(-) diff --git a/src/transmissionReconstruction/detection/getTransmissionData.cpp b/src/transmissionReconstruction/detection/getTransmissionData.cpp index 6f6a7e7..a0838cf 100644 --- a/src/transmissionReconstruction/detection/getTransmissionData.cpp +++ b/src/transmissionReconstruction/detection/getTransmissionData.cpp @@ -19,10 +19,13 @@ #include #include -#include "MatlabReader.h" #include #include -#include +#include +#include +#include +#include +#include using namespace Recon; using namespace Aurora; @@ -45,6 +48,15 @@ namespace Matrix waterTempRefBlock; }; + std::map BLOCK_OF_TRANSIMISSIONDARA_BUFFER; + std::mutex CREATE_BUFFER_MUTEX; + std::condition_variable CREATE_BUFFER_CONDITION; + + std::mutex PROCESS_BUFFER_MUTEX; + std::condition_variable PROCESS_BUFFER_CONDITION; + int BUFFER_COUNT = 0; + int BUFFER_SIZE = 3; + Matrix prepareAScansForTransmissionDetection(const Matrix& aAscanBlock, const Matrix& aGainBlock) { Matrix result = aAscanBlock / repmat(aGainBlock, aAscanBlock.getDimSize(0), 1); @@ -192,6 +204,58 @@ namespace } +void getBlockOfTransmissionDataInThread(size_t aIndex, const Matrix& aMp, const Matrix& aMpRef, const Matrix& aSl, const Matrix& aSn, const Matrix& aRlList, const Matrix& aRnList, + const TasTemps& aTasTemps, const Matrix& aExpectedSOSWater, GeometryInfo aGeom, GeometryInfo aGeomRef, + const Matrix& aSnrRmsNoise, const Matrix& aSnrRmsNoiseRef, const MeasurementInfo& aExpInfo, const MeasurementInfo& aExpInfoRef, + const PreComputes& aPreComputes, Parser* aParser, Parser* aParserRef) +{ + auto buffer = getBlockOfTransmissionData(aMp, aMpRef, aSl, aSn, aRlList, aRnList, aTasTemps, + aExpectedSOSWater, aGeom, aGeomRef, aSnrRmsNoise, aSnrRmsNoiseRef, + aExpInfo, aExpInfoRef, aPreComputes, aParser, aParserRef); + std::unique_lock lock(CREATE_BUFFER_MUTEX); + BLOCK_OF_TRANSIMISSIONDARA_BUFFER[std::to_string(aIndex)] = buffer; + std::cout<<"Add: "< lock(CREATE_BUFFER_MUTEX); + CREATE_BUFFER_CONDITION.wait(lock, []{return BUFFER_COUNT blockOfTransmissionDatas(vectorSize); - + std::thread speedUpThread = std::thread(createThreadForGetBlockOfTransmissionData,aMotorPos,aMotoPosRef,aSlList,aSnList,aRlList,aRnList,tasTemps,aTemp.expectedSOSWater,aGeom,aGeomRef,rmsNoise,rmsNoiseRef,aExpInfo,aExpInfoRef,aPreComputes,aParser, aParserRef); int numData = 0; int numPossibleScans = 0; - - for(int i=0; i lock(PROCESS_BUFFER_MUTEX); - DetectResult detect = transmissionDetection( blockOfTransmissionDatas[index].ascanBlock, blockOfTransmissionDatas[index].ascanBlockRef, - blockOfTransmissionDatas[index].dists, blockOfTransmissionDatas[index].distRefBlock, - blockOfTransmissionDatas[index].waterTempBlock, blockOfTransmissionDatas[index].waterTempRefBlock, + PROCESS_BUFFER_CONDITION.wait(lock, [index]{return BLOCK_OF_TRANSIMISSIONDARA_BUFFER.find(std::to_string(index)) != BLOCK_OF_TRANSIMISSIONDARA_BUFFER.end();}); + lock.unlock(); + + auto blockData = BLOCK_OF_TRANSIMISSIONDARA_BUFFER[std::to_string(index)]; + DetectResult detect = transmissionDetection( blockData.ascanBlock, blockData.ascanBlockRef, + blockData.dists, blockData.distRefBlock, + blockData.waterTempBlock, blockData.waterTempRefBlock, aTemp.expectedSOSWater[0]); - blockOfTransmissionDatas[index].attData = detect.att; - blockOfTransmissionDatas[index].tofData = detect.tof; - BlockOfTransmissionData transmissionBlock=blockOfTransmissionDatas[index]; + blockData.attData = detect.att; + blockData.tofData = detect.tof; + BlockOfTransmissionData transmissionBlock=blockData; size_t numUsedData = transmissionBlock.senderBlock.getDimSize(1); if(transParams::applyCalib) { @@ -314,9 +363,16 @@ TransmissionData Recon::getTransmissionData(const Aurora::Matrix& aMotorPos, con cblas_dcopy(numUsedData, transmissionBlock.metaInfos.rnBlock.getData(), 1, rnBlockTotal.getData() + numData, 1); } numData += numUsedData; + std::unique_lock lockBufferCount(CREATE_BUFFER_MUTEX); + BLOCK_OF_TRANSIMISSIONDARA_BUFFER.erase(std::to_string(index)); + --BUFFER_COUNT; + lockBufferCount.unlock(); + std::cout<<"Remove: "<