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