xref: /petsc/src/sys/objects/device/impls/sycl/syclcontext.sycl.cxx (revision 3f675fcfae04b360bc8c82e8c5bddf69aaa0b3b9)
10e6b6b59SJacob Faibussowitsch #include "sycldevice.hpp"
2a2158755SJunchao Zhang #include <CL/sycl.hpp>
3a2158755SJunchao Zhang 
49371c9d4SSatish Balay namespace Petsc {
5a2158755SJunchao Zhang 
60e6b6b59SJacob Faibussowitsch namespace device {
717f48955SJacob Faibussowitsch 
80e6b6b59SJacob Faibussowitsch namespace sycl {
917f48955SJacob Faibussowitsch 
100e6b6b59SJacob Faibussowitsch namespace impl {
1117f48955SJacob Faibussowitsch 
129371c9d4SSatish Balay class DeviceContext {
13a2158755SJunchao Zhang public:
14a2158755SJunchao Zhang   struct PetscDeviceContext_IMPLS {
150e6b6b59SJacob Faibussowitsch     ::sycl::event event;
160e6b6b59SJacob Faibussowitsch     ::sycl::event begin; // timer-only
170e6b6b59SJacob Faibussowitsch     ::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 
269371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode finalize_() noexcept {
27a2158755SJunchao Zhang     PetscFunctionBegin;
28a2158755SJunchao Zhang     initialized_ = false;
29a2158755SJunchao Zhang     PetscFunctionReturn(0);
30a2158755SJunchao Zhang   }
31a2158755SJunchao Zhang 
329371c9d4SSatish 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*3f675fcfSPierre Jolivet   const struct _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
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
509371c9d4SSatish 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   };
569371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept {
579371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
589371c9d4SSatish Balay   };
599371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode setUp(PetscDeviceContext) noexcept {
609371c9d4SSatish Balay     return 0;
619371c9d4SSatish Balay   }; // Nothing to setup
629371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept {
639371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
649371c9d4SSatish Balay   };
659371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept {
669371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
679371c9d4SSatish Balay   };
689371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode synchronize(PetscDeviceContext) noexcept {
699371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
709371c9d4SSatish Balay   };
719371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept {
729371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
739371c9d4SSatish Balay   };
749371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept {
759371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
769371c9d4SSatish Balay   };
779371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept {
789371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
799371c9d4SSatish Balay   };
809371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode beginTimer(PetscDeviceContext) noexcept {
819371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
829371c9d4SSatish Balay   };
839371c9d4SSatish Balay   PETSC_NODISCARD static PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *) noexcept {
849371c9d4SSatish Balay     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented");
859371c9d4SSatish Balay   };
86a2158755SJunchao Zhang };
87a2158755SJunchao Zhang 
880e6b6b59SJacob Faibussowitsch } // namespace impl
8917f48955SJacob Faibussowitsch 
900e6b6b59SJacob Faibussowitsch } // namespace sycl
9117f48955SJacob Faibussowitsch 
920e6b6b59SJacob Faibussowitsch } // namespace device
9317f48955SJacob Faibussowitsch 
94a2158755SJunchao Zhang } // namespace Petsc
95a2158755SJunchao Zhang 
969371c9d4SSatish Balay PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx) {
970e6b6b59SJacob 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