10e6b6b59SJacob Faibussowitsch #ifndef PETSCSYCLDEVICE_HPP 20e6b6b59SJacob Faibussowitsch #define PETSCSYCLDEVICE_HPP 30e6b6b59SJacob Faibussowitsch 40e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 50e6b6b59SJacob Faibussowitsch #include "../impldevicebase.hpp" /* I "petscdevice.h" */ 60e6b6b59SJacob Faibussowitsch 70e6b6b59SJacob Faibussowitsch #include <array> 80e6b6b59SJacob Faibussowitsch 9*d71ae5a4SJacob Faibussowitsch namespace Petsc 10*d71ae5a4SJacob Faibussowitsch { 110e6b6b59SJacob Faibussowitsch 12*d71ae5a4SJacob Faibussowitsch namespace device 13*d71ae5a4SJacob Faibussowitsch { 140e6b6b59SJacob Faibussowitsch 15*d71ae5a4SJacob Faibussowitsch namespace sycl 16*d71ae5a4SJacob Faibussowitsch { 170e6b6b59SJacob Faibussowitsch 180e6b6b59SJacob 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 190e6b6b59SJacob Faibussowitsch #define PETSC_SYCL_DEVICE_NONE -3 200e6b6b59SJacob Faibussowitsch 210e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device> { 220e6b6b59SJacob Faibussowitsch public: 230e6b6b59SJacob Faibussowitsch PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device); 240e6b6b59SJacob Faibussowitsch 250e6b6b59SJacob Faibussowitsch ~Device() { auto PETSC_UNUSED _ = finalize_(); } 260e6b6b59SJacob Faibussowitsch 270e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept; 280e6b6b59SJacob Faibussowitsch 290e6b6b59SJacob Faibussowitsch private: 300e6b6b59SJacob Faibussowitsch // opaque class representing a single device instance 310e6b6b59SJacob Faibussowitsch class DeviceInternal; 320e6b6b59SJacob Faibussowitsch 330e6b6b59SJacob Faibussowitsch // currently stores sycl host and gpu devices 340e6b6b59SJacob Faibussowitsch static std::array<DeviceInternal *, PETSC_DEVICE_MAX_DEVICES> devices_array_; 350e6b6b59SJacob Faibussowitsch static DeviceInternal **devices_; // alias to devices_array_, but shifted to support devices_[-1] for sycl host device 360e6b6b59SJacob Faibussowitsch 370e6b6b59SJacob Faibussowitsch // this rank's default device. If equals to PETSC_SYCL_DEVICE_NONE, then all sycl devices are disabled 380e6b6b59SJacob Faibussowitsch static int defaultDevice_; 390e6b6b59SJacob Faibussowitsch 400e6b6b59SJacob Faibussowitsch // have we tried looking for devices 410e6b6b59SJacob Faibussowitsch static bool initialized_; 420e6b6b59SJacob Faibussowitsch 430e6b6b59SJacob Faibussowitsch // clean-up 440e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode finalize_() noexcept; 450e6b6b59SJacob Faibussowitsch 460e6b6b59SJacob Faibussowitsch PETSC_CXX_COMPAT_DECL(constexpr PetscDeviceType PETSC_DEVICE_IMPL_()) { return PETSC_DEVICE_SYCL; } 470e6b6b59SJacob Faibussowitsch PETSC_NODISCARD PetscErrorCode init_device_id_(PetscInt *) const noexcept; 480e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept; 490e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept; 500e6b6b59SJacob Faibussowitsch }; 510e6b6b59SJacob Faibussowitsch 520e6b6b59SJacob Faibussowitsch } // namespace sycl 530e6b6b59SJacob Faibussowitsch 540e6b6b59SJacob Faibussowitsch } // namespace device 550e6b6b59SJacob Faibussowitsch 560e6b6b59SJacob Faibussowitsch } // namespace Petsc 570e6b6b59SJacob Faibussowitsch 580e6b6b59SJacob Faibussowitsch #endif // __cplusplus 590e6b6b59SJacob Faibussowitsch 600e6b6b59SJacob Faibussowitsch #endif /* PETSCSYCLDEVICE_HPP */ 61