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