xref: /petsc/src/sys/objects/device/impls/host/hostcontext.cxx (revision e990932ba1a35fc96173ad18f51ccebf8c801f38)
1 #include <petsc/private/deviceimpl.h>
2 
3 #include <petsc/private/cpp/utility.hpp> // PetscObjectCast()
4 
5 namespace Petsc
6 {
7 
8 namespace device
9 {
10 
11 namespace host
12 {
13 
14 namespace impl
15 {
16 
17 class DeviceContext {
18 public:
destroy(PetscDeviceContext)19   static PetscErrorCode destroy(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
changeStreamType(PetscDeviceContext,PetscStreamType)20   static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { return PETSC_SUCCESS; }
setUp(PetscDeviceContext)21   static PetscErrorCode setUp(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
query(PetscDeviceContext,PetscBool * idle)22   static PetscErrorCode query(PetscDeviceContext, PetscBool *idle) noexcept
23   {
24     PetscFunctionBegin;
25     *idle = PETSC_TRUE; // the host is always idle
26     PetscFunctionReturn(PETSC_SUCCESS);
27   }
waitForContext(PetscDeviceContext,PetscDeviceContext)28   static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
synchronize(PetscDeviceContext)29   static PetscErrorCode synchronize(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
30 
31   // clang-format off
32   const _DeviceContextOps ops = {
33     PetscDesignatedInitializer(destroy, destroy),
34     PetscDesignatedInitializer(changestreamtype, changeStreamType),
35     PetscDesignatedInitializer(setup, setUp),
36     PetscDesignatedInitializer(query, query),
37     PetscDesignatedInitializer(waitforcontext, waitForContext),
38     PetscDesignatedInitializer(synchronize, synchronize),
39     PetscDesignatedInitializer(getblashandle, nullptr),
40     PetscDesignatedInitializer(getsolverhandle, nullptr),
41     PetscDesignatedInitializer(getstreamhandle, nullptr),
42     PetscDesignatedInitializer(begintimer, nullptr),
43     PetscDesignatedInitializer(endtimer, nullptr),
44     PetscDesignatedInitializer(getpower, nullptr),
45     PetscDesignatedInitializer(beginenergymeter, nullptr),
46     PetscDesignatedInitializer(endenergymeter, nullptr),
47     PetscDesignatedInitializer(memalloc, nullptr),
48     PetscDesignatedInitializer(memfree, nullptr),
49     PetscDesignatedInitializer(memcopy, nullptr),
50     PetscDesignatedInitializer(memset, nullptr),
51     PetscDesignatedInitializer(createevent, nullptr),
52     PetscDesignatedInitializer(recordevent, nullptr),
53     PetscDesignatedInitializer(waitforevent, nullptr)
54   };
55   // clang-format on
56 };
57 
58 } // namespace impl
59 
60 } // namespace host
61 
62 } // namespace device
63 
64 } // namespace Petsc
65 
PetscDeviceContextCreate_HOST(PetscDeviceContext dctx)66 PetscErrorCode PetscDeviceContextCreate_HOST(PetscDeviceContext dctx)
67 {
68   static constexpr auto hostctx = ::Petsc::device::host::impl::DeviceContext{};
69 
70   PetscFunctionBegin;
71   PetscAssert(!dctx->data, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscDeviceContext %" PetscInt64_FMT " is of type host, but still has data member %p", PetscObjectCast(dctx)->id, dctx->data);
72   *dctx->ops = hostctx.ops;
73   PetscFunctionReturn(PETSC_SUCCESS);
74 }
75