blob: fa4c888d6658240a94b55ac9979e59dd4ae00c9b [file] [edit]
//===----------------------------------------------------------------------===//
//
// 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