Actual source code: sycldevice.hpp

      1: #pragma once

      3: #include "../impldevicebase.hpp" /* I "petscdevice.h" */

      5: #include <array>

      7: namespace Petsc
      8: {

     10: namespace device
     11: {

     13: namespace sycl
     14: {

     16: #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
     17: #define PETSC_SYCL_DEVICE_NONE -3

     19: class Device : public ::Petsc::device::impl::DeviceBase<Device> {
     20: public:
     21:   PETSC_DEVICE_IMPL_BASE_CLASS_HEADER(base_type, Device);

     23:   ~Device() { auto PETSC_UNUSED _ = finalize_(); }

     25:   static PetscErrorCode initialize(MPI_Comm, PetscInt *, PetscBool *, PetscDeviceInitType *) noexcept;

     27: private:
     28:   // opaque class representing a single device instance
     29:   class DeviceInternal;

     31:   // currently stores sycl host and gpu devices
     32:   static std::array<DeviceInternal *, PETSC_DEVICE_MAX_DEVICES> devices_array_;
     33:   static DeviceInternal                                       **devices_; // alias to devices_array_, but shifted to support devices_[-1] for sycl host device

     35:   // this rank's default device. If equals to PETSC_SYCL_DEVICE_NONE, then all sycl devices are disabled
     36:   static int defaultDevice_;

     38:   // have we tried looking for devices
     39:   static bool initialized_;

     41:   // clean-up
     42:   static PetscErrorCode finalize_() noexcept;

     44:   PETSC_CXX_COMPAT_DECL(constexpr PetscDeviceType PETSC_DEVICE_IMPL_()) { return PETSC_DEVICE_SYCL; }
     45:   PetscErrorCode        init_device_id_(PetscInt *) const noexcept;
     46:   static PetscErrorCode view_device_(PetscDevice, PetscViewer) noexcept;
     47:   static PetscErrorCode get_attribute_(PetscInt, PetscDeviceAttribute, void *) noexcept;
     48: };

     50: } // namespace sycl

     52: } // namespace device

     54: } // namespace Petsc