From 4daf8e0c0b4ad2b714816a2ad5fba3ad831910b1 Mon Sep 17 00:00:00 2001 From: sunwen Date: Wed, 25 Dec 2024 11:11:31 +0800 Subject: [PATCH] feat: Add cuda function in getTransmission and detection. --- .../detection/detection.cpp | 23 ++-- .../detection/detection.h | 4 +- .../detection/getTransmissionData.cpp | 124 +++++++----------- 3 files changed, 60 insertions(+), 91 deletions(-) diff --git a/src/transmissionReconstruction/detection/detection.cpp b/src/transmissionReconstruction/detection/detection.cpp index beed361..10170d1 100644 --- a/src/transmissionReconstruction/detection/detection.cpp +++ b/src/transmissionReconstruction/detection/detection.cpp @@ -10,6 +10,7 @@ #include "common/getMeasurementMetaData.h" #include "config/config.h" +#include "transmissionReconstruction/detection/detection.cuh" //remove detectTofAndAttMex function, use detectTofAndAtt function instead of //保留函数和函数申明备忘,以防以后再次使用,以下头文件从动态库中映入了detectTofAndAttMex的核心函数 @@ -417,18 +418,17 @@ namespace Recon { // return result; // } - DetectResult transmissionDetection(const Aurora::Matrix &AscanBlock, - const Aurora::Matrix &AscanRefBlock, - const Aurora::Matrix &distBlock, - const Aurora::Matrix &distRefBlock, + + DetectResult transmissionDetection(const Aurora::CudaMatrix &AscanBlock, + const Aurora::CudaMatrix &AscanRefBlock, + const Aurora::CudaMatrix &distBlock, + const Aurora::CudaMatrix &distRefBlock, const Aurora::Matrix &sosWaterBlock, const Aurora::Matrix &sosWaterRefBlock, float expectedSOSWater) { - auto _sosWaterBlock = temperatureToSoundSpeed(sosWaterBlock, "marczak"); - auto _sosWaterRefBlock = temperatureToSoundSpeed(sosWaterRefBlock, "marczak"); + auto _sosWaterBlock = temperatureToSoundSpeed(sosWaterBlock, "marczak").toDeviceMatrix(); + auto _sosWaterRefBlock = temperatureToSoundSpeed(sosWaterRefBlock, "marczak").toDeviceMatrix(); switch (Recon::transParams::version) { - //remove detectTofAndAttMex function, use detectTofAndAtt function instead of - //保留函数和函数申明备忘,以防以后再次使用 // case 1: { // return detectTofAndAttMex( // AscanBlock, AscanRefBlock, distBlock, distRefBlock, @@ -440,13 +440,18 @@ namespace Recon { // } // case 2: default: - return detectTofAndAtt( + auto r = detectTofAndAtt( AscanBlock, AscanRefBlock, distBlock, distRefBlock, _sosWaterBlock, _sosWaterRefBlock, Recon::transParams::resampleFactor, Recon::transParams::nThreads, expectedSOSWater, Recon::transParams::useTimeWindowing, Recon::transParams::aScanReconstructionFrequency, Recon::transParams::detectionWindowATT, Recon::transParams::offsetElectronic, Recon::transParams::detectionWindowSOS, Recon::transParams::minSpeedOfSound, Recon::transParams::maxSpeedOfSound, Recon::transParams::gaussWindow); + DetectResult ret; + ret.att = r.att.toHostMatrix(); + ret.sosValue = r.sosValue.toHostMatrix(); + ret.tof = r.tof.toHostMatrix(); + return ret; } } } diff --git a/src/transmissionReconstruction/detection/detection.h b/src/transmissionReconstruction/detection/detection.h index 6fd5b2e..6f104b7 100644 --- a/src/transmissionReconstruction/detection/detection.h +++ b/src/transmissionReconstruction/detection/detection.h @@ -77,8 +77,8 @@ detectTofAndAtt( DetectResult transmissionDetection( - const Aurora::Matrix &AscanBlock, const Aurora::Matrix &AscanRefBlock, - const Aurora::Matrix &distBlock, const Aurora::Matrix &distRefBlock, + const Aurora::CudaMatrix &AscanBlock, const Aurora::CudaMatrix &AscanRefBlock, + const Aurora::CudaMatrix &distBlock, const Aurora::CudaMatrix &distRefBlock, const Aurora::Matrix &sosWaterBlock, const Aurora::Matrix &sosWaterRefBlock, float expectedSOSWater); } // namespace Recon diff --git a/src/transmissionReconstruction/detection/getTransmissionData.cpp b/src/transmissionReconstruction/detection/getTransmissionData.cpp index 9e8e96b..3b993e1 100644 --- a/src/transmissionReconstruction/detection/getTransmissionData.cpp +++ b/src/transmissionReconstruction/detection/getTransmissionData.cpp @@ -1,4 +1,7 @@ #include "getTransmissionData.h" +#include "getTransmissionData.cuh" +#include "AuroraDefs.h" +#include "CudaMatrix.h" #include #include @@ -10,10 +13,13 @@ #include #include +#include #include "Function.h" #include "Function2D.h" #include "Function3D.h" +#include "Function1D.cuh" +#include "Function2D.cuh" #include "config/config.h" #include "common/dataBlockCreation/removeDataFromArrays.h" @@ -42,8 +48,8 @@ namespace Matrix waterTempBlock; MetaInfos metaInfos; - Matrix ascanBlock; - Matrix ascanBlockRef; + CudaMatrix ascanBlock; + CudaMatrix ascanBlockRef; Matrix dists; Matrix distRefBlock; Matrix waterTempRefBlock; @@ -58,13 +64,20 @@ namespace int BUFFER_COUNT = 0; int BUFFER_SIZE = 4;//<=8 - Matrix prepareAScansForTransmissionDetection(const Matrix& aAscanBlock, const Matrix& aGainBlock) + CudaMatrix prepareAScansForTransmissionDetection(const CudaMatrix& aAscanBlock, const CudaMatrix& aGainBlock) { - Matrix result = aAscanBlock / repmat(aGainBlock, aAscanBlock.getDimSize(0), 1); + CudaMatrix result = aAscanBlock / repmat(aGainBlock, aAscanBlock.getDimSize(0), 1); result = result - repmat(mean(result,FunctionDirection::Column), result.getDimSize(0), 1); return result; } + Aurora::CudaMatrix calculateSnr(const Aurora::CudaMatrix &aMDataBlock, + float aReferenceNoise) { + auto maxSignal = max(abs(aMDataBlock)); + auto snrBlock = 10 * log(maxSignal / aReferenceNoise, 10); + return snrBlock; + } + BlockOfTransmissionData getBlockOfTransmissionData(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, @@ -72,13 +85,13 @@ namespace { BlockOfTransmissionData result; MetaInfos metaInfos; - auto blockData = getAscanBlockPreprocessed(aParser, aMp, aSl, aSn, aRlList, aRnList, aGeom, aExpInfo, true, true); - auto blockDataRef = getAscanBlockPreprocessed(aParserRef, aMpRef, aSl, aSn, aRlList, aRnList, aGeomRef, aExpInfoRef, true, true); - Matrix ascanBlock = prepareAScansForTransmissionDetection(blockData.ascanBlockPreprocessed, blockData.gainBlock); - Matrix ascanBlockRef = prepareAScansForTransmissionDetection(blockDataRef.ascanBlockPreprocessed, blockDataRef.gainBlock); - blockData.ascanBlockPreprocessed = Matrix(); - blockDataRef.ascanBlockPreprocessed = Matrix(); - if(aExpInfo.Hardware == "USCT3dv3") + auto blockData = getAscanBlockPreprocessedCuda(aParser, aMp, aSl, aSn, aRlList, aRnList, aGeom, aExpInfo, true, true); + auto blockDataRef = getAscanBlockPreprocessedCuda(aParserRef, aMpRef, aSl, aSn, aRlList, aRnList, aGeomRef, aExpInfoRef, true, true); + CudaMatrix ascanBlock = prepareAScansForTransmissionDetection(blockData.ascanBlockPreprocessed, blockData.gainBlock); + CudaMatrix ascanBlockRef = prepareAScansForTransmissionDetection(blockDataRef.ascanBlockPreprocessed, blockDataRef.gainBlock); + blockData.ascanBlockPreprocessed = CudaMatrix(); + blockDataRef.ascanBlockPreprocessed = CudaMatrix(); + if(aExpInfo.Hardware == "USCT3dv3") { Matrix channelList = precalculateChannelList(aRlList, aRnList, aExpInfo, aPreComputes); float* channelListSizeData = Aurora::malloc(2); @@ -92,71 +105,20 @@ namespace { channelListBlockData[i] = channelList[ind[i] - 1]; } - Matrix channelListBlock = Matrix::New(channelListBlockData, 1, channelListBlockSize); - Matrix fx = fft(ascanBlock); - float* fhData = Aurora::malloc(aExpInfo.matchedFilter.getDimSize(0) * channelListBlockSize, true); - Matrix fh = Matrix::New(fhData, aExpInfo.matchedFilter.getDimSize(0), channelListBlockSize, 1, Aurora::Complex); - size_t matchedFilterRowDataSize = aExpInfo.matchedFilter.getDimSize(0)*2; - for(size_t i=0; i