20#ifndef OPM_HYPRE_GPU_TRANSFERS_HPP
21#define OPM_HYPRE_GPU_TRANSFERS_HPP
28#include <opm/simulators/linalg/gpuistl_hip/GpuSparseMatrix.hpp>
29#include <opm/simulators/linalg/gpuistl_hip/GpuVector.hpp>
37#include <_hypre_utilities.h>
42template <
typename VectorType>
44 std::vector<HYPRE_Real>& continuous_vector_values,
45 const std::vector<int>& local_hypre_to_local_dune);
47template <
typename VectorType>
49 const std::vector<HYPRE_Real>& continuous_vector_values,
50 const std::vector<int>& local_hypre_to_local_dune);
51#if HYPRE_USING_CUDA || HYPRE_USING_HIP
56template <
typename VectorType>
58transferGpuVectorToHypre(
const VectorType& gpu_vec,
59 HYPRE_IJVector hypre_vec,
65 const int N =
static_cast<int>(host_arrays.
indices.size());
66 using T =
typename VectorType::field_type;
68 if (use_gpu_backend) {
72 const T* device_ptr = gpu_vec.data();
74 HYPRE_IJVectorSetValues(hypre_vec, N, device_arrays.
indices_device,
const_cast<T*
>(device_ptr)));
92 auto host_values = gpu_vec.asStdVector();
95 const_cast<HYPRE_BigInt*
>(host_arrays.
indices.data()),
96 reinterpret_cast<HYPRE_Real*
>(host_values.data())));
103 const_cast<HYPRE_BigInt*
>(host_arrays.
indices.data()),
113template <
typename VectorType>
115transferHypreToGpuVector(HYPRE_IJVector hypre_vec,
117 HypreHostDataArrays& host_arrays,
118 const HypreDeviceDataArrays& device_arrays,
120 bool use_gpu_backend)
122 const int N =
static_cast<int>(host_arrays.indices.size());
123 using T =
typename VectorType::field_type;
125 if (use_gpu_backend) {
127 if (par_info.owner_first) {
129 T* device_ptr = gpu_vec.data();
130 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(hypre_vec, N, device_arrays.indices_device, device_ptr));
134 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
135 hypre_TMemcpy(host_arrays.continuous_vector_values.data(),
136 device_arrays.vector_buffer_device,
140 HYPRE_MEMORY_DEVICE);
142 gpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
146 if (par_info.owner_first) {
148 auto host_values = gpu_vec.asStdVector();
151 const_cast<HYPRE_BigInt*
>(host_arrays.indices.data()),
152 reinterpret_cast<HYPRE_Real*
>(host_values.data())));
153 gpu_vec = VectorType(host_values);
158 const_cast<HYPRE_BigInt*
>(host_arrays.indices.data()),
159 host_arrays.continuous_vector_values.data()));
161 gpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
171template <
typename MatrixType>
173updateMatrixFromGpuSparseMatrix(
const MatrixType& gpu_matrix,
174 HYPRE_IJMatrix hypre_matrix,
176 const HypreHostDataArrays& host_arrays,
177 const HypreDeviceDataArrays& device_arrays,
178 bool use_gpu_backend)
180 const auto N = sparsity_pattern.rows.size();
181 using T =
typename MatrixType::field_type;
182 const T* values = gpu_matrix.getNonZeroValues().data();
184 if (use_gpu_backend) {
189 device_arrays.ncols_device,
190 device_arrays.rows_device,
191 device_arrays.row_indexes_device,
192 device_arrays.cols_device,
196 auto host_values = gpu_matrix.getNonZeroValues().asStdVector();
199 const_cast<HYPRE_Int*
>(sparsity_pattern.ncols.data()),
200 const_cast<HYPRE_BigInt*
>(sparsity_pattern.rows.data()),
201 const_cast<HYPRE_Int*
>(host_arrays.row_indexes.data()),
202 const_cast<HYPRE_BigInt*
>(sparsity_pattern.cols.data()),
203 host_values.data()));
208template <
typename VectorType>
211 std::vector<HYPRE_Real>& continuous_vector_values,
212 const std::vector<int>& local_hypre_to_local_dune)
215 auto host_values = v.asStdVector();
217 for (
size_t i = 0; i < local_hypre_to_local_dune.size(); ++i) {
218 continuous_vector_values[i] = host_values[local_hypre_to_local_dune[i]];
222template <
typename VectorType>
225 const std::vector<HYPRE_Real>& continuous_vector_values,
226 const std::vector<int>& local_hypre_to_local_dune)
229 auto host_values = v.asStdVector();
230 for (
size_t i = 0; i < local_hypre_to_local_dune.size(); ++i) {
231 host_values[local_hypre_to_local_dune[i]] = continuous_vector_values[i];
234 v = VectorType(host_values);
#define OPM_HYPRE_SAFE_CALL(expr)
Macro to wrap Hypre function calls with error checking.
Definition: HypreErrorHandling.hpp:96
Unified interface for Hypre operations with both CPU and GPU data structures.
Definition: HypreInterface.hpp:61
void setContinuousGpuVectorForHypre(const VectorType &v, std::vector< HYPRE_Real > &continuous_vector_values, const std::vector< int > &local_hypre_to_local_dune)
::Opm::gpuistl::ParallelInfo ParallelInfo
Definition: HypreInterface.hpp:64
::Opm::gpuistl::SparsityPattern SparsityPattern
Definition: HypreInterface.hpp:65
void setGpuVectorFromContinuousVector(VectorType &v, const std::vector< HYPRE_Real > &continuous_vector_values, const std::vector< int > &local_hypre_to_local_dune)
GPU device memory arrays for HYPRE operations with GPU backend.
Definition: HypreDataStructures.hpp:137
HYPRE_Real * vector_buffer_device
Device buffer for vector operations Used when input type and backend are different,...
Definition: HypreDataStructures.hpp:149
HYPRE_BigInt * indices_device
Definition: HypreDataStructures.hpp:143
Host arrays for HYPRE matrix and vector data transfers.
Definition: HypreDataStructures.hpp:106
std::vector< HYPRE_BigInt > indices
Global DOF indices for owned degrees of freedom.
Definition: HypreDataStructures.hpp:120
std::vector< HYPRE_Real > continuous_vector_values
Temporary buffer for vector values in non-owner-first ordering.
Definition: HypreDataStructures.hpp:128
Parallel domain decomposition information for HYPRE-Dune interface.
Definition: HypreDataStructures.hpp:37
bool owner_first
Whether owned DOFs appear first in local Dune ordering.
Definition: HypreDataStructures.hpp:77
std::vector< int > local_hypre_to_local_dune
Mapping from local HYPRE indices to local Dune indices.
Definition: HypreDataStructures.hpp:59