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