xref: /libCEED/backends/memcheck/ceed-memcheck-qfunction.c (revision 947f93aa7135eb1759bf2866bd2fbd481436b113)
1 // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2 // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3 //
4 // SPDX-License-Identifier: BSD-2-Clause
5 //
6 // This file is part of CEED:  http://github.com/ceed
7 
8 #include <ceed/ceed.h>
9 #include <ceed/backend.h>
10 #include <string.h>
11 #include <valgrind/memcheck.h>
12 #include "ceed-memcheck.h"
13 
14 //------------------------------------------------------------------------------
15 // QFunction Apply
16 //------------------------------------------------------------------------------
17 static int CeedQFunctionApply_Memcheck(CeedQFunction qf, CeedInt Q,
18                                        CeedVector *U, CeedVector *V) {
19   int ierr;
20   CeedQFunction_Memcheck *impl;
21   ierr = CeedQFunctionGetData(qf, &impl); CeedChkBackend(ierr);
22 
23   void *ctx_data = NULL;
24   ierr = CeedQFunctionGetContextData(qf, CEED_MEM_HOST, &ctx_data);
25   CeedChkBackend(ierr);
26 
27   CeedQFunctionUser f = NULL;
28   ierr = CeedQFunctionGetUserFunction(qf, &f); CeedChkBackend(ierr);
29 
30   CeedInt num_in, num_out;
31   ierr = CeedQFunctionGetNumArgs(qf, &num_in, &num_out); CeedChkBackend(ierr);
32 
33   for (CeedInt i = 0; i<num_in; i++) {
34     ierr = CeedVectorGetArrayRead(U[i], CEED_MEM_HOST, &impl->inputs[i]);
35     CeedChkBackend(ierr);
36   }
37   int mem_block_ids[num_out];
38   for (CeedInt i = 0; i<num_out; i++) {
39     CeedSize len;
40     char name[30] = "";
41 
42     ierr = CeedVectorGetArrayWrite(V[i], CEED_MEM_HOST, &impl->outputs[i]);
43     CeedChkBackend(ierr);
44 
45     ierr = CeedVectorGetLength(V[i], &len); CeedChkBackend(ierr);
46     VALGRIND_MAKE_MEM_UNDEFINED(impl->outputs[i], len);
47 
48     snprintf(name, 30, "'QFunction output %" CeedInt_FMT "'", i);
49     mem_block_ids[i] = VALGRIND_CREATE_BLOCK(impl->outputs[i], len, name);
50   }
51 
52   ierr = f(ctx_data, Q, impl->inputs, impl->outputs); CeedChkBackend(ierr);
53 
54   for (CeedInt i = 0; i<num_in; i++) {
55     ierr = CeedVectorRestoreArrayRead(U[i], &impl->inputs[i]); CeedChkBackend(ierr);
56   }
57   for (CeedInt i = 0; i<num_out; i++) {
58     ierr = CeedVectorRestoreArray(V[i], &impl->outputs[i]); CeedChkBackend(ierr);
59     VALGRIND_DISCARD(mem_block_ids[i]);
60   }
61   ierr = CeedQFunctionRestoreContextData(qf, &ctx_data); CeedChkBackend(ierr);
62 
63   return CEED_ERROR_SUCCESS;
64 }
65 
66 //------------------------------------------------------------------------------
67 // QFunction Destroy
68 //------------------------------------------------------------------------------
69 static int CeedQFunctionDestroy_Memcheck(CeedQFunction qf) {
70   int ierr;
71   CeedQFunction_Memcheck *impl;
72   ierr = CeedQFunctionGetData(qf, (void *)&impl); CeedChkBackend(ierr);
73 
74   ierr = CeedFree(&impl->inputs); CeedChkBackend(ierr);
75   ierr = CeedFree(&impl->outputs); CeedChkBackend(ierr);
76   ierr = CeedFree(&impl); CeedChkBackend(ierr);
77 
78   return CEED_ERROR_SUCCESS;
79 }
80 
81 //------------------------------------------------------------------------------
82 // QFunction Create
83 //------------------------------------------------------------------------------
84 int CeedQFunctionCreate_Memcheck(CeedQFunction qf) {
85   int ierr;
86   Ceed ceed;
87   ierr = CeedQFunctionGetCeed(qf, &ceed); CeedChkBackend(ierr);
88 
89   CeedQFunction_Memcheck *impl;
90   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
91   ierr = CeedCalloc(CEED_FIELD_MAX, &impl->inputs); CeedChkBackend(ierr);
92   ierr = CeedCalloc(CEED_FIELD_MAX, &impl->outputs); CeedChkBackend(ierr);
93   ierr = CeedQFunctionSetData(qf, impl); CeedChkBackend(ierr);
94 
95   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Apply",
96                                 CeedQFunctionApply_Memcheck); CeedChkBackend(ierr);
97   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Destroy",
98                                 CeedQFunctionDestroy_Memcheck); CeedChkBackend(ierr);
99 
100   return CEED_ERROR_SUCCESS;
101 }
102 //------------------------------------------------------------------------------
103