// REQUIRES: any-device // RUN: %clangxx %sycl_options %s -o %t.out // RUN: %t.out // // Tests platform::get_devices for each device type. #include #include #include 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 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 &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 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() == 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 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; }