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