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