1*0e6b6b59SJacob Faibussowitsch #ifndef PETSCCUPMDEVICE_HPP 2*0e6b6b59SJacob Faibussowitsch #define PETSCCUPMDEVICE_HPP 3*0e6b6b59SJacob Faibussowitsch 4*0e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 5*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cupminterface.hpp> 6*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/memory.hpp> 7*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/array.hpp> 8*0e6b6b59SJacob Faibussowitsch 9*0e6b6b59SJacob Faibussowitsch #include "../impldevicebase.hpp" /* I "petscdevice.h" */ 10*0e6b6b59SJacob Faibussowitsch 11*0e6b6b59SJacob Faibussowitsch namespace Petsc { 12*0e6b6b59SJacob Faibussowitsch 13*0e6b6b59SJacob Faibussowitsch namespace device { 14*0e6b6b59SJacob Faibussowitsch 15*0e6b6b59SJacob Faibussowitsch namespace cupm { 16*0e6b6b59SJacob Faibussowitsch 17*0e6b6b59SJacob Faibussowitsch #if defined(PETSC_CUPM_DEVICE_NONE) 18*0e6b6b59SJacob Faibussowitsch #error redefinition of PETSC_CUPM_DEVICE_NONE 19*0e6b6b59SJacob Faibussowitsch #endif 20*0e6b6b59SJacob Faibussowitsch 21*0e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEVICE_NONE -3 22*0e6b6b59SJacob Faibussowitsch 23*0e6b6b59SJacob Faibussowitsch template <DeviceType T> 24*0e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device<T>>, impl::Interface<T> { 25*0e6b6b59SJacob Faibussowitsch public: 26*0e6b6b59SJacob Faibussowitsch PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device<T>); 27*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(cupmInterface_t, T); 28*0e6b6b59SJacob Faibussowitsch 29*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept; 30*0e6b6b59SJacob Faibussowitsch 31*0e6b6b59SJacob Faibussowitsch private: 32*0e6b6b59SJacob Faibussowitsch // opaque class representing a single device 33*0e6b6b59SJacob Faibussowitsch class DeviceInternal; 34*0e6b6b59SJacob Faibussowitsch 35*0e6b6b59SJacob Faibussowitsch // all known devices 36*0e6b6b59SJacob Faibussowitsch using devices_type = std::array<std::unique_ptr<DeviceInternal>, PETSC_DEVICE_MAX_DEVICES>; 37*0e6b6b59SJacob Faibussowitsch static devices_type devices_; 38*0e6b6b59SJacob Faibussowitsch 39*0e6b6b59SJacob Faibussowitsch // this ranks default device, if < 0 then devices are specifically disabled 40*0e6b6b59SJacob Faibussowitsch static int defaultDevice_; 41*0e6b6b59SJacob Faibussowitsch 42*0e6b6b59SJacob Faibussowitsch // have we tried looking for devices 43*0e6b6b59SJacob Faibussowitsch static bool initialized_; 44*0e6b6b59SJacob Faibussowitsch 45*0e6b6b59SJacob Faibussowitsch // clean-up 46*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode finalize_() noexcept; 47*0e6b6b59SJacob Faibussowitsch 48*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static constexpr PetscDeviceType PETSC_DEVICE_IMPL_() noexcept { return PETSC_DEVICE_CUPM(); } 49*0e6b6b59SJacob Faibussowitsch 50*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD PetscErrorCode init_device_id_(PetscInt *) const noexcept; 51*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode configure_device_(PetscDevice) noexcept; 52*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept; 53*0e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept; 54*0e6b6b59SJacob Faibussowitsch }; 55*0e6b6b59SJacob Faibussowitsch 56*0e6b6b59SJacob Faibussowitsch // define static variables 57*0e6b6b59SJacob Faibussowitsch template <DeviceType T> 58*0e6b6b59SJacob Faibussowitsch typename Device<T>::devices_type Device<T>::devices_ = {}; 59*0e6b6b59SJacob Faibussowitsch 60*0e6b6b59SJacob Faibussowitsch template <DeviceType T> 61*0e6b6b59SJacob Faibussowitsch int Device<T>::defaultDevice_ = PETSC_CUPM_DEVICE_NONE; 62*0e6b6b59SJacob Faibussowitsch 63*0e6b6b59SJacob Faibussowitsch template <DeviceType T> 64*0e6b6b59SJacob Faibussowitsch bool Device<T>::initialized_ = false; 65*0e6b6b59SJacob Faibussowitsch 66*0e6b6b59SJacob Faibussowitsch } // namespace cupm 67*0e6b6b59SJacob Faibussowitsch 68*0e6b6b59SJacob Faibussowitsch } // namespace device 69*0e6b6b59SJacob Faibussowitsch 70*0e6b6b59SJacob Faibussowitsch } // namespace Petsc 71*0e6b6b59SJacob Faibussowitsch 72*0e6b6b59SJacob Faibussowitsch #endif // __cplusplus 73*0e6b6b59SJacob Faibussowitsch 74*0e6b6b59SJacob Faibussowitsch #endif /* PETSCCUPMDEVICE_HPP */ 75