xref: /petsc/src/sys/objects/device/impls/host/hostcontext.cxx (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
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