20 #ifndef OPM_HYPRE_GPU_TRANSFERS_HPP 21 #define OPM_HYPRE_GPU_TRANSFERS_HPP 23 #include <opm/simulators/linalg/gpuistl/hypreinterface/HypreDataStructures.hpp> 24 #include <opm/simulators/linalg/gpuistl/hypreinterface/HypreErrorHandling.hpp> 28 #include <opm/simulators/linalg/gpuistl_hip/GpuSparseMatrixWrapper.hpp> 29 #include <opm/simulators/linalg/gpuistl_hip/GpuVector.hpp> 31 #include <opm/simulators/linalg/gpuistl/GpuSparseMatrixWrapper.hpp> 32 #include <opm/simulators/linalg/gpuistl/GpuVector.hpp> 37 #include <_hypre_utilities.h> 42 template <
typename VectorType>
43 void setContinuousGpuVectorForHypre(
const VectorType& v,
44 std::vector<HYPRE_Real>& continuous_vector_values,
45 const std::vector<int>& local_hypre_to_local_dune);
47 template <
typename VectorType>
48 void setGpuVectorFromContinuousVector(VectorType& v,
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 56 template <
typename VectorType>
58 transferGpuVectorToHypre(
const VectorType& gpu_vec,
59 HYPRE_IJVector hypre_vec,
60 HypreHostDataArrays& host_arrays,
61 const HypreDeviceDataArrays& device_arrays,
62 const ParallelInfo& par_info,
65 const int N =
static_cast<int>(host_arrays.indices.size());
66 using T =
typename VectorType::field_type;
68 if (use_gpu_backend) {
70 if (par_info.owner_first) {
72 const T* device_ptr = gpu_vec.data();
74 HYPRE_IJVectorSetValues(hypre_vec, N, device_arrays.indices_device, const_cast<T*>(device_ptr)));
77 setContinuousGpuVectorForHypre(
78 gpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
79 hypre_TMemcpy(device_arrays.vector_buffer_device,
80 host_arrays.continuous_vector_values.data(),
85 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(
86 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
90 if (par_info.owner_first) {
92 auto host_values = gpu_vec.asStdVector();
93 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(hypre_vec,
95 const_cast<HYPRE_BigInt*>(host_arrays.indices.data()),
96 reinterpret_cast<HYPRE_Real*>(host_values.data())));
99 setContinuousGpuVectorForHypre(
100 gpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
101 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(hypre_vec,
103 const_cast<HYPRE_BigInt*>(host_arrays.indices.data()),
104 host_arrays.continuous_vector_values.data()));
107 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorAssemble(hypre_vec));
113 template <
typename VectorType>
115 transferHypreToGpuVector(HYPRE_IJVector hypre_vec,
117 HypreHostDataArrays& host_arrays,
118 const HypreDeviceDataArrays& device_arrays,
119 const ParallelInfo& par_info,
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));
133 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(
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);
141 setGpuVectorFromContinuousVector(
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();
149 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(hypre_vec,
151 const_cast<HYPRE_BigInt*>(host_arrays.indices.data()),
152 reinterpret_cast<HYPRE_Real*>(host_values.data())));
153 gpu_vec = VectorType(host_values);
156 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(hypre_vec,
158 const_cast<HYPRE_BigInt*>(host_arrays.indices.data()),
159 host_arrays.continuous_vector_values.data()));
160 setGpuVectorFromContinuousVector(
161 gpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
171 template <
typename MatrixType>
173 updateMatrixFromGpuSparseMatrix(
const MatrixType& gpu_matrix,
174 HYPRE_IJMatrix hypre_matrix,
175 const SparsityPattern& sparsity_pattern,
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) {
187 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixSetValues2(hypre_matrix,
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();
197 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixSetValues2(hypre_matrix,
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()));
205 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixAssemble(hypre_matrix));
208 template <
typename VectorType>
210 setContinuousGpuVectorForHypre(
const VectorType& v,
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]];
222 template <
typename VectorType>
224 setGpuVectorFromContinuousVector(VectorType& v,
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);
236 #endif // HYPRE_USING_CUDA || HYPRE_USING_HIP 240 #endif // OPM_HYPRE_GPU_TRANSFERS_HPP Unified interface for Hypre operations with both CPU and GPU data structures.
Definition: HypreCpuTransfers.hpp:29