xref: /petsc/src/sys/objects/device/impls/sycl/sycldevice.hpp (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
1*0e6b6b59SJacob Faibussowitsch #ifndef PETSCSYCLDEVICE_HPP
2*0e6b6b59SJacob Faibussowitsch #define PETSCSYCLDEVICE_HPP
3*0e6b6b59SJacob Faibussowitsch 
4*0e6b6b59SJacob Faibussowitsch #if defined(__cplusplus)
5*0e6b6b59SJacob Faibussowitsch #include "../impldevicebase.hpp" /* I "petscdevice.h" */
6*0e6b6b59SJacob Faibussowitsch 
7*0e6b6b59SJacob Faibussowitsch #include <array>
8*0e6b6b59SJacob Faibussowitsch 
9*0e6b6b59SJacob Faibussowitsch namespace Petsc {
10*0e6b6b59SJacob Faibussowitsch 
11*0e6b6b59SJacob Faibussowitsch namespace device {
12*0e6b6b59SJacob Faibussowitsch 
13*0e6b6b59SJacob Faibussowitsch namespace sycl {
14*0e6b6b59SJacob Faibussowitsch 
15*0e6b6b59SJacob Faibussowitsch #define PETSC_SYCL_DEVICE_HOST -1 // Note -1 is also used by PETSC_DECIDE, so user needs to pass -2 to explicitly select the host
16*0e6b6b59SJacob Faibussowitsch #define PETSC_SYCL_DEVICE_NONE -3
17*0e6b6b59SJacob Faibussowitsch 
18*0e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device> {
19*0e6b6b59SJacob Faibussowitsch public:
20*0e6b6b59SJacob Faibussowitsch   PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device);
21*0e6b6b59SJacob Faibussowitsch 
22*0e6b6b59SJacob Faibussowitsch   ~Device() { auto PETSC_UNUSED _ = finalize_(); }
23*0e6b6b59SJacob Faibussowitsch 
24*0e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept;
25*0e6b6b59SJacob Faibussowitsch 
26*0e6b6b59SJacob Faibussowitsch private:
27*0e6b6b59SJacob Faibussowitsch   // opaque class representing a single device instance
28*0e6b6b59SJacob Faibussowitsch   class DeviceInternal;
29*0e6b6b59SJacob Faibussowitsch 
30*0e6b6b59SJacob Faibussowitsch   // currently stores sycl host and gpu devices
31*0e6b6b59SJacob Faibussowitsch   static std::array<DeviceInternal *, PETSC_DEVICE_MAX_DEVICES> devices_array_;
32*0e6b6b59SJacob Faibussowitsch   static DeviceInternal                                       **devices_; // alias to devices_array_, but shifted to support devices_[-1] for sycl host device
33*0e6b6b59SJacob Faibussowitsch 
34*0e6b6b59SJacob Faibussowitsch   // this rank's default device. If equals to PETSC_SYCL_DEVICE_NONE, then all sycl devices are disabled
35*0e6b6b59SJacob Faibussowitsch   static int defaultDevice_;
36*0e6b6b59SJacob Faibussowitsch 
37*0e6b6b59SJacob Faibussowitsch   // have we tried looking for devices
38*0e6b6b59SJacob Faibussowitsch   static bool initialized_;
39*0e6b6b59SJacob Faibussowitsch 
40*0e6b6b59SJacob Faibussowitsch   // clean-up
41*0e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode finalize_() noexcept;
42*0e6b6b59SJacob Faibussowitsch 
43*0e6b6b59SJacob Faibussowitsch   PETSC_CXX_COMPAT_DECL(constexpr PetscDeviceType PETSC_DEVICE_IMPL_()) { return PETSC_DEVICE_SYCL; }
44*0e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD PetscErrorCode        init_device_id_(PetscInt *) const noexcept;
45*0e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept;
46*0e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept;
47*0e6b6b59SJacob Faibussowitsch };
48*0e6b6b59SJacob Faibussowitsch 
49*0e6b6b59SJacob Faibussowitsch } // namespace sycl
50*0e6b6b59SJacob Faibussowitsch 
51*0e6b6b59SJacob Faibussowitsch } // namespace device
52*0e6b6b59SJacob Faibussowitsch 
53*0e6b6b59SJacob Faibussowitsch } // namespace Petsc
54*0e6b6b59SJacob Faibussowitsch 
55*0e6b6b59SJacob Faibussowitsch #endif // __cplusplus
56*0e6b6b59SJacob Faibussowitsch 
57*0e6b6b59SJacob Faibussowitsch #endif /* PETSCSYCLDEVICE_HPP */
58