1*0e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 2*0e6b6b59SJacob Faibussowitsch 3*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/macros.hpp> 4*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/utility.hpp> 5*0e6b6b59SJacob Faibussowitsch 6*0e6b6b59SJacob Faibussowitsch namespace Petsc { 7*0e6b6b59SJacob Faibussowitsch 8*0e6b6b59SJacob Faibussowitsch namespace device { 9*0e6b6b59SJacob Faibussowitsch 10*0e6b6b59SJacob Faibussowitsch namespace host { 11*0e6b6b59SJacob Faibussowitsch 12*0e6b6b59SJacob Faibussowitsch namespace impl { 13*0e6b6b59SJacob Faibussowitsch 14*0e6b6b59SJacob Faibussowitsch class DeviceContext { 15*0e6b6b59SJacob Faibussowitsch public: 16*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode destroy(PetscDeviceContext)) { return 0; } 17*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType)) { return 0; } 18*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode setUp(PetscDeviceContext)) { return 0; } 19*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode query(PetscDeviceContext, PetscBool *idle)) { 20*0e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 21*0e6b6b59SJacob Faibussowitsch *idle = PETSC_TRUE; // the host is always idle 22*0e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 23*0e6b6b59SJacob Faibussowitsch } 24*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext)) { return 0; } 25*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode synchronize(PetscDeviceContext)) { return 0; } 26*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode getBlasHandle(PetscDeviceContext, void *)) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); } 27*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode getSolverHandle(PetscDeviceContext, void *)) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); } 28*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode getStreamHandle(PetscDeviceContext, void *)) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); } 29*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode beginTimer(PetscDeviceContext)) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); } 30*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *)) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); } 31*0e6b6b59SJacob Faibussowitsch 32*0e6b6b59SJacob Faibussowitsch const _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer}; 33*0e6b6b59SJacob Faibussowitsch }; 34*0e6b6b59SJacob Faibussowitsch 35*0e6b6b59SJacob Faibussowitsch } // namespace impl 36*0e6b6b59SJacob Faibussowitsch 37*0e6b6b59SJacob Faibussowitsch } // namespace host 38*0e6b6b59SJacob Faibussowitsch 39*0e6b6b59SJacob Faibussowitsch } // namespace device 40*0e6b6b59SJacob Faibussowitsch 41*0e6b6b59SJacob Faibussowitsch } // namespace Petsc 42*0e6b6b59SJacob Faibussowitsch 43*0e6b6b59SJacob Faibussowitsch PetscErrorCode PetscDeviceContextCreate_HOST(PetscDeviceContext dctx) { 44*0e6b6b59SJacob Faibussowitsch static constexpr auto hostctx = ::Petsc::device::host::impl::DeviceContext{}; 45*0e6b6b59SJacob Faibussowitsch 46*0e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 47*0e6b6b59SJacob 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); 48*0e6b6b59SJacob Faibussowitsch PetscCall(PetscArraycpy(dctx->ops, &hostctx.ops, 1)); 49*0e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 50*0e6b6b59SJacob Faibussowitsch } 51