From 0088c6b8c0909f412d165485606a1ea709671f14 Mon Sep 17 00:00:00 2001 From: havahol Date: Fri, 21 Aug 2026 09:30:13 +0000 Subject: [PATCH] fix bug when creating GpuSeqILU0 from GPU matrix --- opm/simulators/linalg/gpuistl/GpuSeqILU0.hpp | 9 +++------ opm/simulators/linalg/gpuistl/GpuVector.cpp | 4 ++++ tests/gpuistl/test_GpuVector.cpp | 7 +++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/opm/simulators/linalg/gpuistl/GpuSeqILU0.hpp b/opm/simulators/linalg/gpuistl/GpuSeqILU0.hpp index 7ac06bcae25..5e12e9ade62 100644 --- a/opm/simulators/linalg/gpuistl/GpuSeqILU0.hpp +++ b/opm/simulators/linalg/gpuistl/GpuSeqILU0.hpp @@ -187,17 +187,14 @@ template , int>> GpuSeqILU0::GpuSeqILU0(const M& A, field_type w) : m_underlyingMatrix(A) , m_w(w) - , m_LU(A.getNonZeroValues().data(), - A.getRowIndices().data(), - A.getColumnIndices().data(), - A.nonzeroes(), - A.blockSize(), - A.N()) + , m_LU(A.getRowIndices(), A.getColumnIndices(), A.blockSize()) , m_temporaryStorage(m_LU.N() * m_LU.blockSize()) , m_descriptionL(detail::createLowerDiagonalDescription()) , m_descriptionU(detail::createUpperDiagonalDescription()) , m_cuSparseHandle(detail::CuSparseHandle::getInstance()) { + m_LU.updateNonzeroValues(A); + // Some sanity check OPM_ERROR_IF(A.N() != m_LU.N(), fmt::format("CuSparse matrix not same size as DUNE matrix. {} vs {}.", m_LU.N(), A.N())); diff --git a/opm/simulators/linalg/gpuistl/GpuVector.cpp b/opm/simulators/linalg/gpuistl/GpuVector.cpp index b5d41d406de..8c4e53a6bd7 100644 --- a/opm/simulators/linalg/gpuistl/GpuVector.cpp +++ b/opm/simulators/linalg/gpuistl/GpuVector.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include namespace Opm::gpuistl @@ -49,6 +50,9 @@ template GpuVector::GpuVector(const T* dataOnHost, const size_t numberOfElements) : GpuVector(numberOfElements) { + if (detail::isGPUPointer(dataOnHost)) { + OPM_THROW(std::invalid_argument, "dataOnHost is a GPU pointer, use copy constructor instead"); + } OPM_GPU_SAFE_CALL(cudaMemcpy( m_dataOnDevice, dataOnHost, detail::to_size_t(m_numberOfElements) * sizeof(T), cudaMemcpyHostToDevice)); diff --git a/tests/gpuistl/test_GpuVector.cpp b/tests/gpuistl/test_GpuVector.cpp index 5eb704d2290..550a0bbff4a 100644 --- a/tests/gpuistl/test_GpuVector.cpp +++ b/tests/gpuistl/test_GpuVector.cpp @@ -64,6 +64,13 @@ BOOST_AUTO_TEST_CASE(TestCopyFromHostConstructor) BOOST_CHECK_EQUAL_COLLECTIONS(buffer.begin(), buffer.end(), data.begin(), data.end()); } +BOOST_AUTO_TEST_CASE(TestCopyFromHostConstructorWithGPUPointer) +{ + std::vector data {{1, 2, 3, 4, 5, 6, 7}}; + auto vectorOnGPU = Opm::gpuistl::GpuVector(data.data(), data.size()); + BOOST_CHECK_THROW(Opm::gpuistl::GpuVector(vectorOnGPU.data(), data.size()), std::invalid_argument); +} + BOOST_AUTO_TEST_CASE(TestCopyFromHostFunction) {