Skip to content

[SYCL] atomic_memory_order_capabilities query for device and context #8517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Changes from 3 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
89f989f
Initial implementation of atomic_memory_order_capabilities query
Feb 28, 2023
4518322
Implementation of context atomic_memory_order_capabilities query
Mar 2, 2023
3ae7de0
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 2, 2023
275dc69
Device info atomic memory order query impl
Mar 8, 2023
39cdff0
level_zero implementation of atomic_memory_order_caps
Mar 9, 2023
9579a03
Implement context atomic_mem_order query higher up
Mar 9, 2023
2f99c5a
Clang format fixes to ur_level_zero atomic_mem_order impl
Mar 9, 2023
a508c49
Fixed level_zero atomic_mem_order_caps value
Mar 9, 2023
d9c49ff
Added bitmask for returned value from OpenCL 3.0 runtime
Mar 9, 2023
657da82
Added missing PI mem order enum values to level_zero api
Mar 10, 2023
1e6d671
More robust handling of out param values in piDeviceGetInfo
Mar 10, 2023
58c53ad
Resolved clang formatting fixes
Mar 10, 2023
50ef284
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 10, 2023
d18bcca
Small fix to UR code for atomic_mem_order_caps case
Mar 10, 2023
96186d0
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 10, 2023
be8ff59
Formatting fix in UR
Mar 10, 2023
90e60ac
Context memory_order impl for level_zero
Mar 14, 2023
cc95f60
Merge branch 'alamzeds/atomic_mem_order_caps_fix' of https://github.c…
Mar 14, 2023
64e7f27
Formatting issue resolved
Mar 16, 2023
904fcc5
Used actual type to return.
Mar 16, 2023
c64ae3a
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 16, 2023
b9f460d
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 17, 2023
9b92fbe
Add unit test for memory_order device query
Mar 17, 2023
5b87263
Refined query implementation with fixes and less code duplication
Mar 17, 2023
9652f61
Formatting fix on pi_level_zero that was missed
Mar 17, 2023
dc00b7a
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 22, 2023
6f4a2f7
Swapped PI enum use for UR
Mar 22, 2023
bf903d5
Merge branch 'sycl' into alamzeds/atomic_mem_order_caps_fix
Mar 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 87 additions & 1 deletion sycl/plugins/opencl/pi_opencl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,9 +282,44 @@ 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:
case PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES:
case PI_DEVICE_INFO_ATOMIC_MEMORY_SCOPE_CAPABILITIES:
return PI_ERROR_INVALID_VALUE;
case PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES: {
// This query is missing beore OpenCL 3.0
// Check version and handle appropriately
OCLV::OpenCLVersion devVer, platVer;
cl_platform_id platform;
cl_device_id deviceID = cast<cl_device_id>(device);

auto ret_err = clGetDeviceInfo(deviceID, CL_DEVICE_PLATFORM,
sizeof(cl_platform_id), &platform, nullptr);
if (ret_err != CL_SUCCESS) {
return cast<pi_result>(ret_err);
}

ret_err = getDeviceVersion(deviceID, devVer);
if (ret_err != CL_SUCCESS) {
return cast<pi_result>(ret_err);
}

ret_err = getPlatformVersion(platform, platVer);
if (ret_err != CL_SUCCESS) {
return cast<pi_result>(ret_err);
}

if (platVer < OCLV::V3_0 || devVer < OCLV::V3_0) {
setErrorMessage(
"OpenCL version for device and/or platform is less than 3.0",
PI_ERROR_INVALID_OPERATION);
return PI_ERROR_INVALID_OPERATION;
}

// Guaranteed to return at least relaxed memory order
cl_int result = 1;
// TODO: Check for support for the rest of the capabilities
std::memcpy(paramValue, &result, sizeof(cl_int));
return PI_SUCCESS;
}
case PI_DEVICE_INFO_ATOMIC_64: {
cl_int ret_err = CL_SUCCESS;
cl_bool result = CL_FALSE;
Expand Down Expand Up @@ -888,6 +923,57 @@ pi_result piContextGetInfo(pi_context context, pi_context_info paramName,
std::memcpy(paramValue, &result, sizeof(cl_bool));
return PI_SUCCESS;
}
case PI_CONTEXT_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES: {
// Get all devices in context
cl_uint deviceCount;
cl_int ret_err =
clGetContextInfo(cast<cl_context>(context), CL_CONTEXT_NUM_DEVICES,
sizeof(cl_uint), &deviceCount, nullptr);
if (ret_err != CL_SUCCESS || deviceCount < 1)
return PI_ERROR_INVALID_CONTEXT;

std::vector<cl_device_id> devicesInCtx(deviceCount);
ret_err = clGetContextInfo(cast<cl_context>(context), CL_CONTEXT_DEVICES,
deviceCount * sizeof(cl_device_id),
devicesInCtx.data(), nullptr);
if (ret_err != CL_SUCCESS)
return PI_ERROR_INVALID_CONTEXT;

// Check for valid platform OpenCL version (>=3.0)
cl_platform_id platform;
ret_err = clGetDeviceInfo(devicesInCtx[0], CL_DEVICE_PLATFORM,
sizeof(cl_platform_id), &platform, nullptr);
if (ret_err != CL_SUCCESS)
return PI_ERROR_INVALID_CONTEXT;

OCLV::OpenCLVersion platVer;
ret_err = getPlatformVersion(platform, platVer);
if (ret_err != CL_SUCCESS || platVer < OCLV::V3_0)
return PI_ERROR_INVALID_CONTEXT;

// Get device memory order capabilities for each device
// Combine to get all supported capabilities on each device (as per 4.6.3.2)
// TODO: Check for support for the rest of the capabilities other than
// "relaxed" (set other 0's to 1's here)
cl_int commonCapabilities = 0b00001;

for (cl_device_id device : devicesInCtx) {
// Device version is checked by the call to piDeviceGetInfo
// FIXME: Catch and ignore all <3.0 devices and use all 3.0 and newer? Or
// exit?
cl_int deviceCapabilities;
pi_result pi_ret_err =
piDeviceGetInfo(cast<pi_device>(device), PI_DEVICE_INFO_ATOMIC_MEMORY_ORDER_CAPABILITIES,
sizeof(cl_int), &deviceCapabilities, nullptr);
if (pi_ret_err != PI_SUCCESS)
return pi_ret_err;

commonCapabilities &= deviceCapabilities;
}

std::memcpy(paramValue, &commonCapabilities, sizeof(cl_int));
return PI_SUCCESS;
}
default:
cl_int result = clGetContextInfo(
cast<cl_context>(context), cast<cl_context_info>(paramName),
Expand Down