Skip to content

Commit ac1dfe3

Browse files
authored
Merge pull request #1652 from CEED/jeremy/dealii-vecs
dealii - remove duplicate GPU vec allocations
2 parents 71ed691 + 0850f99 commit ac1dfe3

File tree

1 file changed

+66
-26
lines changed

1 file changed

+66
-26
lines changed

examples/deal.II/bps.h

Lines changed: 66 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
#include <deal.II/matrix_free/tools.h>
2828

2929
// libCEED includes
30-
#include <ceed/ceed.h>
30+
#include <ceed.h>
31+
#include <ceed/backend.h>
3132

3233
// QFunction source
3334
#include "bps-qfunctions.h"
@@ -160,6 +161,8 @@ class OperatorCeed : public OperatorBase<Number>
160161
*/
161162
~OperatorCeed()
162163
{
164+
CeedVectorDestroy(&src_ceed);
165+
CeedVectorDestroy(&dst_ceed);
163166
CeedOperatorDestroy(&op_apply);
164167
CeedDestroy(&ceed);
165168
}
@@ -302,7 +305,11 @@ class OperatorCeed : public OperatorBase<Number>
302305
CeedOperatorSetField(op_apply, "qdata", q_data_restriction, CEED_BASIS_NONE, q_data);
303306
CeedOperatorSetField(op_apply, "v", sol_restriction, sol_basis, CEED_VECTOR_ACTIVE);
304307

305-
// 7) cleanup
308+
// 7) libCEED vectors
309+
CeedElemRestrictionCreateVector(sol_restriction, &src_ceed, NULL);
310+
CeedElemRestrictionCreateVector(sol_restriction, &dst_ceed, NULL);
311+
312+
// 8) cleanup
306313
CeedVectorDestroy(&q_data);
307314
CeedElemRestrictionDestroy(&q_data_restriction);
308315
CeedElemRestrictionDestroy(&sol_restriction);
@@ -322,30 +329,43 @@ class OperatorCeed : public OperatorBase<Number>
322329

323330
if (dof_handler.get_fe().n_components() == 1)
324331
{
325-
// create libCEED view on deal.II vectors
326-
VectorTypeCeed src_ceed(ceed, src);
327-
VectorTypeCeed dst_ceed(ceed, dst);
332+
// pass memory buffers to libCEED
333+
VectorTypeCeed x(src_ceed);
334+
VectorTypeCeed y(dst_ceed);
335+
x.import_array(src, CEED_MEM_HOST);
336+
y.import_array(dst, CEED_MEM_HOST);
328337

329338
// apply operator
330-
CeedOperatorApply(op_apply, src_ceed(), dst_ceed(), CEED_REQUEST_IMMEDIATE);
339+
CeedOperatorApply(op_apply, x(), y(), CEED_REQUEST_IMMEDIATE);
340+
341+
// pull arrays back to deal.II
342+
x.sync_array();
343+
y.sync_array();
331344
}
332345
else // TODO: needed for multiple components
333346
{
334347
// allocate space for block vectors
335348
src_tmp.reinit(this->extended_local_size(), true);
336349
dst_tmp.reinit(this->extended_local_size(), true);
337350

338-
copy_to_block_vector(src_tmp, src); // copy to block vector
351+
// copy to block vector
352+
copy_to_block_vector(src_tmp, src);
339353

340-
// create libCEED view on deal.II vectors
341-
VectorTypeCeed src_ceed(ceed, src_tmp);
342-
VectorTypeCeed dst_ceed(ceed, dst_tmp);
354+
// pass memory buffers to libCEED
355+
VectorTypeCeed x(src_ceed);
356+
VectorTypeCeed y(dst_ceed);
357+
x.import_array(src_tmp, CEED_MEM_HOST);
358+
y.import_array(dst_tmp, CEED_MEM_HOST);
343359

344360
// apply operator
345-
CeedOperatorApply(op_apply, src_ceed(), dst_ceed(), CEED_REQUEST_IMMEDIATE);
361+
CeedOperatorApply(op_apply, x(), y(), CEED_REQUEST_IMMEDIATE);
346362

347-
dst_ceed.sync_to_host(); // pull libCEED data back to host
348-
copy_from_block_vector(dst, dst_tmp); // copy from block vector
363+
// pull arrays back to deal.II
364+
x.sync_array();
365+
y.sync_array();
366+
367+
// copy from block vector
368+
copy_from_block_vector(dst, dst_tmp);
349369
}
350370

