blob: db61d2ff3a22e9d7664fbbd8cffa02a25275d80d [file] [log] [blame] [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
//
//===----------------------------------------------------------------------===//
#include <sycl/__impl/device.hpp>
#include <detail/device_impl.hpp>
#include <detail/platform_impl.hpp>
#include <algorithm>
_LIBSYCL_BEGIN_NAMESPACE_SYCL
device::device() : device(default_selector_v) {}
bool device::is_cpu() const { return impl->isCPU(); }
bool device::is_gpu() const { return impl->isGPU(); }
bool device::is_accelerator() const { return impl->isAccelerator(); }
platform device::get_platform() const {
return detail::createSyclObjFromImpl<platform>(impl->getPlatformImpl());
}
backend device::get_backend() const noexcept { return impl->getBackend(); }
std::vector<device> device::get_devices(info::device_type DeviceType) {
std::vector<device> Devices;
// Not calling platform::get_devices to avoid multiple vector packing
for (auto &PlatformImpl : detail::PlatformImpl::getPlatforms()) {
assert(PlatformImpl && "PlatformImpl can not be nullptr");
PlatformImpl->iterateDevices(
DeviceType, [&Devices](detail::DeviceImpl *DevImpl) {
assert(DevImpl && "Device impl can't be nullptr");
Devices.push_back(detail::createSyclObjFromImpl<device>(*DevImpl));
});
}
return Devices;
}
template <info::partition_property prop>
std::vector<device> device::create_sub_devices(size_t ComputeUnits) const {
throw exception(make_error_code(errc::feature_not_supported),
"Partitioning is not supported.");
}
template _LIBSYCL_EXPORT std::vector<device>
device::create_sub_devices<info::partition_property::partition_equally>(
size_t ComputeUnits) const;
template <info::partition_property prop>
std::vector<device>
device::create_sub_devices(const std::vector<size_t> &Counts) const {
throw exception(make_error_code(errc::feature_not_supported),
"Partitioning is not supported.");
}
template _LIBSYCL_EXPORT std::vector<device>
device::create_sub_devices<info::partition_property::partition_by_counts>(
const std::vector<size_t> &Counts) const;
template <info::partition_property prop>
std::vector<device> device::create_sub_devices(
info::partition_affinity_domain AffinityDomain) const {
throw exception(make_error_code(errc::feature_not_supported),
"Partitioning is not supported.");
}
template _LIBSYCL_EXPORT std::vector<device> device::create_sub_devices<
info::partition_property::partition_by_affinity_domain>(
info::partition_affinity_domain AffinityDomain) const;
bool device::has(aspect Aspect) const { return impl->has(Aspect); }
template <typename Param>
detail::is_device_info_desc_t<Param> device::get_info() const {
return impl->getInfo<Param>();
}
template <>
_LIBSYCL_EXPORT detail::is_device_info_desc_t<info::device::platform>
device::get_info<info::device::platform>() const {
static_assert(
std::is_same_v<info::device::platform::return_type, sycl::platform>);
return get_platform();
}
#define _LIBSYCL_EXPORT_GET_INFO(Desc) \
template _LIBSYCL_EXPORT detail::is_device_info_desc_t<info::device::Desc> \
device::get_info<info::device::Desc>() const;
_LIBSYCL_EXPORT_GET_INFO(device_type)
_LIBSYCL_EXPORT_GET_INFO(name)
_LIBSYCL_EXPORT_GET_INFO(vendor)
_LIBSYCL_EXPORT_GET_INFO(driver_version)
#undef _LIBSYCL_EXPORT_GET_INFO
_LIBSYCL_END_NAMESPACE_SYCL