Skip to content

Commit 2e09420

Browse files
committed
Portable::MatrixFree: introduce DeviceVector
Instead of passing double* to the user code, introduce a new type that is a type alias to a Kokkos::View.
1 parent 07fd637 commit 2e09420

File tree

9 files changed

+52
-40
lines changed

9 files changed

+52
-40
lines changed

examples/step-64/step-64.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ namespace Step64
192192

193193
DEAL_II_HOST_DEVICE void
194194
operator()(const typename Portable::MatrixFree<dim, double>::Data *data,
195-
const double *src,
196-
double *dst) const;
195+
const Portable::DeviceVector<double> &src,
196+
Portable::DeviceVector<double> &dst) const;
197197

198198
private:
199199
double *coef;
@@ -208,8 +208,8 @@ namespace Step64
208208
template <int dim, int fe_degree>
209209
DEAL_II_HOST_DEVICE void LocalHelmholtzOperator<dim, fe_degree>::operator()(
210210
const typename Portable::MatrixFree<dim, double>::Data *data,
211-
const double *src,
212-
double *dst) const
211+
const Portable::DeviceVector<double> &src,
212+
Portable::DeviceVector<double> &dst) const
213213
{
214214
Portable::FEEvaluation<dim, fe_degree, fe_degree + 1, 1, double> fe_eval(
215215
data);

include/deal.II/matrix_free/portable_fe_evaluation.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ namespace Portable
151151
* AffineConstraints::read_dof_values() as well.
152152
*/
153153
DEAL_II_HOST_DEVICE void
154-
read_dof_values(const Number *src);
154+
read_dof_values(const DeviceVector<Number> &src);
155155

156156
/**
157157
* Take the value stored internally on dof values of the current cell and
@@ -160,7 +160,7 @@ namespace Portable
160160
* function AffineConstraints::distribute_local_to_global.
161161
*/
162162
DEAL_II_HOST_DEVICE void
163-
distribute_local_to_global(Number *dst) const;
163+
distribute_local_to_global(DeviceVector<Number> &dst) const;
164164

165165
/**
166166
* Evaluate the function values and the gradients of the FE function given
@@ -327,7 +327,7 @@ namespace Portable
327327
typename Number>
328328
DEAL_II_HOST_DEVICE void
329329
FEEvaluation<dim, fe_degree, n_q_points_1d, n_components_, Number>::
330-
read_dof_values(const Number *src)
330+
read_dof_values(const DeviceVector<Number> &src)
331331
{
332332
// Populate the scratch memory
333333
Kokkos::parallel_for(Kokkos::TeamThreadRange(data->team_member,
@@ -359,7 +359,7 @@ namespace Portable
359359
typename Number>
360360
DEAL_II_HOST_DEVICE void
361361
FEEvaluation<dim, fe_degree, n_q_points_1d, n_components_, Number>::
362-
distribute_local_to_global(Number *dst) const
362+
distribute_local_to_global(DeviceVector<Number> &dst) const
363363
{
364364
for (unsigned int c = 0; c < n_components_; ++c)
365365
{

include/deal.II/matrix_free/portable_matrix_free.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,19 @@ namespace Portable
6565
struct SharedData;
6666
#endif
6767

68+
/**
69+
* Type for source and destination vectors in device functions like
70+
* MatrixFree::cell_loop().
71+
*
72+
* This is a type alias to a Kokkos::View to a chunk of memory, typically
73+
* pointing to the local elements in the LinearAlgebra::distributed::Vector.
74+
*/
75+
template <typename Number>
76+
using DeviceVector =
77+
Kokkos::View<Number *, MemorySpace::Default::kokkos_space>;
78+
79+
80+
6881
/**
6982
* This class collects all the data that is stored for the matrix free
7083
* implementation. The storage scheme is tailored towards several loops
@@ -366,8 +379,8 @@ namespace Portable
366379
* \code
367380
* DEAL_II_HOST_DEVICE void operator()(
368381
* const typename Portable::MatrixFree<dim, Number>::Data *data,
369-
* const Number * src,
370-
* Number * dst) const;
382+
* const DeviceVector<Number> &src,
383+
* DeviceVector<Number> & dst) const;
371384
* static const unsigned int n_local_dofs;
372385
* static const unsigned int n_q_points;
373386
* \endcode

include/deal.II/matrix_free/portable_matrix_free.templates.h

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,19 @@ namespace Portable
354354
ApplyKernel(
355355
Functor func,
356356
const typename MatrixFree<dim, Number>::PrecomputedData gpu_data,
357-
Number *const src,
358-
Number *dst)
357+
const LinearAlgebra::distributed::Vector<Number, MemorySpace::Default>
358+
&src,
359+
LinearAlgebra::distributed::Vector<Number, MemorySpace::Default> &dst)
359360
: func(func)
360361
, gpu_data(gpu_data)
361-
, src(src)
362-
, dst(dst)
362+
, src(src.get_values(), src.locally_owned_size())
363+
, dst(dst.get_values(), dst.locally_owned_size())
363364
{}
364365

365366
Functor func;
366367
const typename MatrixFree<dim, Number>::PrecomputedData gpu_data;
367-
Number *const src;
368-
Number *dst;
368+
const DeviceVector<Number> src;
369+
DeviceVector<Number> dst;
369370

370371

371372
// Provide the shared memory capacity. This function takes the team_size
@@ -404,7 +405,8 @@ namespace Portable
404405
&gpu_data,
405406
&shared_data};
406407

407-
func(&data, src, dst);
408+
DeviceVector<Number> nonconstdst = dst;
409+
func(&data, src, nonconstdst);
408410
}
409411
};
410412
} // namespace internal
@@ -1017,7 +1019,7 @@ namespace Portable
10171019
Kokkos::AUTO);
10181020

10191021
internal::ApplyKernel<dim, Number, Functor> apply_kernel(
1020-
func, get_data(color), src.get_values(), dst.get_values());
1022+
func, get_data(color), src, dst);
10211023

10221024
Kokkos::parallel_for("dealii::MatrixFree::serial_cell_loop",
10231025
team_policy,
@@ -1062,7 +1064,7 @@ namespace Portable
10621064
Kokkos::AUTO);
10631065

10641066
internal::ApplyKernel<dim, Number, Functor> apply_kernel(
1065-
func, get_data(0), src.get_values(), dst.get_values());
1067+
func, get_data(0), src, dst);
10661068

10671069
Kokkos::parallel_for(
10681070
"dealii::MatrixFree::distributed_cell_loop_0",
@@ -1085,7 +1087,7 @@ namespace Portable
10851087
Kokkos::AUTO);
10861088

10871089
internal::ApplyKernel<dim, Number, Functor> apply_kernel(
1088-
func, get_data(1), src.get_values(), dst.get_values());
1090+
func, get_data(1), src, dst);
10891091

10901092
Kokkos::parallel_for(
10911093
"dealii::MatrixFree::distributed_cell_loop_1",
@@ -1113,7 +1115,7 @@ namespace Portable
11131115
Kokkos::AUTO);
11141116

11151117
internal::ApplyKernel<dim, Number, Functor> apply_kernel(
1116-
func, get_data(2), src.get_values(), dst.get_values());
1118+
func, get_data(2), src, dst);
11171119

11181120
Kokkos::parallel_for(
11191121
"dealii::MatrixFree::distributed_cell_loop_2",
@@ -1146,7 +1148,7 @@ namespace Portable
11461148
Kokkos::AUTO);
11471149

11481150
internal::ApplyKernel<dim, Number, Functor> apply_kernel(
1149-
func, get_data(i), src.get_values(), dst.get_values());
1151+
func, get_data(i), src, dst);
11501152

11511153
Kokkos::parallel_for(
11521154
"dealii::MatrixFree::distributed_cell_loop_" +
@@ -1183,10 +1185,7 @@ namespace Portable
11831185
Kokkos::AUTO);
11841186

11851187
internal::ApplyKernel<dim, Number, Functor> apply_kernel(
1186-
func,
1187-
get_data(i),
1188-
ghosted_src.get_values(),
1189-
ghosted_dst.get_values());
1188+
func, get_data(i), ghosted_src, ghosted_dst);
11901189

11911190
Kokkos::parallel_for(
11921191
"dealii::MatrixFree::distributed_cell_loop_" +

include/deal.II/matrix_free/tools.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,8 +1398,8 @@ namespace MatrixFreeTools
13981398

13991399
KOKKOS_FUNCTION void
14001400
operator()(const typename Portable::MatrixFree<dim, Number>::Data *data,
1401-
const Number *,
1402-
Number *dst) const
1401+
const Portable::DeviceVector<Number> &,
1402+
Portable::DeviceVector<Number> &dst) const
14031403
{
14041404
Portable::
14051405
FEEvaluation<dim, fe_degree, n_q_points_1d, n_components, Number>

tests/matrix_free_kokkos/coefficient_eval_device.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class DummyOperator
3737

3838
DEAL_II_HOST_DEVICE void
3939
operator()(const typename Portable::MatrixFree<dim, double>::Data *data,
40-
const double *src,
41-
double *dst) const;
40+
const Portable::DeviceVector<double>& src,
41+
Portable::DeviceVector<double>& dst) const;
4242

4343
static const unsigned int n_local_dofs =
4444
dealii::Utilities::pow(fe_degree + 1, dim);
@@ -52,8 +52,8 @@ template <int dim, int fe_degree>
5252
DEAL_II_HOST_DEVICE void
5353
DummyOperator<dim, fe_degree>::operator()(
5454
const typename Portable::MatrixFree<dim, double>::Data *data,
55-
const double *,
56-
double *dst) const
55+
const Portable::DeviceVector<double>& src,
56+
Portable::DeviceVector<double>& dst) const
5757
{
5858
Kokkos::parallel_for(
5959
Kokkos::TeamThreadRange(data->team_member, n_q_points),

tests/matrix_free_kokkos/matrix_free_device_no_index_initialize.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ class MatrixFreeTest
4040

4141
DEAL_II_HOST_DEVICE void
4242
operator()(const typename Portable::MatrixFree<dim, Number>::Data *data,
43-
const Number *src,
44-
Number *dst) const
43+
const Portable::DeviceVector<Number> &src,
44+
Portable::DeviceVector<Number> &dst) const
4545
{
4646
Portable::FEEvaluation<dim, fe_degree, n_q_points_1d, 1, Number> fe_eval(
4747
data);

tests/matrix_free_kokkos/matrix_vector_device_mf.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ class HelmholtzOperator
7878

7979
DEAL_II_HOST_DEVICE void
8080
operator()(const typename Portable::MatrixFree<dim, Number>::Data *data,
81-
const Number *src,
82-
Number *dst) const;
81+
const Portable::DeviceVector<Number> &src,
82+
Portable::DeviceVector<Number> &dst) const;
8383

8484
Number *coef;
8585
};
@@ -90,8 +90,8 @@ template <int dim, int fe_degree, typename Number, int n_q_points_1d>
9090
DEAL_II_HOST_DEVICE void
9191
HelmholtzOperator<dim, fe_degree, Number, n_q_points_1d>::operator()(
9292
const typename Portable::MatrixFree<dim, Number>::Data *data,
93-
const Number *src,
94-
Number *dst) const
93+
const Portable::DeviceVector<Number> &src,
94+
Portable::DeviceVector<Number> &dst) const
9595
{
9696
Portable::FEEvaluation<dim, fe_degree, n_q_points_1d, 1, Number> fe_eval(
9797
data);

tests/matrix_free_kokkos/matrix_vector_host_device_multi_component.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ class LaplaceOperatorLocal
167167

168168
DEAL_II_HOST_DEVICE void
169169
operator()(const typename Portable::MatrixFree<dim, Number>::Data *data,
170-
const Number *src,
171-
Number *dst) const
170+
const Portable::DeviceVector<Number> &src,
171+
Portable::DeviceVector<Number> &dst) const
172172
{
173173
Portable::FEEvaluation<dim, fe_degree, fe_degree + 1, n_components, Number>
174174
phi(data);

0 commit comments

Comments
 (0)