xref: /petsc/src/sys/objects/device/impls/sycl/syclcontext.sycl.cxx (revision 089fb57c6fc1c43c66aab835b8f02b081bcf19ea)
10e6b6b59SJacob Faibussowitsch #include "sycldevice.hpp"
2a2158755SJunchao Zhang #include <CL/sycl.hpp>
3a2158755SJunchao Zhang 
4d71ae5a4SJacob Faibussowitsch namespace Petsc
5d71ae5a4SJacob Faibussowitsch {
6a2158755SJunchao Zhang 
7d71ae5a4SJacob Faibussowitsch namespace device
8d71ae5a4SJacob Faibussowitsch {
917f48955SJacob Faibussowitsch 
10d71ae5a4SJacob Faibussowitsch namespace sycl
11d71ae5a4SJacob Faibussowitsch {
1217f48955SJacob Faibussowitsch 
13d71ae5a4SJacob Faibussowitsch namespace impl
14d71ae5a4SJacob 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*089fb57cSJacob Faibussowitsch   static PetscErrorCode finalize_() noexcept
31d71ae5a4SJacob Faibussowitsch   {
32a2158755SJunchao Zhang     PetscFunctionBegin;
33a2158755SJunchao Zhang     initialized_ = false;
343ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
35a2158755SJunchao Zhang   }
36a2158755SJunchao Zhang 
37*089fb57cSJacob Faibussowitsch   static PetscErrorCode initialize_(PetscInt id, DeviceContext *dci) noexcept
38d71ae5a4SJacob 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     }
453ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
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*089fb57cSJacob Faibussowitsch   static PetscErrorCode destroy(PetscDeviceContext dctx) noexcept
57d71ae5a4SJacob Faibussowitsch   {
58a2158755SJunchao Zhang     PetscFunctionBegin;
59a2158755SJunchao Zhang     delete static_cast<PetscDeviceContext_IMPLS *>(dctx->data);
60a2158755SJunchao Zhang     dctx->data = nullptr;
613ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
62a2158755SJunchao Zhang   };
63*089fb57cSJacob Faibussowitsch   static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
64*089fb57cSJacob Faibussowitsch   static PetscErrorCode setUp(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }; // Nothing to setup
65*089fb57cSJacob Faibussowitsch   static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
66*089fb57cSJacob Faibussowitsch   static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
67*089fb57cSJacob Faibussowitsch   static PetscErrorCode synchronize(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
68*089fb57cSJacob Faibussowitsch   static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
69*089fb57cSJacob Faibussowitsch   static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
70*089fb57cSJacob Faibussowitsch   static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
71*089fb57cSJacob Faibussowitsch   static PetscErrorCode beginTimer(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); };
72*089fb57cSJacob Faibussowitsch   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 
83d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx)
84d71ae5a4SJacob 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)));
923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
93a2158755SJunchao Zhang }
94