From 6e3cd3ee78d60c0c4a6b6db2364594fd95d9e535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Mestre?= Date: Wed, 6 Nov 2024 14:17:37 +0000 Subject: [PATCH 1/2] Fix update validation for L0 and OpenCL --- source/adapters/level_zero/command_buffer.cpp | 2 +- source/adapters/opencl/command_buffer.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/adapters/level_zero/command_buffer.cpp b/source/adapters/level_zero/command_buffer.cpp index 206787a68e..8f094ee373 100644 --- a/source/adapters/level_zero/command_buffer.cpp +++ b/source/adapters/level_zero/command_buffer.cpp @@ -1372,7 +1372,7 @@ ur_result_t validateCommandDesc( logger::debug("Mutable features supported by device {}", SupportedFeatures); // Kernel handle updates are not yet supported. - if (CommandDesc->hNewKernel != Command->Kernel) { + if (CommandDesc->hNewKernel && CommandDesc->hNewKernel != Command->Kernel) { return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; } diff --git a/source/adapters/opencl/command_buffer.cpp b/source/adapters/opencl/command_buffer.cpp index 15029d5e27..a161a5b32b 100644 --- a/source/adapters/opencl/command_buffer.cpp +++ b/source/adapters/opencl/command_buffer.cpp @@ -547,7 +547,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferUpdateKernelLaunchExp( *pUpdateKernelLaunch) { // Kernel handle updates are not yet supported. - if (pUpdateKernelLaunch->hNewKernel != hCommand->Kernel) { + if (pUpdateKernelLaunch->hNewKernel && + pUpdateKernelLaunch->hNewKernel != hCommand->Kernel) { return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; } From 8e032a7f10acb0c07fb17338e96f3fcd72ef781c Mon Sep 17 00:00:00 2001 From: Fabio Mestre Date: Wed, 6 Nov 2024 15:27:00 +0000 Subject: [PATCH 2/2] Add regression conformance test for nullptr hNewKernel --- ...xp_command_buffer_adapter_native_cpu.match | 1 + .../update/usm_saxpy_kernel_update.cpp | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/test/conformance/exp_command_buffer/exp_command_buffer_adapter_native_cpu.match b/test/conformance/exp_command_buffer/exp_command_buffer_adapter_native_cpu.match index e6b8320def..4fe4050b5c 100644 --- a/test/conformance/exp_command_buffer/exp_command_buffer_adapter_native_cpu.match +++ b/test/conformance/exp_command_buffer/exp_command_buffer_adapter_native_cpu.match @@ -21,6 +21,7 @@ {{OPT}}USMSaxpyKernelTest.UpdateParameters/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} {{OPT}}USMMultiSaxpyKernelTest.UpdateParameters/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} {{OPT}}USMMultiSaxpyKernelTest.UpdateWithoutBlocking/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} +{{OPT}}USMMultiSaxpyKernelTest.UpdateNullptrKernel/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} {{OPT}}NDRangeUpdateTest.Update3D/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} {{OPT}}NDRangeUpdateTest.Update2D/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} {{OPT}}NDRangeUpdateTest.Update1D/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}} diff --git a/test/conformance/exp_command_buffer/update/usm_saxpy_kernel_update.cpp b/test/conformance/exp_command_buffer/update/usm_saxpy_kernel_update.cpp index 1dc34c00fd..ddf8730eb7 100644 --- a/test/conformance/exp_command_buffer/update/usm_saxpy_kernel_update.cpp +++ b/test/conformance/exp_command_buffer/update/usm_saxpy_kernel_update.cpp @@ -284,6 +284,59 @@ TEST_P(USMMultiSaxpyKernelTest, UpdateParameters) { Validate(new_output, new_X, new_Y, new_A, global_size); } +// Checks that passing nullptr to hNewKernel even when kernel binary updates +// is not supported by the adapter. +TEST_P(USMMultiSaxpyKernelTest, UpdateNullptrKernel) { + ASSERT_SUCCESS(urCommandBufferEnqueueExp(updatable_cmd_buf_handle, queue, 0, + nullptr, nullptr)); + ASSERT_SUCCESS(urQueueFinish(queue)); + + uint32_t *output = (uint32_t *)shared_ptrs[0]; + uint32_t *X = (uint32_t *)shared_ptrs[1]; + uint32_t *Y = (uint32_t *)shared_ptrs[2]; + Validate(output, X, Y, A, global_size); + + // New A at index 1 + uint32_t new_A = 33; + ur_exp_command_buffer_update_value_arg_desc_t new_A_desc = { + UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_VALUE_ARG_DESC, // stype + nullptr, // pNext + 1, // argIndex + sizeof(new_A), // argSize + nullptr, // pProperties + &new_A, // hArgValue + }; + + // Update kernel inputs + ur_exp_command_buffer_update_kernel_launch_desc_t update_desc = { + UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_KERNEL_LAUNCH_DESC, // stype + nullptr, // pNext + nullptr, // hNewKernel + 0, // numNewMemObjArgs + 0, // numNewPointerArgs + 1, // numNewValueArgs + n_dimensions, // newWorkDim + nullptr, // pNewMemObjArgList + nullptr, // pNewPointerArgList + &new_A_desc, // pNewValueArgList + nullptr, // pNewGlobalWorkOffset + nullptr, // pNewGlobalWorkSize + nullptr, // pNewLocalWorkSize + }; + + for (auto &handle : command_handles) { + ASSERT_SUCCESS( + urCommandBufferUpdateKernelLaunchExp(handle, &update_desc)); + } + ASSERT_SUCCESS(urCommandBufferEnqueueExp(updatable_cmd_buf_handle, queue, 0, + nullptr, nullptr)); + ASSERT_SUCCESS(urQueueFinish(queue)); + + // Verify that update occurred correctly + uint32_t *new_output = (uint32_t *)shared_ptrs[0]; + Validate(new_output, X, Y, new_A, global_size); +} + TEST_P(USMMultiSaxpyKernelTest, UpdateWithoutBlocking) { // Prepare new inputs ur_exp_command_buffer_update_pointer_arg_desc_t new_input_descs[2];