diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index a09fc2b9fcf84..4d458e460ff87 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -2239,6 +2239,9 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName, // std::array. For details about this extension, // see sycl/doc/extensions/supported/sycl_ext_intel_device_info.md. return ReturnValue(Device->ZeDeviceProperties->uuid.id); + case PI_DEVICE_INFO_ATOMIC_64: + return ReturnValue(pi_bool{Device->ZeDeviceModuleProperties->flags & + ZE_DEVICE_MODULE_FLAG_INT64_ATOMICS}); case PI_DEVICE_INFO_EXTENSIONS: { // Convention adopted from OpenCL: // "Returns a space separated list of extension names (the extension diff --git a/sycl/plugins/opencl/pi_opencl.cpp b/sycl/plugins/opencl/pi_opencl.cpp index 739200e00fff8..8075f169347e4 100644 --- a/sycl/plugins/opencl/pi_opencl.cpp +++ b/sycl/plugins/opencl/pi_opencl.cpp @@ -193,11 +193,24 @@ pi_result piDeviceGetInfo(pi_device device, pi_device_info paramName, // For details about Intel UUID extension, see // sycl/doc/extensions/supported/sycl_ext_intel_device_info.md case PI_DEVICE_INFO_UUID: - // TODO: Implement. - case PI_DEVICE_INFO_ATOMIC_64: case PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES: case PI_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES: return PI_INVALID_VALUE; + case PI_DEVICE_INFO_ATOMIC_64: { + size_t extSize; + cl_bool result = clGetDeviceInfo( + cast(device), CL_DEVICE_EXTENSIONS, 0, nullptr, &extSize); + std::string extStr(extSize, '\0'); + result = clGetDeviceInfo(cast(device), CL_DEVICE_EXTENSIONS, + extSize, &extStr.front(), nullptr); + if (extStr.find("cl_khr_int64_base_atomics") == std::string::npos || + extStr.find("cl_khr_int64_extended_atomics") == std::string::npos) + result = false; + else + result = true; + std::memcpy(paramValue, &result, sizeof(cl_bool)); + return PI_SUCCESS; + } case PI_DEVICE_INFO_IMAGE_SRGB: { cl_bool result = true; std::memcpy(paramValue, &result, sizeof(cl_bool)); diff --git a/sycl/source/detail/device_info.hpp b/sycl/source/detail/device_info.hpp index 4ae7c7c13e483..3521f1c145803 100644 --- a/sycl/source/detail/device_info.hpp +++ b/sycl/source/detail/device_info.hpp @@ -234,23 +234,6 @@ template <> struct get_device_info { } }; -// Specialization for atomic64 that is necessary because -// PI_DEVICE_INFO_ATOMIC_64 is currently only implemented for the cuda backend. -template <> struct get_device_info { - static bool get(RT::PiDevice dev, const plugin &Plugin) { - - bool result = false; - - RT::PiResult Err = Plugin.call_nocheck( - dev, pi::cast(info::device::atomic64), sizeof(result), - &result, nullptr); - if (Err != PI_SUCCESS) { - return false; - } - return result; - } -}; - // Specialization for atomic_memory_order_capabilities, PI returns a bitfield template <> struct get_device_info,