xref: /petsc/src/sys/objects/device/impls/sycl/syclcontext.sycl.cxx (revision 12facf1b2b728ba534ad2f7a1cbdf48236a5076e)
1 #include "sycldevice.hpp"
2 #include <CL/sycl.hpp>
3 
4 namespace Petsc
5 {
6 
7 namespace device
8 {
9 
10 namespace sycl
11 {
12 
13 namespace impl
14 {
15 
16 class DeviceContext {
17 public:
18   struct PetscDeviceContext_IMPLS {
19     ::sycl::event event;
20     ::sycl::event begin; // timer-only
21     ::sycl::event end;   // timer-only
22 #if PetscDefined(USE_DEBUG)
23     PetscBool timerInUse;
24 #endif
25   };
26 
27 private:
28   static bool initialized_;
29 
30   PETSC_NODISCARD static PetscErrorCode finalize_() noexcept
31   {
32     PetscFunctionBegin;
33     initialized_ = false;
34     PetscFunctionReturn(0);
35   }
36 
37   PETSC_NODISCARD static PetscErrorCode initialize_(PetscInt id, DeviceContext *dci) noexcept
38   {
39     PetscFunctionBegin;
40     PetscCall(PetscDeviceCheckDeviceCount_Internal(id));
41     if (!initialized_) {
42       initialized_ = true;
43       PetscCall(PetscRegisterFinalize(finalize_));
44     }
45     PetscFunctionReturn(0);
46   }
47 
48 public:
49   const struct _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
50 
51   // default constructor
52   DeviceContext() noexcept = default;
53 
54   // All of these functions MUST be static in order to be callable from C, otherwise they
55   // get the implicit 'this' pointer tacked on
56   PETSC_NODISCARD static PetscErrorCode destroy(PetscDeviceContext dctx) noexcept
57   {
58     PetscFunctionBegin;
59     delete static_cast<PetscDeviceContext_IMPLS *>(dctx->data);
60     dctx->data = nullptr;
61     PetscFunctionReturn(0);
62   };
63   PETSC_NODISCARD static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
64   PETSC_NODISCARD static PetscErrorCode setUp(PetscDeviceContext) noexcept { return 0; }; // Nothing to setup
65   PETSC_NODISCARD static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
66   PETSC_NODISCARD static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
67   PETSC_NODISCARD static PetscErrorCode synchronize(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
68   PETSC_NODISCARD static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
69   PETSC_NODISCARD static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
70   PETSC_NODISCARD static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
71   PETSC_NODISCARD static PetscErrorCode beginTimer(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
72   PETSC_NODISCARD static PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
73 };
74 
75 } // namespace impl
76 
77 } // namespace sycl
78 
79 } // namespace device
80 
81 } // namespace Petsc
82 
83 PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx)
84 {
85   using namespace Petsc::device::sycl::impl;
86 
87   static const DeviceContext syclctx;
88 
89   PetscFunctionBegin;
90   dctx->data = new DeviceContext::PetscDeviceContext_IMPLS();
91   PetscCall(PetscMemcpy(dctx->ops, &syclctx.ops, sizeof(syclctx.ops)));
92   PetscFunctionReturn(0);
93 }
94