From d015b38845078a62ea4ccaab9c4d95dd6112e4b4 Mon Sep 17 00:00:00 2001 From: sunwen Date: Thu, 9 Nov 2023 15:33:40 +0800 Subject: [PATCH] Speed up reflection. CPU-GPU concurrent computing --- .../startReflectionReconstruction.cpp | 90 ++++++++++++++----- 1 file changed, 69 insertions(+), 21 deletions(-) diff --git a/src/reflectionReconstruction/startReflectionReconstruction.cpp b/src/reflectionReconstruction/startReflectionReconstruction.cpp index da1ee30..2afcf0b 100644 --- a/src/reflectionReconstruction/startReflectionReconstruction.cpp +++ b/src/reflectionReconstruction/startReflectionReconstruction.cpp @@ -20,17 +20,26 @@ #include #include +#include +#include using namespace Aurora; using namespace Recon; -Aurora::Matrix Recon::startReflectionReconstruction( Parser* aParser, int aSAFT_mode, const Aurora::Matrix& aMotorPos, - const Aurora::Matrix& aSlList, const Aurora::Matrix& aSnList, - const Aurora::Matrix& aRlList, const Aurora::Matrix& aRnList, - GeometryInfo& aGeom, TransRecos& aTransRecos, - MeasurementInfo& aExpInfo, PreComputes& aPreComputes) +namespace { - printf("Reflection reconstruction is carried out."); + std::queue PRODUCER_PROCESSDATAS; + std::queue PRODUCER_BLOCKDATAS; + std::mutex PRODUCER_MUTEX; + std::condition_variable PRODUCER_CONDITION; +} + +void producerThread( Parser* aParser, const Aurora::Matrix& aMotorPos, + const Aurora::Matrix& aSlList, const Aurora::Matrix& aSnList, + const Aurora::Matrix& aRlList, const Aurora::Matrix& aRnList, + GeometryInfo aGeom, MeasurementInfo aExpInfo, PreComputes aPreComputes) +{ +printf("Reflection reconstruction is carried out."); printf("Preperations for reconstructions."); @@ -48,18 +57,13 @@ Aurora::Matrix Recon::startReflectionReconstruction( Parser* aParser, int aSAFT_ { aPreComputes.sincPeak_ft = determineOptimalPulse(aPreComputes.timeInterval, aExpInfo.expectedAScanLength); } - printf(" - channel list"); auto channelList = precalculateChannelList(aRlList, aRnList, aExpInfo, aPreComputes); size_t numScans = aMotorPos.getDataSize() * aSlList.getDataSize() * aSnList.getDataSize() * aRlList.getDataSize() * aRnList.getDataSize(); - printf(" - blocking"); - Matrix Env = Aurora::zeros((int)reflectParams::imageXYZ[0],(int)reflectParams::imageXYZ[1],(int)reflectParams::imageXYZ[2]); - int numTakenScans = 0,numProcessedScans = 0,numPossibleScans = 0; for(int i=0; i lock(PRODUCER_MUTEX); + PRODUCER_BLOCKDATAS.push(blockData); + PRODUCER_PROCESSDATAS.push(preprocessData); + lock.unlock(); + PRODUCER_CONDITION.notify_one(); + } + } + } +} + +Aurora::Matrix Recon::startReflectionReconstruction( Parser* aParser, int aSAFT_mode, const Aurora::Matrix& aMotorPos, + const Aurora::Matrix& aSlList, const Aurora::Matrix& aSnList, + const Aurora::Matrix& aRlList, const Aurora::Matrix& aRnList, + GeometryInfo& aGeom, TransRecos& aTransRecos, + MeasurementInfo& aExpInfo, PreComputes& aPreComputes) +{ + for (size_t i = 0; i < reflectParams::gpuSelectionList.getDataSize(); i++) + { + std::string msg; + if (!resetGPUDevice((int)reflectParams::gpuSelectionList[i],msg)) + { + std::cerr< lock(PRODUCER_MUTEX); + PRODUCER_CONDITION.wait(lock, []{return !PRODUCER_PROCESSDATAS.empty() && !PRODUCER_BLOCKDATAS.empty();}); + lock.unlock(); + Env = recontructSAFT(removeDataFromArrays(PRODUCER_PROCESSDATAS.front().AscanBlock, PRODUCER_PROCESSDATAS.front().usedData), + removeDataFromArrays(PRODUCER_BLOCKDATAS.front().senderPositionBlock, PRODUCER_PROCESSDATAS.front().usedData), + removeDataFromArrays(PRODUCER_BLOCKDATAS.front().receiverPositionBlock, PRODUCER_PROCESSDATAS.front().usedData), + removeDataFromArrays(PRODUCER_BLOCKDATAS.front().mpBlock, PRODUCER_PROCESSDATAS.front().usedData), + aSAFT_mode, aTransRecos, Env); + lock.lock(); + PRODUCER_PROCESSDATAS.pop(); + PRODUCER_BLOCKDATAS.pop(); + lock.unlock(); + std::cout<