//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file contains the declaration of the SYCL 2020 device class, which /// represents a single SYCL device on which kernels can be executed. /// //===----------------------------------------------------------------------===// #ifndef _LIBSYCL___IMPL_DEVICE_HPP #define _LIBSYCL___IMPL_DEVICE_HPP #include #include #include #include #include #include _LIBSYCL_BEGIN_NAMESPACE_SYCL class platform; namespace detail { class DeviceImpl; } // namespace detail // SYCL 2020 4.6.4. Device class. class _LIBSYCL_EXPORT device { public: device(const device &rhs) = default; device(device &&rhs) = default; device &operator=(const device &rhs) = default; device &operator=(device &&rhs) = default; friend bool operator==(const device &lhs, const device &rhs) { return lhs.impl == rhs.impl; } friend bool operator!=(const device &lhs, const device &rhs) { return !(lhs == rhs); } /// Constructs a SYCL device instance using the default device (device chosen /// by default device selector). device() : device(default_selector_v) {} /// Constructs a SYCL device instance using the device /// identified by the provided device selector. /// \param DeviceSelector is SYCL 2020 device selector, a simple callable that /// takes a device and returns an int. template < typename DeviceSelector, // `DeviceImpl` (used as a parameter in private ctor) is incomplete // so would result in a error trying to instantiate // `EnableIfDeviceSelectorIsInvocable` below. Filter it out // before trying to do that. typename = std::enable_if_t>, typename = detail::EnableIfDeviceSelectorIsInvocable> explicit device(const DeviceSelector &deviceSelector) : device(detail::SelectDevice(deviceSelector)) {} /// Returns the backend associated with this device. /// /// \return the backend associated with this device. backend get_backend() const noexcept; /// Check if device is a CPU device. /// /// \return true if SYCL device is a CPU device. bool is_cpu() const; /// Check if device is a GPU device. /// /// \return true if SYCL device is a GPU device. bool is_gpu() const; /// Check if device is an accelerator device. /// /// \return true if SYCL device is an accelerator device. bool is_accelerator() const; /// Get associated SYCL platform. /// /// \return The associated SYCL platform. platform get_platform() const; /// Queries this SYCL device for information requested by the template /// parameter param. /// /// \return device info of type described in 4.6.4.4. template detail::is_device_info_desc_t get_info() const; /// Queries this SYCL device for SYCL backend-specific information. /// /// The return type depends on information being queried. template typename detail::is_backend_info_desc::return_type get_backend_info() const; /// Queries which optional features this device supports (if any). /// /// \return true if this device has the given aspect. bool has(aspect asp) const; /// Partition device into sub devices. /// /// Available only when prop is info::partition_property::partition_equally. /// If this SYCL device does not support /// info::partition_property::partition_equally a feature_not_supported /// exception will be thrown. /// /// \param ComputeUnits is a desired count of compute units in each sub /// device. /// \return sub devices partitioned from this SYCL device equally based on the /// ComputeUnits parameter. template std::vector create_sub_devices(size_t ComputeUnits) const; /// Partition device into sub devices. /// /// Available only when prop is info::partition_property::partition_by_counts. /// If this SYCL device does not support /// info::partition_property::partition_by_counts a feature_not_supported /// exception will be thrown. /// /// \param Counts is a std::vector of desired compute units in sub devices. /// \return sub devices partitioned from this SYCL device by count sizes based /// on the Counts parameter. template std::vector create_sub_devices(const std::vector &Counts) const; /// Partition device into sub devices. /// /// Available only when prop is /// info::partition_property::partition_by_affinity_domain. If this SYCL /// device does not support /// info::partition_property::partition_by_affinity_domain or the SYCL device /// does not support provided info::affinity_domain provided a /// feature_not_supported exception will be thrown. /// /// \param AffinityDomain is one of the values described in Table 4.20 of the /// SYCL 2020 specification. /// \return sub devices partitioned from this SYCL device by affinity domain /// based on the AffinityDomain parameter. template std::vector create_sub_devices(info::partition_affinity_domain AffinityDomain) const; /// Query available SYCL devices. /// /// \param deviceType is one of the values described in A.3 of the SYCL 2020 /// specification. /// \return all SYCL devices available in the system of the device type /// specified. static std::vector get_devices(info::device_type deviceType = info::device_type::all); private: device(detail::DeviceImpl &Impl) : impl(&Impl) {} detail::DeviceImpl *impl; friend sycl::detail::ImplUtils; }; // class device _LIBSYCL_END_NAMESPACE_SYCL template <> struct std::hash : public sycl::detail::HashBase {}; #endif // _LIBSYCL___IMPL_DEVICE_HPP