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