10e6b6b59SJacob Faibussowitsch #include "sycldevice.hpp" 2a2158755SJunchao Zhang #include <CL/sycl.hpp> 3a2158755SJunchao Zhang 4d71ae5a4SJacob Faibussowitsch namespace Petsc 5d71ae5a4SJacob Faibussowitsch { 6a2158755SJunchao Zhang 7d71ae5a4SJacob Faibussowitsch namespace device 8d71ae5a4SJacob Faibussowitsch { 917f48955SJacob Faibussowitsch 10d71ae5a4SJacob Faibussowitsch namespace sycl 11d71ae5a4SJacob Faibussowitsch { 1217f48955SJacob Faibussowitsch 13d71ae5a4SJacob Faibussowitsch namespace impl 14d71ae5a4SJacob Faibussowitsch { 1517f48955SJacob Faibussowitsch 169371c9d4SSatish Balay class DeviceContext { 17a2158755SJunchao Zhang public: 18a2158755SJunchao Zhang struct PetscDeviceContext_IMPLS { 190e6b6b59SJacob Faibussowitsch ::sycl::event event; 200e6b6b59SJacob Faibussowitsch ::sycl::event begin; // timer-only 210e6b6b59SJacob Faibussowitsch ::sycl::event end; // timer-only 22a2158755SJunchao Zhang #if PetscDefined(USE_DEBUG) 23a2158755SJunchao Zhang PetscBool timerInUse; 24a2158755SJunchao Zhang #endif 25a2158755SJunchao Zhang }; 26a2158755SJunchao Zhang 27a2158755SJunchao Zhang private: 28a2158755SJunchao Zhang static bool initialized_; 29a2158755SJunchao Zhang 30*089fb57cSJacob Faibussowitsch static PetscErrorCode finalize_() noexcept 31d71ae5a4SJacob Faibussowitsch { 32a2158755SJunchao Zhang PetscFunctionBegin; 33a2158755SJunchao Zhang initialized_ = false; 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35a2158755SJunchao Zhang } 36a2158755SJunchao Zhang 37*089fb57cSJacob Faibussowitsch static PetscErrorCode initialize_(PetscInt id, DeviceContext *dci) noexcept 38d71ae5a4SJacob Faibussowitsch { 39a2158755SJunchao Zhang PetscFunctionBegin; 409566063dSJacob Faibussowitsch PetscCall(PetscDeviceCheckDeviceCount_Internal(id)); 41a2158755SJunchao Zhang if (!initialized_) { 42a2158755SJunchao Zhang initialized_ = true; 439566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(finalize_)); 44a2158755SJunchao Zhang } 453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 46a2158755SJunchao Zhang } 47a2158755SJunchao Zhang 48a2158755SJunchao Zhang public: 493f675fcfSPierre Jolivet const struct _DeviceContextOps ops = {destroy, changeStreamType, setUp, query, waitForContext, synchronize, getBlasHandle, getSolverHandle, getStreamHandle, beginTimer, endTimer, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; 50a2158755SJunchao Zhang 51a2158755SJunchao Zhang // default constructor 5217f48955SJacob Faibussowitsch DeviceContext() noexcept = default; 53a2158755SJunchao Zhang 54a2158755SJunchao Zhang // All of these functions MUST be static in order to be callable from C, otherwise they 55a2158755SJunchao Zhang // get the implicit 'this' pointer tacked on 56*089fb57cSJacob Faibussowitsch static PetscErrorCode destroy(PetscDeviceContext dctx) noexcept 57d71ae5a4SJacob Faibussowitsch { 58a2158755SJunchao Zhang PetscFunctionBegin; 59a2158755SJunchao Zhang delete static_cast<PetscDeviceContext_IMPLS *>(dctx->data); 60a2158755SJunchao Zhang dctx->data = nullptr; 613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 62a2158755SJunchao Zhang }; 63*089fb57cSJacob Faibussowitsch static PetscErrorCode changeStreamType(PetscDeviceContext, PetscStreamType) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 64*089fb57cSJacob Faibussowitsch static PetscErrorCode setUp(PetscDeviceContext) noexcept { return PETSC_SUCCESS; }; // Nothing to setup 65*089fb57cSJacob Faibussowitsch static PetscErrorCode query(PetscDeviceContext, PetscBool *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 66*089fb57cSJacob Faibussowitsch static PetscErrorCode waitForContext(PetscDeviceContext, PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 67*089fb57cSJacob Faibussowitsch static PetscErrorCode synchronize(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 68*089fb57cSJacob Faibussowitsch static PetscErrorCode getBlasHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 69*089fb57cSJacob Faibussowitsch static PetscErrorCode getSolverHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 70*089fb57cSJacob Faibussowitsch static PetscErrorCode getStreamHandle(PetscDeviceContext, void *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 71*089fb57cSJacob Faibussowitsch static PetscErrorCode beginTimer(PetscDeviceContext) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 72*089fb57cSJacob Faibussowitsch static PetscErrorCode endTimer(PetscDeviceContext, PetscLogDouble *) noexcept { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Not implemented"); }; 73a2158755SJunchao Zhang }; 74a2158755SJunchao Zhang 750e6b6b59SJacob Faibussowitsch } // namespace impl 7617f48955SJacob Faibussowitsch 770e6b6b59SJacob Faibussowitsch } // namespace sycl 7817f48955SJacob Faibussowitsch 790e6b6b59SJacob Faibussowitsch } // namespace device 8017f48955SJacob Faibussowitsch 81a2158755SJunchao Zhang } // namespace Petsc 82a2158755SJunchao Zhang 83d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceContextCreate_SYCL(PetscDeviceContext dctx) 84d71ae5a4SJacob Faibussowitsch { 850e6b6b59SJacob Faibussowitsch using namespace Petsc::device::sycl::impl; 8617f48955SJacob Faibussowitsch 8717f48955SJacob Faibussowitsch static const DeviceContext syclctx; 88a2158755SJunchao Zhang 89a2158755SJunchao Zhang PetscFunctionBegin; 9017f48955SJacob Faibussowitsch dctx->data = new DeviceContext::PetscDeviceContext_IMPLS(); 919566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(dctx->ops, &syclctx.ops, sizeof(syclctx.ops))); 923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 93a2158755SJunchao Zhang } 94