From 03ed9243e0b1c5dc4ae3cd9eddd1904fee677a98 Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Thu, 27 Jan 2022 15:51:19 +0300 Subject: [PATCH 1/7] [SYCL] Add check for atomic64 support --- sycl/plugins/opencl/pi_opencl.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sycl/plugins/opencl/pi_opencl.cpp b/sycl/plugins/opencl/pi_opencl.cpp index 12764543cdf0c..9c1e4d951a7ec 100644 --- a/sycl/plugins/opencl/pi_opencl.cpp +++ b/sycl/plugins/opencl/pi_opencl.cpp @@ -272,10 +272,23 @@ pi_result piDeviceGetInfo(pi_device device, pi_device_info paramName, // For details about Intel UUID extension, see // sycl/doc/extensions/IntelGPU/IntelGPUDeviceInfo.md case PI_DEVICE_INFO_UUID: - // TODO: Implement. - case PI_DEVICE_INFO_ATOMIC_64: case PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES: return PI_INVALID_VALUE; + case PI_DEVICE_INFO_ATOMIC_64: { + size_t extSize; + 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) { + return PI_INVALID_VALUE; + } + result = true; + std::memcpy(paramValue, &result, sizeof(bool)); + return PI_SUCCESS; + } case PI_DEVICE_INFO_IMAGE_SRGB: { cl_bool result = true; std::memcpy(paramValue, &result, sizeof(cl_bool)); @@ -529,7 +542,6 @@ pi_result piProgramCreate(pi_context context, const void *il, size_t length, std::string extStr(extSize, '\0'); ret_err = clGetPlatformInfo(curPlatform, CL_PLATFORM_EXTENSIONS, extSize, &extStr.front(), nullptr); - if (ret_err != CL_SUCCESS || extStr.find("cl_khr_il_program") == std::string::npos) { if (res_program != nullptr) From c837628b84840b3ffcaeeff6caf0816a577b5348 Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Mon, 31 Jan 2022 16:45:14 +0300 Subject: [PATCH 2/7] L0 check --- sycl/plugins/level_zero/pi_level_zero.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index 842658bc092ba..480f1cd080b95 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -2150,6 +2150,15 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName, // std::array. For details about this extension, // see sycl/doc/extensions/IntelGPU/IntelGPUDeviceInfo.md. return ReturnValue(Device->ZeDeviceProperties->uuid.id); + case PI_DEVICE_INFO_ATOMIC_64: { + if (Device->ZeDeviceModuleProperties->flags & + ZE_DEVICE_MODULE_FLAG_INT64_ATOMICS) { + bool result = true; + std::memcpy(ParamValue, &result, sizeof(bool)); + return PI_SUCCESS; + } + return PI_INVALID_VALUE; + } case PI_DEVICE_INFO_EXTENSIONS: { // Convention adopted from OpenCL: // "Returns a space separated list of extension names (the extension From 854709ca1e775eccf1cb4715c833ef7b2fe5e37b Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Mon, 31 Jan 2022 16:57:28 +0300 Subject: [PATCH 3/7] Undo empty line deletion --- sycl/plugins/opencl/pi_opencl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sycl/plugins/opencl/pi_opencl.cpp b/sycl/plugins/opencl/pi_opencl.cpp index 9c1e4d951a7ec..8511e2307db22 100644 --- a/sycl/plugins/opencl/pi_opencl.cpp +++ b/sycl/plugins/opencl/pi_opencl.cpp @@ -542,6 +542,7 @@ pi_result piProgramCreate(pi_context context, const void *il, size_t length, std::string extStr(extSize, '\0'); ret_err = clGetPlatformInfo(curPlatform, CL_PLATFORM_EXTENSIONS, extSize, &extStr.front(), nullptr); + if (ret_err != CL_SUCCESS || extStr.find("cl_khr_il_program") == std::string::npos) { if (res_program != nullptr) From 9eb03635ebc14e3d6e837bebc594b70dfb1f9e86 Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Wed, 2 Feb 2022 13:28:41 +0300 Subject: [PATCH 4/7] Apply suggestion --- sycl/plugins/level_zero/pi_level_zero.cpp | 11 +++++------ sycl/plugins/opencl/pi_opencl.cpp | 8 ++++---- sycl/source/detail/device_info.hpp | 17 ----------------- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index 480f1cd080b95..dbc75d5a47904 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -2151,13 +2151,12 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName, // see sycl/doc/extensions/IntelGPU/IntelGPUDeviceInfo.md. return ReturnValue(Device->ZeDeviceProperties->uuid.id); case PI_DEVICE_INFO_ATOMIC_64: { + bool result = false; if (Device->ZeDeviceModuleProperties->flags & - ZE_DEVICE_MODULE_FLAG_INT64_ATOMICS) { - bool result = true; - std::memcpy(ParamValue, &result, sizeof(bool)); - return PI_SUCCESS; - } - return PI_INVALID_VALUE; + ZE_DEVICE_MODULE_FLAG_INT64_ATOMICS) + result = true; + std::memcpy(ParamValue, &result, sizeof(bool)); + return ReturnValue(result); } case PI_DEVICE_INFO_EXTENSIONS: { // Convention adopted from OpenCL: diff --git a/sycl/plugins/opencl/pi_opencl.cpp b/sycl/plugins/opencl/pi_opencl.cpp index 8511e2307db22..5755458c4e9b8 100644 --- a/sycl/plugins/opencl/pi_opencl.cpp +++ b/sycl/plugins/opencl/pi_opencl.cpp @@ -282,10 +282,10 @@ pi_result piDeviceGetInfo(pi_device device, pi_device_info paramName, 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) { - return PI_INVALID_VALUE; - } - result = true; + extStr.find("cl_khr_int64_extended_atomics") == std::string::npos) + result = false; + else + result = true; std::memcpy(paramValue, &result, sizeof(bool)); return PI_SUCCESS; } diff --git a/sycl/source/detail/device_info.hpp b/sycl/source/detail/device_info.hpp index 681269659e3ed..5eae8712b35be 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, From f000d124c63ea7d83ff4db49e992102d46c68508 Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Wed, 2 Feb 2022 21:45:35 +0300 Subject: [PATCH 5/7] Remove unnecessary memcpy --- sycl/plugins/level_zero/pi_level_zero.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index dbc75d5a47904..90a76bac02edd 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -2155,7 +2155,6 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName, if (Device->ZeDeviceModuleProperties->flags & ZE_DEVICE_MODULE_FLAG_INT64_ATOMICS) result = true; - std::memcpy(ParamValue, &result, sizeof(bool)); return ReturnValue(result); } case PI_DEVICE_INFO_EXTENSIONS: { From d82511aceb4174df46b1c804c63dc79a38d789b0 Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Fri, 4 Feb 2022 17:13:43 +0300 Subject: [PATCH 6/7] L0 ReturnValue --- sycl/plugins/level_zero/pi_level_zero.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/sycl/plugins/level_zero/pi_level_zero.cpp b/sycl/plugins/level_zero/pi_level_zero.cpp index 90a76bac02edd..935162fd4bf8e 100644 --- a/sycl/plugins/level_zero/pi_level_zero.cpp +++ b/sycl/plugins/level_zero/pi_level_zero.cpp @@ -2150,13 +2150,9 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName, // std::array. For details about this extension, // see sycl/doc/extensions/IntelGPU/IntelGPUDeviceInfo.md. return ReturnValue(Device->ZeDeviceProperties->uuid.id); - case PI_DEVICE_INFO_ATOMIC_64: { - bool result = false; - if (Device->ZeDeviceModuleProperties->flags & - ZE_DEVICE_MODULE_FLAG_INT64_ATOMICS) - result = true; - return ReturnValue(result); - } + 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 From 340ce4712a313371aa380061c27d4688ed7c6671 Mon Sep 17 00:00:00 2001 From: Denis Kabanov Date: Tue, 15 Feb 2022 17:19:11 +0300 Subject: [PATCH 7/7] Use cl_bool with opencl backend --- sycl/plugins/opencl/pi_opencl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sycl/plugins/opencl/pi_opencl.cpp b/sycl/plugins/opencl/pi_opencl.cpp index 5755458c4e9b8..1b2be7cb81ec1 100644 --- a/sycl/plugins/opencl/pi_opencl.cpp +++ b/sycl/plugins/opencl/pi_opencl.cpp @@ -276,8 +276,8 @@ pi_result piDeviceGetInfo(pi_device device, pi_device_info paramName, return PI_INVALID_VALUE; case PI_DEVICE_INFO_ATOMIC_64: { size_t extSize; - bool result = clGetDeviceInfo(cast(device), - CL_DEVICE_EXTENSIONS, 0, nullptr, &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); @@ -286,7 +286,7 @@ pi_result piDeviceGetInfo(pi_device device, pi_device_info paramName, result = false; else result = true; - std::memcpy(paramValue, &result, sizeof(bool)); + std::memcpy(paramValue, &result, sizeof(cl_bool)); return PI_SUCCESS; } case PI_DEVICE_INFO_IMAGE_SRGB: {