xref: /petsc/src/sys/objects/device/impls/host/hostcontext.cxx (revision 97cd0981e74de23d519e6ad08211164018f544ae)
10e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h>
20e6b6b59SJacob Faibussowitsch 
3*97cd0981SJacob Faibussowitsch #include <petsc/private/cpp/utility.hpp> // PetscObjectCast()
40e6b6b59SJacob Faibussowitsch 
5d71ae5a4SJacob Faibussowitsch namespace Petsc
6d71ae5a4SJacob Faibussowitsch {
70e6b6b59SJacob Faibussowitsch 
8d71ae5a4SJacob Faibussowitsch namespace device
9d71ae5a4SJacob Faibussowitsch {
100e6b6b59SJacob Faibussowitsch 
11d71ae5a4SJacob Faibussowitsch namespace host
12d71ae5a4SJacob Faibussowitsch {
130e6b6b59SJacob Faibussowitsch 
14d71ae5a4SJacob Faibussowitsch namespace impl
15d71ae5a4SJacob Faibussowitsch {
160e6b6b59SJacob Faibussowitsch 
170e6b6b59SJacob Faibussowitsch class DeviceContext {
180e6b6b59SJacob Faibussowitsch public:
19*97cd0981SJacob Faibussowitsch   static PetscErrorCode destroy(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
20*97cd0981SJacob Faibussowitsch   static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { return PETSC_SUCCESS; }
21*97cd0981SJacob Faibussowitsch   static PetscErrorCode setUp(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
22*97cd0981SJacob Faibussowitsch   static PetscErrorCode query(PetscDeviceContext, PetscBool *idle) noexcept
23d71ae5a4SJacob Faibussowitsch   {
240e6b6b59SJacob Faibussowitsch     PetscFunctionBegin;
250e6b6b59SJacob Faibussowitsch     *idle = PETSC_TRUE; // the host is always idle
263ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
270e6b6b59SJacob Faibussowitsch   }
28*97cd0981SJacob Faibussowitsch   static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
29*97cd0981SJacob Faibussowitsch   static PetscErrorCode synchronize(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
300e6b6b59SJacob Faibussowitsch 
31*97cd0981SJacob Faibussowitsch   // clang-format off
32*97cd0981SJacob Faibussowitsch   const _DeviceContextOps ops = {
33*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(destroy, destroy),
34*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(changestreamtype, changeStreamType),
35*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(setup, setUp),
36*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(query, query),
37*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(waitforcontext, waitForContext),
38*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(synchronize, synchronize),
39*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(getblashandle, nullptr),
40*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(getsolverhandle, nullptr),
41*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(getstreamhandle, nullptr),
42*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(begintimer, nullptr),
43*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(endtimer, nullptr),
44*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memalloc, nullptr),
45*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memfree, nullptr),
46*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memcopy, nullptr),
47*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memset, nullptr),
48*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(createevent, nullptr),
49*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(recordevent, nullptr),
50*97cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(waitforevent, nullptr)
51*97cd0981SJacob Faibussowitsch   };
52*97cd0981SJacob Faibussowitsch   // clang-format on
530e6b6b59SJacob Faibussowitsch };
540e6b6b59SJacob Faibussowitsch 
550e6b6b59SJacob Faibussowitsch } // namespace impl
560e6b6b59SJacob Faibussowitsch 
570e6b6b59SJacob Faibussowitsch } // namespace host
580e6b6b59SJacob Faibussowitsch 
590e6b6b59SJacob Faibussowitsch } // namespace device
600e6b6b59SJacob Faibussowitsch 
610e6b6b59SJacob Faibussowitsch } // namespace Petsc
620e6b6b59SJacob Faibussowitsch 
63d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceContextCreate_HOST(PetscDeviceContext dctx)
64d71ae5a4SJacob Faibussowitsch {
650e6b6b59SJacob Faibussowitsch   static constexpr auto hostctx = ::Petsc::device::host::impl::DeviceContext{};
660e6b6b59SJacob Faibussowitsch 
670e6b6b59SJacob Faibussowitsch   PetscFunctionBegin;
680e6b6b59SJacob Faibussowitsch   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);
69*97cd0981SJacob Faibussowitsch   *dctx->ops = hostctx.ops;
703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
710e6b6b59SJacob Faibussowitsch }
72