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