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