From 2b0508af8b660b4a8ddb5c818a29ca2937a358eb Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 11 Nov 2021 12:17:24 +0100 Subject: [PATCH 1/3] changed: use unique_ptr for MultisegmentWellContributions less manual pointer management is always good --- .../linalg/bda/WellContributions.cpp | 35 ++++++++++++------- .../linalg/bda/WellContributions.cu | 4 +-- .../linalg/bda/WellContributions.hpp | 3 +- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/opm/simulators/linalg/bda/WellContributions.cpp b/opm/simulators/linalg/bda/WellContributions.cpp index c50400cae..c284c9282 100644 --- a/opm/simulators/linalg/bda/WellContributions.cpp +++ b/opm/simulators/linalg/bda/WellContributions.cpp @@ -54,10 +54,6 @@ WellContributions::WellContributions(std::string accelerator_mode, bool useWellC WellContributions::~WellContributions() { - // delete MultisegmentWellContributions - for (auto ms: multisegments) { - delete ms; - } multisegments.clear(); #if HAVE_CUDA @@ -121,7 +117,7 @@ void WellContributions::apply_mswells(cl::Buffer d_x, cl::Buffer d_y){ events.clear(); // actually apply MultisegmentWells - for(Opm::MultisegmentWellContribution *well: multisegments){ + for (auto& well : multisegments) { well->setReordering(h_toOrder, reorder); well->apply(h_x, h_y); } @@ -253,15 +249,30 @@ void WellContributions::alloc() } } -void WellContributions::addMultisegmentWellContribution(unsigned int dim_, unsigned int dim_wells_, - unsigned int Mb, - std::vector &Bvalues, std::vector &BcolIndices, std::vector &BrowPointers, - unsigned int DnumBlocks, double *Dvalues, UMFPackIndex *DcolPointers, UMFPackIndex *DrowIndices, - std::vector &Cvalues) +void WellContributions::addMultisegmentWellContribution(unsigned int dim_, + unsigned int dim_wells_, + unsigned int Mb, + std::vector& Bvalues, + std::vector& BcolIndices, + std::vector& BrowPointers, + unsigned int DnumBlocks, + double* Dvalues, + UMFPackIndex* DcolPointers, + UMFPackIndex* DrowIndices, + std::vector& Cvalues) { assert(dim==dim_); - MultisegmentWellContribution *well = new MultisegmentWellContribution(dim_, dim_wells_, Mb, Bvalues, BcolIndices, BrowPointers, DnumBlocks, Dvalues, DcolPointers, DrowIndices, Cvalues); - multisegments.emplace_back(well); + multisegments.push_back(std::make_unique(dim_, + dim_wells_, + Mb, + Bvalues, + BcolIndices, + BrowPointers, + DnumBlocks, + Dvalues, + DcolPointers, + DrowIndices, + Cvalues)); ++num_ms_wells; } diff --git a/opm/simulators/linalg/bda/WellContributions.cu b/opm/simulators/linalg/bda/WellContributions.cu index a59ae3ac9..1ba663cf0 100644 --- a/opm/simulators/linalg/bda/WellContributions.cu +++ b/opm/simulators/linalg/bda/WellContributions.cu @@ -177,7 +177,7 @@ void WellContributions::apply(double *d_x, double *d_y) cudaStreamSynchronize(stream); // actually apply MultisegmentWells - for (MultisegmentWellContribution *well : multisegments) { + for (auto& well : multisegments) { well->apply(h_x, h_y); } @@ -222,7 +222,7 @@ void WellContributions::addMatrixGpu(MatrixType type, int *colIndices, double *v void WellContributions::setCudaStream(cudaStream_t stream_) { this->stream = stream_; - for (MultisegmentWellContribution *well : multisegments) { + for (auto& well : multisegments) { well->setCudaStream(stream_); } } diff --git a/opm/simulators/linalg/bda/WellContributions.hpp b/opm/simulators/linalg/bda/WellContributions.hpp index ae7d71d5e..eec664b7c 100644 --- a/opm/simulators/linalg/bda/WellContributions.hpp +++ b/opm/simulators/linalg/bda/WellContributions.hpp @@ -29,6 +29,7 @@ #include #endif +#include #include #include @@ -89,7 +90,7 @@ private: double *h_x = nullptr; double *h_y = nullptr; - std::vector multisegments; + std::vector> multisegments; #if HAVE_OPENCL cl::Context *context; From 4a1fb0b86afc39ecc16af58654815ec76e90f49a Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 11 Nov 2021 12:23:16 +0100 Subject: [PATCH 2/3] use std::vector for val_pointers --- opm/simulators/linalg/bda/WellContributions.cpp | 8 ++------ opm/simulators/linalg/bda/WellContributions.cu | 2 +- opm/simulators/linalg/bda/WellContributions.hpp | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/opm/simulators/linalg/bda/WellContributions.cpp b/opm/simulators/linalg/bda/WellContributions.cpp index c284c9282..c09695132 100644 --- a/opm/simulators/linalg/bda/WellContributions.cpp +++ b/opm/simulators/linalg/bda/WellContributions.cpp @@ -62,10 +62,6 @@ WellContributions::~WellContributions() } #endif - if(num_std_wells > 0){ - delete[] val_pointers; - } - #if HAVE_OPENCL if(opencl_gpu){ if(num_ms_wells > 0){ @@ -181,7 +177,7 @@ void WellContributions::addMatrix([[maybe_unused]] MatrixType type, [[maybe_unus if (num_std_wells_so_far == num_std_wells - 1) { val_pointers[num_std_wells] = num_blocks; events.resize(1); - queue->enqueueWriteBuffer(*d_val_pointers_ocl, CL_FALSE, 0, sizeof(unsigned int) * (num_std_wells + 1), val_pointers, nullptr, &events[0]); + queue->enqueueWriteBuffer(*d_val_pointers_ocl, CL_FALSE, 0, sizeof(unsigned int) * (num_std_wells + 1), val_pointers.data(), nullptr, &events[0]); events[0].wait(); events.clear(); } @@ -227,7 +223,7 @@ void WellContributions::addNumBlocks(unsigned int numBlocks) void WellContributions::alloc() { if (num_std_wells > 0) { - val_pointers = new unsigned int[num_std_wells + 1]; + val_pointers.resize(num_std_wells+1); #if HAVE_CUDA if(cuda_gpu){ diff --git a/opm/simulators/linalg/bda/WellContributions.cu b/opm/simulators/linalg/bda/WellContributions.cu index 1ba663cf0..d374c5523 100644 --- a/opm/simulators/linalg/bda/WellContributions.cu +++ b/opm/simulators/linalg/bda/WellContributions.cu @@ -210,7 +210,7 @@ void WellContributions::addMatrixGpu(MatrixType type, int *colIndices, double *v val_pointers[num_std_wells_so_far] = num_blocks_so_far; if (num_std_wells_so_far == num_std_wells - 1) { val_pointers[num_std_wells] = num_blocks; - cudaMemcpy(d_val_pointers, val_pointers, sizeof(unsigned int) * (num_std_wells + 1), cudaMemcpyHostToDevice); + cudaMemcpy(d_val_pointers, val_pointers.data(), sizeof(unsigned int) * (num_std_wells + 1), cudaMemcpyHostToDevice); } break; default: diff --git a/opm/simulators/linalg/bda/WellContributions.hpp b/opm/simulators/linalg/bda/WellContributions.hpp index eec664b7c..c0735e715 100644 --- a/opm/simulators/linalg/bda/WellContributions.hpp +++ b/opm/simulators/linalg/bda/WellContributions.hpp @@ -86,7 +86,7 @@ private: unsigned int num_ms_wells = 0; // number of MultisegmentWells in this object, must equal multisegments.size() unsigned int num_blocks_so_far = 0; // keep track of where next data is written unsigned int num_std_wells_so_far = 0; // keep track of where next data is written - unsigned int *val_pointers = nullptr; // val_pointers[wellID] == index of first block for this well in Ccols and Bcols + std::vector val_pointers; // val_pointers[wellID] == index of first block for this well in Ccols and Bcols double *h_x = nullptr; double *h_y = nullptr; From be6c857b1633fb22d1a19390d2bbeecca865348c Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 11 Nov 2021 13:28:59 +0100 Subject: [PATCH 3/3] bda: use forwarding for WellContributions --- opm/simulators/linalg/bda/BdaBridge.hpp | 3 ++- opm/simulators/linalg/bda/BdaSolver.hpp | 13 ++++++------- tests/test_cusparseSolver.cpp | 1 + tests/test_openclSolver.cpp | 1 + 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/opm/simulators/linalg/bda/BdaBridge.hpp b/opm/simulators/linalg/bda/BdaBridge.hpp index 4a0be6e24..73c2de02c 100644 --- a/opm/simulators/linalg/bda/BdaBridge.hpp +++ b/opm/simulators/linalg/bda/BdaBridge.hpp @@ -27,7 +27,6 @@ #include #include -#include #if HAVE_FPGA @@ -37,6 +36,8 @@ namespace Opm { +class WellContributions; + typedef Dune::InverseOperatorResult InverseOperatorResult; using Opm::Accelerator::ILUReorder; diff --git a/opm/simulators/linalg/bda/BdaSolver.hpp b/opm/simulators/linalg/bda/BdaSolver.hpp index ee16f844c..c79ba3271 100644 --- a/opm/simulators/linalg/bda/BdaSolver.hpp +++ b/opm/simulators/linalg/bda/BdaSolver.hpp @@ -22,15 +22,14 @@ #include -#include -namespace Opm -{ -namespace Accelerator -{ +#include - using Opm::WellContributions; +namespace Opm { +class WellContributions; + +namespace Accelerator { enum class SolverStatus { BDA_SOLVER_SUCCESS, BDA_SOLVER_ANALYSIS_FAILED, @@ -57,7 +56,7 @@ namespace Accelerator int maxit = 200; double tolerance = 1e-2; - std::string bitstream = ""; + std::string bitstream; int N; // number of rows int Nb; // number of blocked rows (Nb*block_size == N) diff --git a/tests/test_cusparseSolver.cpp b/tests/test_cusparseSolver.cpp index 0d40ab199..fd637c33e 100644 --- a/tests/test_cusparseSolver.cpp +++ b/tests/test_cusparseSolver.cpp @@ -30,6 +30,7 @@ BOOST_VERSION / 100 % 1000 > 48 #include +#include #include #include diff --git a/tests/test_openclSolver.cpp b/tests/test_openclSolver.cpp index 7c611405b..a54f416c0 100644 --- a/tests/test_openclSolver.cpp +++ b/tests/test_openclSolver.cpp @@ -30,6 +30,7 @@ BOOST_VERSION / 100 % 1000 > 48 #include +#include #include #include