xref: /petsc/src/sys/objects/device/impls/cupm/cupmdevice.hpp (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
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