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