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