xref: /petsc/src/sys/objects/device/impls/cupm/cupmdevice.hpp (revision 96a4b4d95ea58ea02aff154c6b83fc6968de23ca)
10e6b6b59SJacob Faibussowitsch #ifndef PETSCCUPMDEVICE_HPP
20e6b6b59SJacob Faibussowitsch #define PETSCCUPMDEVICE_HPP
30e6b6b59SJacob Faibussowitsch 
40e6b6b59SJacob Faibussowitsch #if defined(__cplusplus)
50e6b6b59SJacob Faibussowitsch   #include <petsc/private/cupminterface.hpp>
60e6b6b59SJacob Faibussowitsch   #include <petsc/private/cpp/memory.hpp>
70e6b6b59SJacob Faibussowitsch   #include <petsc/private/cpp/array.hpp>
80e6b6b59SJacob Faibussowitsch 
90e6b6b59SJacob Faibussowitsch   #include "../impldevicebase.hpp" /* I "petscdevice.h" */
100e6b6b59SJacob Faibussowitsch 
11d71ae5a4SJacob Faibussowitsch namespace Petsc
12d71ae5a4SJacob Faibussowitsch {
130e6b6b59SJacob Faibussowitsch 
14d71ae5a4SJacob Faibussowitsch namespace device
15d71ae5a4SJacob Faibussowitsch {
160e6b6b59SJacob Faibussowitsch 
17d71ae5a4SJacob Faibussowitsch namespace cupm
18d71ae5a4SJacob Faibussowitsch {
190e6b6b59SJacob Faibussowitsch 
200e6b6b59SJacob Faibussowitsch   #if defined(PETSC_CUPM_DEVICE_NONE)
210e6b6b59SJacob Faibussowitsch     #error redefinition of PETSC_CUPM_DEVICE_NONE
220e6b6b59SJacob Faibussowitsch   #endif
230e6b6b59SJacob Faibussowitsch 
240e6b6b59SJacob Faibussowitsch   #define PETSC_CUPM_DEVICE_NONE -3
250e6b6b59SJacob Faibussowitsch 
260e6b6b59SJacob Faibussowitsch template <DeviceType T>
270e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device<T>>, impl::Interface<T> {
280e6b6b59SJacob Faibussowitsch public:
290e6b6b59SJacob Faibussowitsch   PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device<T>);
30*96a4b4d9SJacob Faibussowitsch   PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(T);
310e6b6b59SJacob Faibussowitsch 
32089fb57cSJacob Faibussowitsch   static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept;
330e6b6b59SJacob Faibussowitsch 
340e6b6b59SJacob Faibussowitsch private:
350e6b6b59SJacob Faibussowitsch   // opaque class representing a single device
360e6b6b59SJacob Faibussowitsch   class DeviceInternal;
370e6b6b59SJacob Faibussowitsch 
380e6b6b59SJacob Faibussowitsch   // all known devices
390e6b6b59SJacob Faibussowitsch   using devices_type = std::array<std::unique_ptr<DeviceInternal>, PETSC_DEVICE_MAX_DEVICES>;
400e6b6b59SJacob Faibussowitsch   static devices_type devices_;
410e6b6b59SJacob Faibussowitsch 
420e6b6b59SJacob Faibussowitsch   // this ranks default device, if < 0  then devices are specifically disabled
430e6b6b59SJacob Faibussowitsch   static int defaultDevice_;
440e6b6b59SJacob Faibussowitsch 
450e6b6b59SJacob Faibussowitsch   // have we tried looking for devices
460e6b6b59SJacob Faibussowitsch   static bool initialized_;
470e6b6b59SJacob Faibussowitsch 
480e6b6b59SJacob Faibussowitsch   // clean-up
49089fb57cSJacob Faibussowitsch   static PetscErrorCode finalize_() noexcept;
500e6b6b59SJacob Faibussowitsch 
510e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static constexpr PetscDeviceType PETSC_DEVICE_IMPL_() noexcept { return PETSC_DEVICE_CUPM(); }
520e6b6b59SJacob Faibussowitsch 
53089fb57cSJacob Faibussowitsch   PetscErrorCode        init_device_id_(PetscInt *) const noexcept;
54089fb57cSJacob Faibussowitsch   static PetscErrorCode configure_device_(PetscDevice) noexcept;
55089fb57cSJacob Faibussowitsch   static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept;
56089fb57cSJacob Faibussowitsch   static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept;
570e6b6b59SJacob Faibussowitsch };
580e6b6b59SJacob Faibussowitsch 
590e6b6b59SJacob Faibussowitsch // define static variables
600e6b6b59SJacob Faibussowitsch template <DeviceType T>
610e6b6b59SJacob Faibussowitsch typename Device<T>::devices_type Device<T>::devices_ = {};
620e6b6b59SJacob Faibussowitsch 
630e6b6b59SJacob Faibussowitsch template <DeviceType T>
640e6b6b59SJacob Faibussowitsch int Device<T>::defaultDevice_ = PETSC_CUPM_DEVICE_NONE;
650e6b6b59SJacob Faibussowitsch 
660e6b6b59SJacob Faibussowitsch template <DeviceType T>
670e6b6b59SJacob Faibussowitsch bool Device<T>::initialized_ = false;
680e6b6b59SJacob Faibussowitsch 
690e6b6b59SJacob Faibussowitsch } // namespace cupm
700e6b6b59SJacob Faibussowitsch 
710e6b6b59SJacob Faibussowitsch } // namespace device
720e6b6b59SJacob Faibussowitsch 
730e6b6b59SJacob Faibussowitsch } // namespace Petsc
740e6b6b59SJacob Faibussowitsch 
750e6b6b59SJacob Faibussowitsch #endif // __cplusplus
760e6b6b59SJacob Faibussowitsch 
770e6b6b59SJacob Faibussowitsch #endif /* PETSCCUPMDEVICE_HPP */
78