xref: /petsc/src/sys/objects/device/impls/sycl/syclcontext.sycl.cxx (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
10e6b6b59SJacob Faibussowitsch #include "sycldevice.hpp"
2a2158755SJunchao Zhang #include <CL/sycl.hpp>
3a2158755SJunchao Zhang 
4*d71ae5a4SJacob Faibussowitsch namespace Petsc
5*d71ae5a4SJacob Faibussowitsch {
6a2158755SJunchao Zhang 
7*d71ae5a4SJacob Faibussowitsch namespace device
8*d71ae5a4SJacob Faibussowitsch {
917f48955SJacob Faibussowitsch 
10*d71ae5a4SJacob Faibussowitsch namespace sycl
11*d71ae5a4SJacob Faibussowitsch {
1217f48955SJacob Faibussowitsch 
13*d71ae5a4SJacob Faibussowitsch namespace impl
14*d71ae5a4SJacob Faibussowitsch {
1517f48955SJacob Faibussowitsch 
169371c9d4SSatish Balay class DeviceContext {
17a2158755SJunchao Zhang public:
18a2158755SJunchao Zhang   struct PetscDeviceContext_IMPLS {
190e6b6b59SJacob Faibussowitsch     ::sycl::event event;
200e6b6b59SJacob Faibussowitsch     ::sycl::event begin; // timer-only
210e6b6b59SJacob Faibussowitsch     ::sycl::event end;   // timer-only
22a2158755SJunchao Zhang #if PetscDefined(USE_DEBUG)
23a2158755SJunchao Zhang     PetscBool timerInUse;
24a2158755SJunchao Zhang #endif
25a2158755SJunchao Zhang   };
26a2158755SJunchao Zhang 
27a2158755SJunchao Zhang private:
28a2158755SJunchao Zhang   static bool initialized_;
29a2158755SJunchao Zhang 
30*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode finalize_() noexcept
31*d71ae5a4SJacob Faibussowitsch   {
32a2158755SJunchao Zhang     PetscFunctionBegin;
33a2158755SJunchao Zhang     initialized_ = false;
34a2158755SJunchao Zhang     PetscFunctionReturn(0);
35a2158755SJunchao Zhang   }
36a2158755SJunchao Zhang 
37*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode initialize_(PetscInt id, DeviceContext *dci) noexcept
38*d71ae5a4SJacob Faibussowitsch   {
39a2158755SJunchao Zhang     PetscFunctionBegin;
409566063dSJacob Faibussowitsch     PetscCall(PetscDeviceCheckDeviceCount_Internal(id));
41a2158755SJunchao Zhang     if (!initialized_) {
42a2158755SJunchao Zhang       initialized_ = true;
439566063dSJacob Faibussowitsch       PetscCall(PetscRegisterFinalize(finalize_));
44a2158755SJunchao Zhang     }
45a2158755SJunchao Zhang     PetscFunctionReturn(0);
46a2158755SJunchao Zhang   }
47a2158755SJunchao Zhang 
48a2158755SJunchao Zhang public:
493f675fcfSPierre Jolivet   const struct _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
50a2158755SJunchao Zhang 
51a2158755SJunchao Zhang   // default constructor
5217f48955SJacob Faibussowitsch   DeviceContext() noexcept = default;
53a2158755SJunchao Zhang 
54a2158755SJunchao Zhang   // All of these functions MUST be static in order to be callable from C, otherwise they
55a2158755SJunchao Zhang   // get the implicit 'this' pointer tacked on
56*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode destroy(PetscDeviceContext dctx) noexcept
57*d71ae5a4SJacob Faibussowitsch   {
58a2158755SJunchao Zhang     PetscFunctionBegin;
59a2158755SJunchao Zhang     delete static_cast<PetscDeviceContext_IMPLS *>(dctx->data);
60a2158755SJunchao Zhang     dctx->data = nullptr;
61a2158755SJunchao Zhang     PetscFunctionReturn(0);
62a2158755SJunchao Zhang   };
63*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
64*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode setUp(PetscDeviceContext) noexcept { return 0; }; // Nothing to setup
65*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
66*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
67*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode synchronize(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
68*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
69*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
70*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
71*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode beginTimer(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
72*d71ae5a4SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
73a2158755SJunchao Zhang };
74a2158755SJunchao Zhang 
750e6b6b59SJacob Faibussowitsch } // namespace impl
7617f48955SJacob Faibussowitsch 
770e6b6b59SJacob Faibussowitsch } // namespace sycl
7817f48955SJacob Faibussowitsch 
790e6b6b59SJacob Faibussowitsch } // namespace device
8017f48955SJacob Faibussowitsch 
81a2158755SJunchao Zhang } // namespace Petsc
82a2158755SJunchao Zhang 
83*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx)
84*d71ae5a4SJacob Faibussowitsch {
850e6b6b59SJacob Faibussowitsch   using namespace Petsc::device::sycl::impl;
8617f48955SJacob Faibussowitsch 
8717f48955SJacob Faibussowitsch   static const DeviceContext syclctx;
88a2158755SJunchao Zhang 
89a2158755SJunchao Zhang   PetscFunctionBegin;
9017f48955SJacob Faibussowitsch   dctx->data = new DeviceContext::PetscDeviceContext_IMPLS();
919566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(dctx->ops, &syclctx.ops, sizeof(syclctx.ops)));
92a2158755SJunchao Zhang   PetscFunctionReturn(0);
93a2158755SJunchao Zhang }
94