@@ -16,6 +16,11 @@ struct LocalMemoryUpdateTestBase
16
16
UUR_RETURN_ON_FATAL_FAILURE (
17
17
urUpdatableCommandBufferExpExecutionTest::SetUp ());
18
18
19
+ if (backend == UR_PLATFORM_BACKEND_LEVEL_ZERO) {
20
+ GTEST_SKIP ()
21
+ << " Local memory argument update not supported on Level Zero." ;
22
+ }
23
+
19
24
// HIP has extra args for local memory so we define an offset for arg indices here for updating
20
25
hip_arg_offset = backend == UR_PLATFORM_BACKEND_HIP ? 3 : 0 ;
21
26
ur_device_usm_access_capability_flags_t shared_usm_flags;
@@ -241,6 +246,70 @@ TEST_P(LocalMemoryUpdateTest, UpdateParametersSameLocalSize) {
241
246
Validate (new_output, new_X, new_Y, new_A, global_size, local_size);
242
247
}
243
248
249
+ // Test only passing local memory parameters to update with the original values.
250
+ TEST_P (LocalMemoryUpdateTest, UpdateLocalOnly) {
251
+ // Run command-buffer prior to update an verify output
252
+ ASSERT_SUCCESS (urCommandBufferEnqueueExp (updatable_cmd_buf_handle, queue, 0 ,
253
+ nullptr , nullptr ));
254
+ ASSERT_SUCCESS (urQueueFinish (queue));
255
+
256
+ uint32_t *output = (uint32_t *)shared_ptrs[0 ];
257
+ uint32_t *X = (uint32_t *)shared_ptrs[1 ];
258
+ uint32_t *Y = (uint32_t *)shared_ptrs[2 ];
259
+ Validate (output, X, Y, A, global_size, local_size);
260
+
261
+ // Update inputs
262
+ std::array<ur_exp_command_buffer_update_value_arg_desc_t , 2 >
263
+ new_value_descs;
264
+
265
+ // New local_mem_a at index 0
266
+ new_value_descs[0 ] = {
267
+ UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_VALUE_ARG_DESC, // stype
268
+ nullptr , // pNext
269
+ 0 , // argIndex
270
+ local_mem_a_size, // argSize
271
+ nullptr , // pProperties
272
+ nullptr , // hArgValue
273
+ };
274
+
275
+ // New local_mem_b at index 1
276
+ new_value_descs[1 ] = {
277
+ UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_VALUE_ARG_DESC, // stype
278
+ nullptr , // pNext
279
+ 1 + hip_arg_offset, // argIndex
280
+ local_mem_b_size, // argSize
281
+ nullptr , // pProperties
282
+ nullptr , // hArgValue
283
+ };
284
+
285
+ // Update kernel inputs
286
+ ur_exp_command_buffer_update_kernel_launch_desc_t update_desc = {
287
+ UR_STRUCTURE_TYPE_EXP_COMMAND_BUFFER_UPDATE_KERNEL_LAUNCH_DESC, // stype
288
+ nullptr , // pNext
289
+ kernel, // hNewKernel
290
+ 0 , // numNewMemObjArgs
291
+ 0 , // numNewPointerArgs
292
+ new_value_descs.size (), // numNewValueArgs
293
+ n_dimensions, // newWorkDim
294
+ nullptr , // pNewMemObjArgList
295
+ nullptr , // pNewPointerArgList
296
+ new_value_descs.data (), // pNewValueArgList
297
+ nullptr , // pNewGlobalWorkOffset
298
+ nullptr , // pNewGlobalWorkSize
299
+ nullptr , // pNewLocalWorkSize
300
+ };
301
+
302
+ // Update kernel and enqueue command-buffer again
303
+ ASSERT_SUCCESS (
304
+ urCommandBufferUpdateKernelLaunchExp (command_handle, &update_desc));
305
+ ASSERT_SUCCESS (urCommandBufferEnqueueExp (updatable_cmd_buf_handle, queue, 0 ,
306
+ nullptr , nullptr ));
307
+ ASSERT_SUCCESS (urQueueFinish (queue));
308
+
309
+ // Verify that update occurred correctly
310
+ Validate (output, X, Y, A, global_size, local_size);
311
+ }
312
+
244
313
// Test updating A,X,Y parameters to new values and omitting local memory parameters
245
314
// from the update.
246
315
TEST_P (LocalMemoryUpdateTest, UpdateParametersEmptyLocalSize) {
0 commit comments