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