10e6b6b59SJacob Faibussowitsch #include "sycldevice.hpp" 2a2158755SJunchao Zhang #include <CL/sycl.hpp> 3a2158755SJunchao Zhang 49371c9d4SSatish Balay namespace Petsc { 5a2158755SJunchao Zhang 60e6b6b59SJacob Faibussowitsch namespace device { 717f48955SJacob Faibussowitsch 80e6b6b59SJacob Faibussowitsch namespace sycl { 917f48955SJacob Faibussowitsch 100e6b6b59SJacob Faibussowitsch namespace impl { 1117f48955SJacob Faibussowitsch 129371c9d4SSatish Balay class DeviceContext { 13a2158755SJunchao Zhang public: 14a2158755SJunchao Zhang struct PetscDeviceContext_IMPLS { 150e6b6b59SJacob Faibussowitsch ::sycl::event event; 160e6b6b59SJacob Faibussowitsch ::sycl::event begin; // timer-only 170e6b6b59SJacob Faibussowitsch ::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 269371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode finalize_() noexcept { 27a2158755SJunchao Zhang PetscFunctionBegin; 28a2158755SJunchao Zhang initialized_ = false; 29a2158755SJunchao Zhang PetscFunctionReturn(0); 30a2158755SJunchao Zhang } 31a2158755SJunchao Zhang 329371c9d4SSatish 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*3f675fcfSPierre Jolivet const struct _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; 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 509371c9d4SSatish 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 }; 569371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { 579371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 589371c9d4SSatish Balay }; 599371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode setUp(PetscDeviceContext) noexcept { 609371c9d4SSatish Balay return 0; 619371c9d4SSatish Balay }; // Nothing to setup 629371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept { 639371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 649371c9d4SSatish Balay }; 659371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { 669371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 679371c9d4SSatish Balay }; 689371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode synchronize(PetscDeviceContext) noexcept { 699371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 709371c9d4SSatish Balay }; 719371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept { 729371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 739371c9d4SSatish Balay }; 749371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept { 759371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 769371c9d4SSatish Balay }; 779371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept { 789371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 799371c9d4SSatish Balay }; 809371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode beginTimer(PetscDeviceContext) noexcept { 819371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 829371c9d4SSatish Balay }; 839371c9d4SSatish Balay PETSC_NODISCARD static PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *) noexcept { 849371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); 859371c9d4SSatish Balay }; 86a2158755SJunchao Zhang }; 87a2158755SJunchao Zhang 880e6b6b59SJacob Faibussowitsch } // namespace impl 8917f48955SJacob Faibussowitsch 900e6b6b59SJacob Faibussowitsch } // namespace sycl 9117f48955SJacob Faibussowitsch 920e6b6b59SJacob Faibussowitsch } // namespace device 9317f48955SJacob Faibussowitsch 94a2158755SJunchao Zhang } // namespace Petsc 95a2158755SJunchao Zhang 969371c9d4SSatish Balay PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx) { 970e6b6b59SJacob 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