From 20ca7f0ce5b395b02aa0e5ea4a476339570c6525 Mon Sep 17 00:00:00 2001 From: sunwen Date: Tue, 24 Dec 2024 13:42:47 +0800 Subject: [PATCH] feat: Add cuda function in getAscanBlockPreprocessed. --- CMakeLists.txt | 4 +- .../getAScanBlockPreprocessed.cpp | 56 ++++++++++++++++++- .../getAScanBlockPreprocessed.h | 18 ++++++ 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e18a2d1..8031054 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ file(GLOB_RECURSE cpp_files ./src/*.cpp) file(GLOB_RECURSE cu_files ./src/*.cu) file(GLOB_RECURSE cxx_files ./src/*.cxx) file(GLOB_RECURSE header_files ./src/*.h) -add_executable(UR ${cpp_files} ${cu_files} ${cxx_files} ${header_files} ${Aurora_Source} ${Aurora_Source_Cu} ./src/Aurora.cu ${Aurora_DIR}/src/CudaMatrixPrivate.cu) +add_executable(UR ${cpp_files} ${cu_files} ${cxx_files} ${header_files} ${Aurora_Source} ${Aurora_Source_Cu} ${Aurora_DIR}/src/CudaMatrixPrivate.cu) #target_compile_options(UR PUBLIC ${Aurora_Complie_Options} "-march=native") target_include_directories(UR PUBLIC ./src/) @@ -58,7 +58,7 @@ INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS}) enable_testing() file(GLOB_RECURSE test_cpp test/*.cpp) -add_executable(UR_Test ${cpp_files} ${header_files} ${Aurora_Source} ${test_cpp} ${cu_files} ${Aurora_Source} ${Aurora_Source_Cu} ./src/Aurora.cu ${Aurora_DIR}/src/CudaMatrixPrivate.cu) +add_executable(UR_Test ${cpp_files} ${header_files} ${Aurora_Source} ${test_cpp} ${cu_files} ${Aurora_Source} ${Aurora_Source_Cu} ${Aurora_DIR}/src/CudaMatrixPrivate.cu) target_include_directories(UR_Test PUBLIC ./test/ ./src/) # target_compile_options(UR_Test PUBLIC ${Aurora_Complie_Options} "-march=native") diff --git a/src/common/dataBlockCreation/getAScanBlockPreprocessed.cpp b/src/common/dataBlockCreation/getAScanBlockPreprocessed.cpp index a4779e1..08a1470 100644 --- a/src/common/dataBlockCreation/getAScanBlockPreprocessed.cpp +++ b/src/common/dataBlockCreation/getAScanBlockPreprocessed.cpp @@ -1,5 +1,7 @@ #include "getAScanBlockPreprocessed.h" +#include "CudaMatrix.h" +#include "Matrix.h" #include "blockingGeometryInfo.h" #include "removeDataFromArrays.h" #include "getAscanBlock.h" @@ -8,6 +10,7 @@ #include "common/preprocessAscanBlock.h" #include "transmissionReconstruction/dataFilter/dataFilter.h" #include "reflectionReconstruction/dataFilter.h" +#include "Function2D.cuh" using namespace Aurora; using namespace Recon; @@ -60,7 +63,58 @@ AscanBlockPreprocessed Recon::getAscanBlockPreprocessed(Parser* aParser, const A else { result.ascanBlockPreprocessed = ascanBlock.ascanBlock; + } + return result; +} + + +AscanBlockPreprocessedCuda Recon::getAscanBlockPreprocessedCuda(Parser* aParser, const Aurora::Matrix& aMp, const Aurora::Matrix& aSl, const Aurora::Matrix& aSn, + const Aurora::Matrix& aRl, const Aurora::Matrix& aRn, GeometryInfo& aGeom, const MeasurementInfo& aMeasInfo, + bool aApplyFilter, bool aTransReco) +{ + AscanBlockPreprocessedCuda result; + AscanBlock ascanBlock = getAscanBlock(aParser, aMp, aSl, aSn, aRl, aRn); + + result.ascanBlockPreprocessed = ascanBlock.ascanBlock.toDeviceMatrix(); + result.gainBlock = ascanBlock.gainBlock.toDeviceMatrix(); + result.mpBlock = ascanBlock.mpBlock; + result.rlBlock = ascanBlock.rlBlock; + result.rnBlock = ascanBlock.rnBlock; + result.slBlock = ascanBlock.slBlock; + result.snBlock = ascanBlock.snBlock; + GeometryBlock geometryBlock = blockingGeometryInfos(aGeom, ascanBlock.rnBlock, ascanBlock.rlBlock, ascanBlock.snBlock, ascanBlock.slBlock, ascanBlock.mpBlock); + + result.receiverPositionBlock = geometryBlock.receiverPositionBlock; + result.senderPositionBlock = geometryBlock.senderPositionBlock; + if(aApplyFilter) + { + Matrix usedData; + if(aTransReco) + { + usedData = filterTransmissionData(ascanBlock.slBlock, ascanBlock.snBlock, ascanBlock.rlBlock, ascanBlock.rnBlock, + aGeom.sensData, geometryBlock.senderNormalBlock, geometryBlock.receiverNormalBlock); + } + else + { + usedData = filterReflectionData(geometryBlock.receiverPositionBlock, geometryBlock.senderPositionBlock, geometryBlock.senderNormalBlock, reflectParams::constrictReflectionAngles); + } + + CudaMatrix usedDataDevice = usedData.toDeviceMatrix(); + result.ascanBlockPreprocessed = valid(result.ascanBlockPreprocessed, usedDataDevice); + result.mpBlock = removeDataFromArrays(ascanBlock.mpBlock, usedData); + result.slBlock = removeDataFromArrays(ascanBlock.slBlock, usedData); + result.snBlock = removeDataFromArrays(ascanBlock.snBlock, usedData); + result.rlBlock = removeDataFromArrays(ascanBlock.rlBlock, usedData); + result.rnBlock = removeDataFromArrays(ascanBlock.rnBlock, usedData); + + result.senderPositionBlock = removeDataFromArrays(geometryBlock.senderPositionBlock, usedData); + result.receiverPositionBlock = removeDataFromArrays(geometryBlock.receiverPositionBlock, usedData); + result.gainBlock = valid(result.gainBlock, usedDataDevice); } + if (ascanBlock.ascanBlock.getDataSize() > 0) + { + result.ascanBlockPreprocessed = preprocessAscanBlockCuda(result.ascanBlockPreprocessed, aMeasInfo); + } return result; -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/common/dataBlockCreation/getAScanBlockPreprocessed.h b/src/common/dataBlockCreation/getAScanBlockPreprocessed.h index a07f05f..94f84d8 100644 --- a/src/common/dataBlockCreation/getAScanBlockPreprocessed.h +++ b/src/common/dataBlockCreation/getAScanBlockPreprocessed.h @@ -2,6 +2,7 @@ #define GETASCANBLOCK_PREPROCESSED_H #include "Matrix.h" +#include "CudaMatrix.h" #include "common/getGeometryInfo.h" #include "common/getMeasurementMetaData.h" @@ -25,6 +26,23 @@ namespace Recon AscanBlockPreprocessed getAscanBlockPreprocessed(Parser* aParser, const Aurora::Matrix& aMp, const Aurora::Matrix& aSl, const Aurora::Matrix& aSn, const Aurora::Matrix& aRl, const Aurora::Matrix& aRn, GeometryInfo& aGeom, const MeasurementInfo& aMeasInfo, bool aApplyFilter, bool aTransReco); + + struct AscanBlockPreprocessedCuda + { + Aurora::CudaMatrix ascanBlockPreprocessed; + Aurora::Matrix mpBlock; + Aurora::Matrix slBlock; + Aurora::Matrix snBlock; + Aurora::Matrix rlBlock; + Aurora::Matrix rnBlock; + Aurora::Matrix senderPositionBlock; + Aurora::Matrix receiverPositionBlock; + Aurora::CudaMatrix gainBlock; + }; + + AscanBlockPreprocessedCuda getAscanBlockPreprocessedCuda(Parser* aParser, const Aurora::Matrix& aMp, const Aurora::Matrix& aSl, const Aurora::Matrix& aSn, + const Aurora::Matrix& aRl, const Aurora::Matrix& aRn, GeometryInfo& aGeom, const MeasurementInfo& aMeasInfo, + bool aApplyFilter, bool aTransReco); }