1a2158755SJunchao Zhang #include "../../interface/sycldevice.hpp" 2a2158755SJunchao Zhang #include <CL/sycl.hpp> 3a2158755SJunchao Zhang 4*9371c9d4SSatish Balay namespace Petsc { 5a2158755SJunchao Zhang 6*9371c9d4SSatish Balay namespace Device { 717f48955SJacob Faibussowitsch 8*9371c9d4SSatish Balay namespace SYCL { 917f48955SJacob Faibussowitsch 10*9371c9d4SSatish Balay namespace Impl { 1117f48955SJacob Faibussowitsch 12*9371c9d4SSatish Balay class DeviceContext { 13a2158755SJunchao Zhang public: 14a2158755SJunchao Zhang struct PetscDeviceContext_IMPLS { 15a2158755SJunchao Zhang sycl::event event; 16a2158755SJunchao Zhang sycl::event begin; // timer-only 17a2158755SJunchao Zhang sycl::event end; // timer-only 18a2158755SJunchao Zhang #if PetscDefined(USE_DEBUG) 19a2158755SJunchao Zhang PetscBool timerInUse; 20a2158755SJunchao Zhang #endif 21a2158755SJunchao Zhang }; 22a2158755SJunchao Zhang 23a2158755SJunchao Zhang private: 24a2158755SJunchao Zhang static bool initialized_; 25a2158755SJunchao Zhang 26*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode finalize_() noexcept { 27a2158755SJunchao Zhang PetscFunctionBegin; 28a2158755SJunchao Zhang initialized_ = false; 29a2158755SJunchao Zhang PetscFunctionReturn(0); 30a2158755SJunchao Zhang } 31a2158755SJunchao Zhang 32*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode initialize_(PetscInt id, DeviceContext *dci) noexcept { 33a2158755SJunchao Zhang PetscFunctionBegin; 349566063dSJacob Faibussowitsch PetscCall(PetscDeviceCheckDeviceCount_Internal(id)); 35a2158755SJunchao Zhang if (!initialized_) { 36a2158755SJunchao Zhang initialized_ = true; 379566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(finalize_)); 38a2158755SJunchao Zhang } 39a2158755SJunchao Zhang PetscFunctionReturn(0); 40a2158755SJunchao Zhang } 41a2158755SJunchao Zhang 42a2158755SJunchao Zhang public: 43*9371c9d4SSatish Balay const struct _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer}; 44a2158755SJunchao Zhang 45a2158755SJunchao Zhang // default constructor 4617f48955SJacob Faibussowitsch DeviceContext() noexcept = default; 47a2158755SJunchao Zhang 48a2158755SJunchao Zhang // All of these functions MUST be static in order to be callable from C, otherwise they 49a2158755SJunchao Zhang // get the implicit 'this' pointer tacked on 50*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode destroy(PetscDeviceContext dctx) noexcept { 51a2158755SJunchao Zhang PetscFunctionBegin; 52a2158755SJunchao Zhang delete static_cast<PetscDeviceContext_IMPLS *>(dctx->data); 53a2158755SJunchao Zhang dctx->data = nullptr; 54a2158755SJunchao Zhang PetscFunctionReturn(0); 55a2158755SJunchao Zhang }; 56*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { 57*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 58*9371c9d4SSatish Balay }; 59*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode setUp(PetscDeviceContext) noexcept { 60*9371c9d4SSatish Balay return 0; 61*9371c9d4SSatish Balay }; // Nothing to setup 62*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept { 63*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 64*9371c9d4SSatish Balay }; 65*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { 66*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 67*9371c9d4SSatish Balay }; 68*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode synchronize(PetscDeviceContext) noexcept { 69*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 70*9371c9d4SSatish Balay }; 71*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept { 72*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 73*9371c9d4SSatish Balay }; 74*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept { 75*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 76*9371c9d4SSatish Balay }; 77*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept { 78*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 79*9371c9d4SSatish Balay }; 80*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode beginTimer(PetscDeviceContext) noexcept { 81*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 82*9371c9d4SSatish Balay }; 83*9371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *) noexcept { 84*9371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 85*9371c9d4SSatish Balay }; 86a2158755SJunchao Zhang }; 87a2158755SJunchao Zhang 8817f48955SJacob Faibussowitsch } // namespace Impl 8917f48955SJacob Faibussowitsch 9017f48955SJacob Faibussowitsch } // namespace SYCL 9117f48955SJacob Faibussowitsch 9217f48955SJacob Faibussowitsch } // namespace Device 9317f48955SJacob Faibussowitsch 94a2158755SJunchao Zhang } // namespace Petsc 95a2158755SJunchao Zhang 96*9371c9d4SSatish Balay PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx) { 9717f48955SJacob Faibussowitsch using namespace Petsc::Device::SYCL::Impl; 9817f48955SJacob Faibussowitsch 9917f48955SJacob Faibussowitsch static const DeviceContext syclctx; 100a2158755SJunchao Zhang 101a2158755SJunchao Zhang PetscFunctionBegin; 10217f48955SJacob Faibussowitsch dctx->data = new DeviceContext::PetscDeviceContext_IMPLS(); 1039566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(dctx->ops, &syclctx.ops, sizeof(syclctx.ops))); 104a2158755SJunchao Zhang PetscFunctionReturn(0); 105a2158755SJunchao Zhang } 106