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