xref: /petsc/src/sys/objects/device/impls/sycl/sycldevice.hpp (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
10e6b6b59SJacob Faibussowitsch #ifndef PETSCSYCLDEVICE_HPP
20e6b6b59SJacob Faibussowitsch #define PETSCSYCLDEVICE_HPP
30e6b6b59SJacob Faibussowitsch 
40e6b6b59SJacob Faibussowitsch #if defined(__cplusplus)
50e6b6b59SJacob Faibussowitsch   #include "../impldevicebase.hpp" /* I "petscdevice.h" */
60e6b6b59SJacob Faibussowitsch 
70e6b6b59SJacob Faibussowitsch   #include <array>
80e6b6b59SJacob Faibussowitsch 
9*d71ae5a4SJacob Faibussowitsch namespace Petsc
10*d71ae5a4SJacob Faibussowitsch {
110e6b6b59SJacob Faibussowitsch 
12*d71ae5a4SJacob Faibussowitsch namespace device
13*d71ae5a4SJacob Faibussowitsch {
140e6b6b59SJacob Faibussowitsch 
15*d71ae5a4SJacob Faibussowitsch namespace sycl
16*d71ae5a4SJacob Faibussowitsch {
170e6b6b59SJacob Faibussowitsch 
180e6b6b59SJacob 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
190e6b6b59SJacob Faibussowitsch   #define PETSC_SYCL_DEVICE_NONE -3
200e6b6b59SJacob Faibussowitsch 
210e6b6b59SJacob Faibussowitsch class Device : public ::Petsc::device::impl::DeviceBase<Device> {
220e6b6b59SJacob Faibussowitsch public:
230e6b6b59SJacob Faibussowitsch   PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device);
240e6b6b59SJacob Faibussowitsch 
250e6b6b59SJacob Faibussowitsch   ~Device() { auto PETSC_UNUSED _ = finalize_(); }
260e6b6b59SJacob Faibussowitsch 
270e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept;
280e6b6b59SJacob Faibussowitsch 
290e6b6b59SJacob Faibussowitsch private:
300e6b6b59SJacob Faibussowitsch   // opaque class representing a single device instance
310e6b6b59SJacob Faibussowitsch   class DeviceInternal;
320e6b6b59SJacob Faibussowitsch 
330e6b6b59SJacob Faibussowitsch   // currently stores sycl host and gpu devices
340e6b6b59SJacob Faibussowitsch   static std::array<DeviceInternal *, PETSC_DEVICE_MAX_DEVICES> devices_array_;
350e6b6b59SJacob Faibussowitsch   static DeviceInternal                                       **devices_; // alias to devices_array_, but shifted to support devices_[-1] for sycl host device
360e6b6b59SJacob Faibussowitsch 
370e6b6b59SJacob Faibussowitsch   // this rank's default device. If equals to PETSC_SYCL_DEVICE_NONE, then all sycl devices are disabled
380e6b6b59SJacob Faibussowitsch   static int defaultDevice_;
390e6b6b59SJacob Faibussowitsch 
400e6b6b59SJacob Faibussowitsch   // have we tried looking for devices
410e6b6b59SJacob Faibussowitsch   static bool initialized_;
420e6b6b59SJacob Faibussowitsch 
430e6b6b59SJacob Faibussowitsch   // clean-up
440e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode finalize_() noexcept;
450e6b6b59SJacob Faibussowitsch 
460e6b6b59SJacob Faibussowitsch   PETSC_CXX_COMPAT_DECL(constexpr PetscDeviceType PETSC_DEVICE_IMPL_()) { return PETSC_DEVICE_SYCL; }
470e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD PetscErrorCode        init_device_id_(PetscInt *) const noexcept;
480e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept;
490e6b6b59SJacob Faibussowitsch   PETSC_NODISCARD static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept;
500e6b6b59SJacob Faibussowitsch };
510e6b6b59SJacob Faibussowitsch 
520e6b6b59SJacob Faibussowitsch } // namespace sycl
530e6b6b59SJacob Faibussowitsch 
540e6b6b59SJacob Faibussowitsch } // namespace device
550e6b6b59SJacob Faibussowitsch 
560e6b6b59SJacob Faibussowitsch } // namespace Petsc
570e6b6b59SJacob Faibussowitsch 
580e6b6b59SJacob Faibussowitsch #endif // __cplusplus
590e6b6b59SJacob Faibussowitsch 
600e6b6b59SJacob Faibussowitsch #endif /* PETSCSYCLDEVICE_HPP */
61