Skip to content

Commit 2408035

Browse files
authored
[SYCL] Fix handling of subgroup info queries (#8859)
Update `opencl` PI plugin info queries to prevent crashes when the device does not support subgroups. --------- Signed-off-by: Michael Aziz <michael.aziz@intel.com>
1 parent be4a3a3 commit 2408035

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

sycl/plugins/opencl/pi_opencl.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,6 +1316,32 @@ pi_result piKernelGetSubGroupInfo(pi_kernel kernel, pi_device device,
13161316
cast<cl_kernel_sub_group_info>(param_name), input_value_size, input_value,
13171317
sizeof(size_t), &ret_val, param_value_size_ret));
13181318

1319+
if (ret_err == CL_INVALID_OPERATION) {
1320+
// clGetKernelSubGroupInfo returns CL_INVALID_OPERATION if the device does
1321+
// not support subgroups.
1322+
1323+
if (param_name == PI_KERNEL_MAX_NUM_SUB_GROUPS) {
1324+
ret_val = 1; // Minimum required by SYCL 2020 spec
1325+
ret_err = CL_SUCCESS;
1326+
} else if (param_name == PI_KERNEL_COMPILE_NUM_SUB_GROUPS) {
1327+
ret_val = 0; // Not specified by kernel
1328+
ret_err = CL_SUCCESS;
1329+
} else if (param_name == PI_KERNEL_MAX_SUB_GROUP_SIZE) {
1330+
// Return the maximum work group size for the kernel
1331+
size_t kernel_work_group_size = 0;
1332+
pi_result pi_ret_err = piKernelGetGroupInfo(
1333+
kernel, device, PI_KERNEL_GROUP_INFO_WORK_GROUP_SIZE, sizeof(size_t),
1334+
&kernel_work_group_size, nullptr);
1335+
if (pi_ret_err != PI_SUCCESS)
1336+
return pi_ret_err;
1337+
ret_val = kernel_work_group_size;
1338+
ret_err = CL_SUCCESS;
1339+
} else if (param_name == PI_KERNEL_COMPILE_SUB_GROUP_SIZE_INTEL) {
1340+
ret_val = 0; // Not specified by kernel
1341+
ret_err = CL_SUCCESS;
1342+
}
1343+
}
1344+
13191345
if (ret_err != CL_SUCCESS)
13201346
return cast<pi_result>(ret_err);
13211347

sycl/test-e2e/Basic/kernel_info.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ int main() {
5454
const size_t prefWGSizeMult = krn.get_info<
5555
info::kernel_device_specific::preferred_work_group_size_multiple>(dev);
5656
assert(prefWGSizeMult > 0);
57+
const cl_uint maxSgSize =
58+
krn.get_info<info::kernel_device_specific::max_sub_group_size>(dev);
59+
assert(0 < maxSgSize && maxSgSize <= wgSize);
60+
const cl_uint compileSgSize =
61+
krn.get_info<info::kernel_device_specific::compile_sub_group_size>(dev);
62+
assert(compileSgSize <= maxSgSize);
63+
const cl_uint maxNumSg =
64+
krn.get_info<info::kernel_device_specific::max_num_sub_groups>(dev);
65+
assert(0 < maxNumSg);
66+
const cl_uint compileNumSg =
67+
krn.get_info<info::kernel_device_specific::compile_num_sub_groups>(dev);
68+
assert(compileNumSg <= maxNumSg);
5769

5870
try {
5971
krn.get_info<sycl::info::kernel_device_specific::global_work_size>(dev);

0 commit comments

Comments
 (0)