blob: ea8652a313e8a731829a503f26f2a51a9e86304f [file] [log] [blame] [edit]
// REQUIRES: any-device
// RUN: %clangxx %sycl_options %s -o %t.out
// RUN: %t.out
//
// Tests platform::get_devices for each device type.
#include <sycl/sycl.hpp>
#include <algorithm>
#include <iostream>
std::string BackendToString(sycl::backend Backend) {
switch (Backend) {
case sycl::backend::opencl:
return "opencl";
case sycl::backend::level_zero:
return "level_zero";
case sycl::backend::cuda:
return "cuda";
case sycl::backend::hip:
return "hip";
default:
return "unknown";
}
}
std::string DeviceTypeToString(sycl::info::device_type DevType) {
switch (DevType) {
case sycl::info::device_type::all:
return "device_type::all";
case sycl::info::device_type::cpu:
return "device_type::cpu";
case sycl::info::device_type::gpu:
return "device_type::gpu";
case sycl::info::device_type::accelerator:
return "device_type::accelerator";
case sycl::info::device_type::custom:
return "device_type::custom";
case sycl::info::device_type::automatic:
return "device_type::automatic";
case sycl::info::device_type::host:
return "device_type::host";
default:
return "unknown";
}
}
std::string GenerateDeviceDescription(sycl::info::device_type DevType,
const sycl::platform &Platform) {
return std::string(DeviceTypeToString(DevType)) + " (" +
BackendToString(Platform.get_backend()) + ")";
}
template <typename T1, typename T2>
int Check(const T1 &LHS, const T2 &RHS, std::string TestName) {
if (LHS == RHS)
return 0;
std::cerr << "Failed check " << LHS << " != " << RHS << ": " << TestName
<< std::endl;
return 1;
}
int CheckDeviceType(const sycl::platform &P, sycl::info::device_type DevType,
std::vector<sycl::device> &AllDevices) {
// This check verifies data of device with specific device_type and if it is
// correctly chosen among all devices (device_type::all).
// Though there is no point to check device_type::all here.
assert(DevType != sycl::info::device_type::all);
int Failures = 0;
std::vector<sycl::device> Devices = P.get_devices(DevType);
if (DevType == sycl::info::device_type::automatic) {
if (AllDevices.empty()) {
Failures += Check(Devices.size(), 0,
"No devices reported for device_type::all query, but "
"device_type::automatic returns a device.");
} else {
Failures += Check(Devices.size(), 1,
"Number of devices for device_type::automatic query.");
if (Devices.size())
Failures += Check(
std::count(AllDevices.begin(), AllDevices.end(), Devices[0]), 1,
"Device is in the set of device_type::all devices in the "
"platform.");
}
return Failures;
}
// Count devices with the type.
size_t DevCount = 0;
for (sycl::device Device : Devices)
DevCount += (Device.get_info<sycl::info::device::device_type>() == DevType);
Failures += Check(Devices.size(), DevCount,
"Unexpected number of devices for " +
GenerateDeviceDescription(DevType, P));
Failures +=
Check(std::all_of(Devices.begin(), Devices.end(),
[&](const auto &Dev) {
return std::count(AllDevices.begin(),
AllDevices.end(), Dev) == 1;
}),
true,
"Not all devices for " + GenerateDeviceDescription(DevType, P) +
" appear in the list of all devices");
return Failures;
}
int main() {
int Failures = 0;
for (sycl::platform P : sycl::platform::get_platforms()) {
std::vector<sycl::device> Devices = P.get_devices();
for (sycl::info::device_type DevType :
{sycl::info::device_type::cpu, sycl::info::device_type::gpu,
sycl::info::device_type::accelerator, sycl::info::device_type::custom,
sycl::info::device_type::automatic, sycl::info::device_type::host})
Failures += CheckDeviceType(P, DevType, Devices);
}
return Failures;
}