xref: /petsc/src/sys/objects/device/impls/host/hostcontext.cxx (revision e990932ba1a35fc96173ad18f51ccebf8c801f38)
10e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h>
20e6b6b59SJacob Faibussowitsch 
397cd0981SJacob 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:
destroy(PetscDeviceContext)1997cd0981SJacob Faibussowitsch   static PetscErrorCode destroy(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
changeStreamType(PetscDeviceContext,PetscStreamType)2097cd0981SJacob Faibussowitsch   static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { return PETSC_SUCCESS; }
setUp(PetscDeviceContext)2197cd0981SJacob Faibussowitsch   static PetscErrorCode setUp(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
query(PetscDeviceContext,PetscBool * idle)2297cd0981SJacob 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   }
waitForContext(PetscDeviceContext,PetscDeviceContext)2897cd0981SJacob Faibussowitsch   static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
synchronize(PetscDeviceContext)2997cd0981SJacob Faibussowitsch   static PetscErrorCode synchronize(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }
300e6b6b59SJacob Faibussowitsch 
3197cd0981SJacob Faibussowitsch   // clang-format off
3297cd0981SJacob Faibussowitsch   const _DeviceContextOps ops = {
3397cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(destroy, destroy),
3497cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(changestreamtype, changeStreamType),
3597cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(setup, setUp),
3697cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(query, query),
3797cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(waitforcontext, waitForContext),
3897cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(synchronize, synchronize),
3997cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(getblashandle, nullptr),
4097cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(getsolverhandle, nullptr),
4197cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(getstreamhandle, nullptr),
4297cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(begintimer, nullptr),
4397cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(endtimer, nullptr),
44*14e1f9a0SHong Zhang     PetscDesignatedInitializer(getpower, nullptr),
45*14e1f9a0SHong Zhang     PetscDesignatedInitializer(beginenergymeter, nullptr),
46*14e1f9a0SHong Zhang     PetscDesignatedInitializer(endenergymeter, nullptr),
4797cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memalloc, nullptr),
4897cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memfree, nullptr),
4997cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memcopy, nullptr),
5097cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(memset, nullptr),
5197cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(createevent, nullptr),
5297cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(recordevent, nullptr),
5397cd0981SJacob Faibussowitsch     PetscDesignatedInitializer(waitforevent, nullptr)
5497cd0981SJacob Faibussowitsch   };
5597cd0981SJacob Faibussowitsch   // clang-format on
560e6b6b59SJacob Faibussowitsch };
570e6b6b59SJacob Faibussowitsch 
580e6b6b59SJacob Faibussowitsch } // namespace impl
590e6b6b59SJacob Faibussowitsch 
600e6b6b59SJacob Faibussowitsch } // namespace host
610e6b6b59SJacob Faibussowitsch 
620e6b6b59SJacob Faibussowitsch } // namespace device
630e6b6b59SJacob Faibussowitsch 
640e6b6b59SJacob Faibussowitsch } // namespace Petsc
650e6b6b59SJacob Faibussowitsch 
PetscDeviceContextCreate_HOST(PetscDeviceContext dctx)66d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceContextCreate_HOST(PetscDeviceContext dctx)
67d71ae5a4SJacob Faibussowitsch {
680e6b6b59SJacob Faibussowitsch   static constexpr auto hostctx = ::Petsc::device::host::impl::DeviceContext{};
690e6b6b59SJacob Faibussowitsch 
700e6b6b59SJacob Faibussowitsch   PetscFunctionBegin;
710e6b6b59SJacob 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);
7297cd0981SJacob Faibussowitsch   *dctx->ops = hostctx.ops;
733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
740e6b6b59SJacob Faibussowitsch }
75