| //===----------------------------------------------------------------------===// | |
| // | |
| // 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 <sycl/__impl/aspect.hpp> | |
| #include <sycl/__impl/backend.hpp> | |
| #include <sycl/__impl/device_selector.hpp> | |
| #include <sycl/__impl/info/device.hpp> | |
| #include <sycl/__impl/detail/config.hpp> | |
| #include <sycl/__impl/detail/obj_utils.hpp> | |
| _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<!std::is_same_v<DeviceSelector, detail::DeviceImpl>>, | |
| typename = detail::EnableIfDeviceSelectorIsInvocable<DeviceSelector>> | |
| 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 <typename Param> | |
| detail::is_device_info_desc_t<Param> get_info() const; | |
| /// Queries this SYCL device for SYCL backend-specific information. | |
| /// | |
| /// The return type depends on information being queried. | |
| template <typename Param> | |
| typename detail::is_backend_info_desc<Param>::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 <info::partition_property prop> | |
| std::vector<device> 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 <info::partition_property prop> | |
| std::vector<device> | |
| create_sub_devices(const std::vector<size_t> &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 <info::partition_property prop> | |
| std::vector<device> | |
| 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<device> | |
| 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<sycl::device> : public sycl::detail::HashBase<sycl::device> {}; | |
| #endif // _LIBSYCL___IMPL_DEVICE_HPP |