xref: /petsc/src/sys/objects/device/impls/sycl/syclcontext.sycl.cxx (revision 9566063d113dddea24716c546802770db7481bc0)
1a2158755SJunchao Zhang #include "../../interface/sycldevice.hpp"
2a2158755SJunchao Zhang #include <CL/sycl.hpp>
3a2158755SJunchao Zhang 
4a2158755SJunchao Zhang namespace Petsc
5a2158755SJunchao Zhang {
6a2158755SJunchao Zhang 
717f48955SJacob Faibussowitsch namespace Device
817f48955SJacob Faibussowitsch {
917f48955SJacob Faibussowitsch 
1017f48955SJacob Faibussowitsch namespace SYCL
1117f48955SJacob Faibussowitsch {
1217f48955SJacob Faibussowitsch 
1317f48955SJacob Faibussowitsch namespace Impl
1417f48955SJacob Faibussowitsch {
1517f48955SJacob Faibussowitsch 
1617f48955SJacob 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 
3817f48955SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode initialize_(PetscInt id, DeviceContext *dci) noexcept
39a2158755SJunchao Zhang   {
40a2158755SJunchao Zhang     PetscErrorCode ierr;
41a2158755SJunchao Zhang 
42a2158755SJunchao Zhang     PetscFunctionBegin;
43*9566063dSJacob Faibussowitsch     PetscCall(PetscDeviceCheckDeviceCount_Internal(id));
44a2158755SJunchao Zhang     if (!initialized_) {
45a2158755SJunchao Zhang       initialized_ = true;
46*9566063dSJacob Faibussowitsch       PetscCall(PetscRegisterFinalize(finalize_));
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,
6117f48955SJacob Faibussowitsch     getStreamHandle,
62a2158755SJunchao Zhang     beginTimer,
63a2158755SJunchao Zhang     endTimer
64a2158755SJunchao Zhang   };
65a2158755SJunchao Zhang 
66a2158755SJunchao Zhang   // default constructor
6717f48955SJacob 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"); };
8517f48955SJacob 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 
9017f48955SJacob Faibussowitsch } // namespace Impl
9117f48955SJacob Faibussowitsch 
9217f48955SJacob Faibussowitsch } // namespace SYCL
9317f48955SJacob Faibussowitsch 
9417f48955SJacob Faibussowitsch } // namespace Device
9517f48955SJacob Faibussowitsch 
96a2158755SJunchao Zhang } // namespace Petsc
97a2158755SJunchao Zhang 
98a2158755SJunchao Zhang PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx)
99a2158755SJunchao Zhang {
10017f48955SJacob Faibussowitsch   using namespace Petsc::Device::SYCL::Impl;
10117f48955SJacob Faibussowitsch 
102a2158755SJunchao Zhang   PetscErrorCode             ierr;
10317f48955SJacob Faibussowitsch   static const DeviceContext syclctx;
104a2158755SJunchao Zhang 
105a2158755SJunchao Zhang   PetscFunctionBegin;
10617f48955SJacob Faibussowitsch   dctx->data = new DeviceContext::PetscDeviceContext_IMPLS();
107*9566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(dctx->ops,&syclctx.ops,sizeof(syclctx.ops)));
108a2158755SJunchao Zhang   PetscFunctionReturn(0);
109a2158755SJunchao Zhang }
110