1*a4963045SJacob Faibussowitsch #pragma once 20e6b6b59SJacob Faibussowitsch 30e6b6b59SJacob Faibussowitsch #include <petsc/private/cupminterface.hpp> 40e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/memory.hpp> 50e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/array.hpp> 60e6b6b59SJacob Faibussowitsch 70e6b6b59SJacob Faibussowitsch #include "../impldevicebase.hpp" /* I "petscdevice.h" */ 80e6b6b59SJacob Faibussowitsch 9d71ae5a4SJacob Faibussowitsch namespace Petsc 10d71ae5a4SJacob Faibussowitsch { 110e6b6b59SJacob Faibussowitsch 12d71ae5a4SJacob Faibussowitsch namespace device 13d71ae5a4SJacob Faibussowitsch { 140e6b6b59SJacob Faibussowitsch 15d71ae5a4SJacob Faibussowitsch namespace cupm 16d71ae5a4SJacob Faibussowitsch { 170e6b6b59SJacob Faibussowitsch 180e6b6b59SJacob Faibussowitsch #if defined(PETSC_CUPM_DEVICE_NONE) 190e6b6b59SJacob Faibussowitsch #error redefinition of PETSC_CUPM_DEVICE_NONE 200e6b6b59SJacob Faibussowitsch #endif 210e6b6b59SJacob Faibussowitsch 220e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEVICE_NONE -3 230e6b6b59SJacob Faibussowitsch 240e6b6b59SJacob Faibussowitsch template <DeviceType T> 250e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device<T>>, impl::Interface<T> { 260e6b6b59SJacob Faibussowitsch public: 270e6b6b59SJacob Faibussowitsch PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device<T>); 2896a4b4d9SJacob Faibussowitsch PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(T); 290e6b6b59SJacob Faibussowitsch 30089fb57cSJacob Faibussowitsch static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept; 310e6b6b59SJacob Faibussowitsch 320e6b6b59SJacob Faibussowitsch private: 330e6b6b59SJacob Faibussowitsch // opaque class representing a single device 340e6b6b59SJacob Faibussowitsch class DeviceInternal; 350e6b6b59SJacob Faibussowitsch 360e6b6b59SJacob Faibussowitsch // all known devices 370e6b6b59SJacob Faibussowitsch using devices_type = std::array<std::unique_ptr<DeviceInternal>, PETSC_DEVICE_MAX_DEVICES>; 380e6b6b59SJacob Faibussowitsch static devices_type devices_; 390e6b6b59SJacob Faibussowitsch 400e6b6b59SJacob Faibussowitsch // this ranks default device, if < 0 then devices are specifically disabled 410e6b6b59SJacob Faibussowitsch static int defaultDevice_; 420e6b6b59SJacob Faibussowitsch 430e6b6b59SJacob Faibussowitsch // have we tried looking for devices 440e6b6b59SJacob Faibussowitsch static bool initialized_; 450e6b6b59SJacob Faibussowitsch 460e6b6b59SJacob Faibussowitsch // clean-up 47089fb57cSJacob Faibussowitsch static PetscErrorCode finalize_() noexcept; 480e6b6b59SJacob Faibussowitsch PETSC_DEVICE_IMPL_()490e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static constexpr PetscDeviceType PETSC_DEVICE_IMPL_() noexcept { return PETSC_DEVICE_CUPM(); } 500e6b6b59SJacob Faibussowitsch 51089fb57cSJacob Faibussowitsch PetscErrorCode init_device_id_(PetscInt *) const noexcept; 52089fb57cSJacob Faibussowitsch static PetscErrorCode configure_device_(PetscDevice) noexcept; 53089fb57cSJacob Faibussowitsch static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept; 54089fb57cSJacob Faibussowitsch static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept; 550e6b6b59SJacob Faibussowitsch }; 560e6b6b59SJacob Faibussowitsch 570e6b6b59SJacob Faibussowitsch // define static variables 580e6b6b59SJacob Faibussowitsch template <DeviceType T> 590e6b6b59SJacob Faibussowitsch typename Device<T>::devices_type Device<T>::devices_ = {}; 600e6b6b59SJacob Faibussowitsch 610e6b6b59SJacob Faibussowitsch template <DeviceType T> 620e6b6b59SJacob Faibussowitsch int Device<T>::defaultDevice_ = PETSC_CUPM_DEVICE_NONE; 630e6b6b59SJacob Faibussowitsch 640e6b6b59SJacob Faibussowitsch template <DeviceType T> 650e6b6b59SJacob Faibussowitsch bool Device<T>::initialized_ = false; 660e6b6b59SJacob Faibussowitsch 670e6b6b59SJacob Faibussowitsch } // namespace cupm 680e6b6b59SJacob Faibussowitsch 690e6b6b59SJacob Faibussowitsch } // namespace device 700e6b6b59SJacob Faibussowitsch 710e6b6b59SJacob Faibussowitsch } // namespace Petsc 72