From 62f50091a419b1bb2922efdd3b4e126a4441068e Mon Sep 17 00:00:00 2001 From: sunwen Date: Fri, 23 Feb 2024 17:10:10 +0800 Subject: [PATCH] MatlabCreator speed up. --- src/MatLab/MatlabCreatorPrivate.cpp | 80 ++++++++++++++++++++++++----- src/MatLab/MatlabCreatorPrivate.h | 1 + 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/src/MatLab/MatlabCreatorPrivate.cpp b/src/MatLab/MatlabCreatorPrivate.cpp index e5caf56..1ccd250 100644 --- a/src/MatLab/MatlabCreatorPrivate.cpp +++ b/src/MatLab/MatlabCreatorPrivate.cpp @@ -22,14 +22,27 @@ #include "Parser.h" #include +#include #include #include +#include +struct CreateMatSturct +{ + std::shared_ptr mParser; + std::string mFileName; + std::shared_ptr mAScanData; + std::shared_ptr mAmplificationData; +}; namespace { double progress = 0; + std::queue PRODUCER_DATAS; + std::mutex PRODUCER_MUTEX; + std::condition_variable PRODUCER_CONDITION; + std::string getTasFolderName(unsigned short aNum) { if (aNum < 10) @@ -143,6 +156,48 @@ bool MatlabCreatorPrivate::createKITMat(const std::string& aOutputPath) } void MatlabCreatorPrivate::createKITMatInThread(std::shared_ptr aParser, unsigned short aStartTasNum,unsigned short aTasCount, const std::string& aOutputPath) +{ + std::thread producerThread = std::thread(&MatlabCreatorPrivate::producerThreadFunction, this, aParser, aStartTasNum, aTasCount, aOutputPath); + ShotList* shotList = aParser->getShotList().get(); + for(unsigned short t=aStartTasNum;tgetMotorPositionSize();++m) + { + for(unsigned short e=0;egetElementSize();++e) + { + std::unique_lock lock(PRODUCER_MUTEX); + PRODUCER_CONDITION.wait(lock, []{return !PRODUCER_DATAS.empty();}); + std::shared_ptr parser = PRODUCER_DATAS.front().mParser; + std::string fileName = PRODUCER_DATAS.front().mFileName; + std::shared_ptr ascanData = PRODUCER_DATAS.front().mAScanData; + std::shared_ptr amplificationData = PRODUCER_DATAS.front().mAmplificationData; + PRODUCER_DATAS.pop(); + lock.unlock(); + createEmitterMat(parser,fileName,ascanData,amplificationData); + } + } + //CEMeasure + if(shotList->hasCEMeasured()) + { + std::unique_lock lock(PRODUCER_MUTEX); + PRODUCER_CONDITION.wait(lock, []{return !PRODUCER_DATAS.empty();}); + std::shared_ptr parser = PRODUCER_DATAS.front().mParser; + std::string fileName = PRODUCER_DATAS.front().mFileName; + std::shared_ptr ascanData = PRODUCER_DATAS.front().mAScanData; + std::shared_ptr amplificationData = PRODUCER_DATAS.front().mAmplificationData; + PRODUCER_DATAS.pop(); + lock.unlock(); + createEmitterMat(parser,fileName,ascanData,amplificationData); + } + ++progress; + std::cout<<"\r\033[K"< aParser, unsigned short aStartTasNum,unsigned short aTasCount, const std::string& aOutputPath) { std::string dirPath = aOutputPath; DirHelper dir; @@ -170,7 +225,11 @@ void MatlabCreatorPrivate::createKITMatInThread(std::shared_ptr aParser, std::shared_ptr amplificationData = std::shared_ptr(new double[aParser->getDataLength()*RECEIVE_ELEMENT_COUNT],std::default_delete()); getAScanOfMPAndAmplification(aParser,shotList,oneTasAscan,ascanData,amplificationData,element,MotorPosition(shotList->getMotorPositionValue(m))); std::string fileName = motorpositionFolder + SLASH_CHAR + getMatFileName(element); - createEmitterMat(aParser,fileName,ascanData,amplificationData); + std::unique_lock lock(PRODUCER_MUTEX); + PRODUCER_DATAS.push({aParser,fileName,ascanData,amplificationData}); + lock.unlock(); + PRODUCER_CONDITION.notify_one(); + //createEmitterMat(aParser,fileName,ascanData,amplificationData); } } //CEMeasure @@ -186,11 +245,12 @@ void MatlabCreatorPrivate::createKITMatInThread(std::shared_ptr aParser, std::shared_ptr amplificationData = std::shared_ptr(new double[aParser->getDataLength()*RECEIVE_ELEMENT_COUNT],std::default_delete()); getAScanOfCEAndAmplification(aParser,shotList,oneTasAscan,ascanData,amplificationData); std::string fileName = cemeasureFolder + SLASH_CHAR + getMatFileName(0); - createEmitterMat(aParser,fileName,ascanData,amplificationData); + std::unique_lock lock(PRODUCER_MUTEX); + PRODUCER_DATAS.push({aParser,fileName,ascanData,amplificationData}); + lock.unlock(); + PRODUCER_CONDITION.notify_one(); + //createEmitterMat(aParser,fileName,ascanData,amplificationData); } - ++progress; - std::cout<<"\r\033[K"< unsigned short receiveElement = mapperArrayPointer.get()[index + 2 + aShotList->getMuxValue(muxIndex)]; AScanData ascan = aParser->searchAscanDataFromOneTasAscanDataOfCE(aOneTasAScanData,TasElementIndex(TasIndex(receiveTas),ElementIndex(GeometryIndex(receiveElement)))); aAmplificationData.get()[muxIndex*TOTAL_CHANNEL+i] = ascan.getAmplification()[0]; - for(unsigned short j=0;jgetDataLength();++j) - { - aAScanData.get()[(muxIndex*TOTAL_CHANNEL+i)*aParser->getDataLength()+j] = ascan.get()[j]; - } + std::copy(ascan.get(), ascan.get() + aParser->getDataLength(), aAScanData.get() + (muxIndex*TOTAL_CHANNEL+i)*aParser->getDataLength()); index+=9; } } @@ -269,10 +326,7 @@ void MatlabCreatorPrivate::getAScanOfMPAndAmplification(std::shared_ptr unsigned short receiveElement = mapperArrayPointer.get()[index + 2 + aShotList->getMuxValue(muxIndex)]; AScanData ascan = aParser->searchAscanDataFromOneTasAscanDataOfMP(aOneTasAScanData,ElementIndex(GeometryIndex(aGeometryElement)),TasElementIndex(TasIndex(receiveTas),ElementIndex(GeometryIndex(receiveElement))),aMotorPosition); aAmplificationData.get()[muxIndex*TOTAL_CHANNEL+i] = ascan.getAmplification()[0]; - for(unsigned short j=0;jgetDataLength();++j) - { - aAScanData.get()[(muxIndex*TOTAL_CHANNEL+i)*aParser->getDataLength()+j] = ascan.get()[j]; - } + std::copy(ascan.get(), ascan.get() + aParser->getDataLength(), aAScanData.get() + (muxIndex*TOTAL_CHANNEL+i)*aParser->getDataLength()); index+=9; } } diff --git a/src/MatLab/MatlabCreatorPrivate.h b/src/MatLab/MatlabCreatorPrivate.h index b1a94db..150e545 100644 --- a/src/MatLab/MatlabCreatorPrivate.h +++ b/src/MatLab/MatlabCreatorPrivate.h @@ -31,6 +31,7 @@ private: void createMeasurementRotationMat(std::shared_ptr aParser, const std::string& aDirectoryPath); void createMovementsMat(std::shared_ptr aParser, const std::string& aDirectoryPath); void createPatDataMat(std::shared_ptr aParser, const std::string& aDirectoryPath); + void producerThreadFunction(std::shared_ptr aParser, unsigned short aStartTasNum,unsigned short aTasCount, const std::string& aOutputPath); private: std::string mDirectoryPath;