10e6b6b59SJacob Faibussowitsch #ifndef PETSCCUPMDEVICE_HPP 20e6b6b59SJacob Faibussowitsch #define PETSCCUPMDEVICE_HPP 30e6b6b59SJacob Faibussowitsch 40e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 50e6b6b59SJacob Faibussowitsch #include <petsc/private/cupminterface.hpp> 60e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/memory.hpp> 70e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/array.hpp> 80e6b6b59SJacob Faibussowitsch 90e6b6b59SJacob Faibussowitsch #include "../impldevicebase.hpp" /* I "petscdevice.h" */ 100e6b6b59SJacob Faibussowitsch 11d71ae5a4SJacob Faibussowitsch namespace Petsc 12d71ae5a4SJacob Faibussowitsch { 130e6b6b59SJacob Faibussowitsch 14d71ae5a4SJacob Faibussowitsch namespace device 15d71ae5a4SJacob Faibussowitsch { 160e6b6b59SJacob Faibussowitsch 17d71ae5a4SJacob Faibussowitsch namespace cupm 18d71ae5a4SJacob Faibussowitsch { 190e6b6b59SJacob Faibussowitsch 200e6b6b59SJacob Faibussowitsch #if defined(PETSC_CUPM_DEVICE_NONE) 210e6b6b59SJacob Faibussowitsch #error redefinition of PETSC_CUPM_DEVICE_NONE 220e6b6b59SJacob Faibussowitsch #endif 230e6b6b59SJacob Faibussowitsch 240e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEVICE_NONE -3 250e6b6b59SJacob Faibussowitsch 260e6b6b59SJacob Faibussowitsch template <DeviceType T> 270e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device<T>>, impl::Interface<T> { 280e6b6b59SJacob Faibussowitsch public: 290e6b6b59SJacob Faibussowitsch PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device<T>); 30*96a4b4d9SJacob Faibussowitsch PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(T); 310e6b6b59SJacob Faibussowitsch 32089fb57cSJacob Faibussowitsch static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept; 330e6b6b59SJacob Faibussowitsch 340e6b6b59SJacob Faibussowitsch private: 350e6b6b59SJacob Faibussowitsch // opaque class representing a single device 360e6b6b59SJacob Faibussowitsch class DeviceInternal; 370e6b6b59SJacob Faibussowitsch 380e6b6b59SJacob Faibussowitsch // all known devices 390e6b6b59SJacob Faibussowitsch using devices_type = std::array<std::unique_ptr<DeviceInternal>, PETSC_DEVICE_MAX_DEVICES>; 400e6b6b59SJacob Faibussowitsch static devices_type devices_; 410e6b6b59SJacob Faibussowitsch 420e6b6b59SJacob Faibussowitsch // this ranks default device, if < 0 then devices are specifically disabled 430e6b6b59SJacob Faibussowitsch static int defaultDevice_; 440e6b6b59SJacob Faibussowitsch 450e6b6b59SJacob Faibussowitsch // have we tried looking for devices 460e6b6b59SJacob Faibussowitsch static bool initialized_; 470e6b6b59SJacob Faibussowitsch 480e6b6b59SJacob Faibussowitsch // clean-up 49089fb57cSJacob Faibussowitsch static PetscErrorCode finalize_() noexcept; 500e6b6b59SJacob Faibussowitsch 510e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static constexpr PetscDeviceType PETSC_DEVICE_IMPL_() noexcept { return PETSC_DEVICE_CUPM(); } 520e6b6b59SJacob Faibussowitsch 53089fb57cSJacob Faibussowitsch PetscErrorCode init_device_id_(PetscInt *) const noexcept; 54089fb57cSJacob Faibussowitsch static PetscErrorCode configure_device_(PetscDevice) noexcept; 55089fb57cSJacob Faibussowitsch static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept; 56089fb57cSJacob Faibussowitsch static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept; 570e6b6b59SJacob Faibussowitsch }; 580e6b6b59SJacob Faibussowitsch 590e6b6b59SJacob Faibussowitsch // define static variables 600e6b6b59SJacob Faibussowitsch template <DeviceType T> 610e6b6b59SJacob Faibussowitsch typename Device<T>::devices_type Device<T>::devices_ = {}; 620e6b6b59SJacob Faibussowitsch 630e6b6b59SJacob Faibussowitsch template <DeviceType T> 640e6b6b59SJacob Faibussowitsch int Device<T>::defaultDevice_ = PETSC_CUPM_DEVICE_NONE; 650e6b6b59SJacob Faibussowitsch 660e6b6b59SJacob Faibussowitsch template <DeviceType T> 670e6b6b59SJacob Faibussowitsch bool Device<T>::initialized_ = false; 680e6b6b59SJacob Faibussowitsch 690e6b6b59SJacob Faibussowitsch } // namespace cupm 700e6b6b59SJacob Faibussowitsch 710e6b6b59SJacob Faibussowitsch } // namespace device 720e6b6b59SJacob Faibussowitsch 730e6b6b59SJacob Faibussowitsch } // namespace Petsc 740e6b6b59SJacob Faibussowitsch 750e6b6b59SJacob Faibussowitsch #endif // __cplusplus 760e6b6b59SJacob Faibussowitsch 770e6b6b59SJacob Faibussowitsch #endif /* PETSCCUPMDEVICE_HPP */ 78