351371
// communicate: compress
@@ -373,9 +393,14 @@ class OperatorCeed : public OperatorBase<Number>
373393
{
374394
this->initialize_dof_vector(diagonal);
375395

376-
VectorTypeCeed diagonal_ceed(ceed, diagonal);
396+
// pass memory buffer to libCEED
397+
VectorTypeCeed y(dst_ceed);
398+
y.import_array(diagonal, CEED_MEM_HOST);
399+
400+
CeedOperatorLinearAssembleDiagonal(op_apply, y(), CEED_REQUEST_IMMEDIATE);
377401

378-
CeedOperatorLinearAssembleDiagonal(op_apply, diagonal_ceed(), CEED_REQUEST_IMMEDIATE);
402+
// pull array back to deal.II
403+
y.sync_array();
379404

380405
const unsigned int n_components = dof_handler.get_fe().n_components();
381406

@@ -404,13 +429,10 @@ class OperatorCeed : public OperatorBase<Number>
404429
/**
405430
* Constructor.
406431
*/
407-
VectorTypeCeed(const Ceed &ceed, const VectorType &vec)
432+
VectorTypeCeed(const CeedVector &vec_orig)
408433
{
409-
const unsigned int n_dofs =
410-
vec.get_partitioner()->locally_owned_size() + vec.get_partitioner()->n_ghost_indices();
411-
412-
CeedVectorCreate(ceed, n_dofs, &vec_ceed);
413-
CeedVectorSetArray(vec_ceed, CEED_MEM_HOST, CEED_USE_POINTER, vec.get_values());
434+
vec_ceed = NULL;
435+
CeedVectorReferenceCopy(vec_orig, &vec_ceed);
414436
}
415437

416438
/**
@@ -422,30 +444,46 @@ class OperatorCeed : public OperatorBase<Number>
422444
return vec_ceed;
423445
}
424446

447+
/**
448+
* Set deal.II memory in libCEED vector.
449+
*/
450+
void
451+
import_array(const VectorType &vec, const CeedMemType space)
452+
{
453+
mem_space = space;
454+
CeedVectorSetArray(vec_ceed, mem_space, CEED_USE_POINTER, vec.get_values());
455+
}
456+
425457
/**
426458
* Sync memory from device to host.
427459
*/
428460
void
429-
sync_to_host()
461+
sync_array()
430462
{
431-
CeedVectorSyncArray(vec_ceed, CEED_MEM_HOST);
463+
CeedVectorSyncArray(vec_ceed, mem_space);
432464
}
433465

434466
/**
435467
* Destructor: destroy vector view.
436468
*/
437469
~VectorTypeCeed()
438470
{
439-
CeedScalar *ptr;
440-
CeedVectorTakeArray(vec_ceed, CEED_MEM_HOST, &ptr);
471+
bool has_array;
472+
CeedVectorHasBorrowedArrayOfType(vec_ceed, mem_space, &has_array);
473+
if (has_array)
474+
{
475+
CeedScalar *ptr;
476+
CeedVectorTakeArray(vec_ceed, mem_space, &ptr);
477+
}
441478
CeedVectorDestroy(&vec_ceed);
442479
}
443480

444481
private:
445482
/**
446483
* libCEED vector view.
447484
*/
448-
CeedVector vec_ceed;
485+
CeedMemType mem_space;
486+
CeedVector vec_ceed;
449487
};
450488

451489
/**
@@ -705,6 +743,8 @@ class OperatorCeed : public OperatorBase<Number>
705743
Ceed ceed;
706744
std::vector<double> weights;
707745
std::array<CeedInt, 3> strides;
746+
CeedVector src_ceed;
747+
CeedVector dst_ceed;
708748
CeedOperator op_apply;
709749

710750
/**

0 commit comments

Comments
 (0)