1*0e6b6b59SJacob Faibussowitsch #ifndef PETSCSYCLDEVICE_HPP 2*0e6b6b59SJacob Faibussowitsch #define PETSCSYCLDEVICE_HPP 3*0e6b6b59SJacob Faibussowitsch 4*0e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 5*0e6b6b59SJacob Faibussowitsch #include "../impldevicebase.hpp" /* I "petscdevice.h" */ 6*0e6b6b59SJacob Faibussowitsch 7*0e6b6b59SJacob Faibussowitsch #include <array> 8*0e6b6b59SJacob Faibussowitsch 9*0e6b6b59SJacob Faibussowitsch namespace Petsc { 10*0e6b6b59SJacob Faibussowitsch 11*0e6b6b59SJacob Faibussowitsch namespace device { 12*0e6b6b59SJacob Faibussowitsch 13*0e6b6b59SJacob Faibussowitsch namespace sycl { 14*0e6b6b59SJacob Faibussowitsch 15*0e6b6b59SJacob Faibussowitsch #define PETSC_SYCL_DEVICE_HOST -1 // Note -1 is also used by PETSC_DECIDE, so user needs to pass -2 to explicitly select the host 16*0e6b6b59SJacob Faibussowitsch #define PETSC_SYCL_DEVICE_NONE -3 17*0e6b6b59SJacob Faibussowitsch 18*0e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device> { 19*0e6b6b59SJacob Faibussowitsch public: 20*0e6b6b59SJacob Faibussowitsch PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device); 21*0e6b6b59SJacob Faibussowitsch 22*0e6b6b59SJacob Faibussowitsch ~Device() { auto PETSC_UNUSED _ = finalize_(); } 23*0e6b6b59SJacob Faibussowitsch 24*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept; 25*0e6b6b59SJacob Faibussowitsch 26*0e6b6b59SJacob Faibussowitsch private: 27*0e6b6b59SJacob Faibussowitsch // opaque class representing a single device instance 28*0e6b6b59SJacob Faibussowitsch class DeviceInternal; 29*0e6b6b59SJacob Faibussowitsch 30*0e6b6b59SJacob Faibussowitsch // currently stores sycl host and gpu devices 31*0e6b6b59SJacob Faibussowitsch static std::array<DeviceInternal *, PETSC_DEVICE_MAX_DEVICES> devices_array_; 32*0e6b6b59SJacob Faibussowitsch static DeviceInternal **devices_; // alias to devices_array_, but shifted to support devices_[-1] for sycl host device 33*0e6b6b59SJacob Faibussowitsch 34*0e6b6b59SJacob Faibussowitsch // this rank's default device. If equals to PETSC_SYCL_DEVICE_NONE, then all sycl devices are disabled 35*0e6b6b59SJacob Faibussowitsch static int defaultDevice_; 36*0e6b6b59SJacob Faibussowitsch 37*0e6b6b59SJacob Faibussowitsch // have we tried looking for devices 38*0e6b6b59SJacob Faibussowitsch static bool initialized_; 39*0e6b6b59SJacob Faibussowitsch 40*0e6b6b59SJacob Faibussowitsch // clean-up 41*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode finalize_() noexcept; 42*0e6b6b59SJacob Faibussowitsch 43*0e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(constexpr PetscDeviceType PETSC_DEVICE_IMPL_()) { return PETSC_DEVICE_SYCL; } 44*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD PetscErrorCode init_device_id_(PetscInt *) const noexcept; 45*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept; 46*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept; 47*0e6b6b59SJacob Faibussowitsch }; 48*0e6b6b59SJacob Faibussowitsch 49*0e6b6b59SJacob Faibussowitsch } // namespace sycl 50*0e6b6b59SJacob Faibussowitsch 51*0e6b6b59SJacob Faibussowitsch } // namespace device 52*0e6b6b59SJacob Faibussowitsch 53*0e6b6b59SJacob Faibussowitsch } // namespace Petsc 54*0e6b6b59SJacob Faibussowitsch 55*0e6b6b59SJacob Faibussowitsch #endif // __cplusplus 56*0e6b6b59SJacob Faibussowitsch 57*0e6b6b59SJacob Faibussowitsch #endif /* PETSCSYCLDEVICE_HPP */ 58