@@ -51,8 +51,8 @@ ur_exp_command_buffer_handle_t_::ur_exp_command_buffer_handle_t_(
5151 const ur_exp_command_buffer_desc_t *Desc, const bool IsInOrderCmdList)
5252 : Context(Context), Device(Device), ZeCommandList(CommandList),
5353 ZeCommandListResetEvents(CommandListResetEvents),
54- ZeCommandListDesc(ZeDesc), ZeFencesList (), QueueProperties( ),
55- SyncPoints(), NextSyncPoint(0 ),
54+ ZeCommandListDesc(ZeDesc), ZeFencesMap (), ZeActiveFence( nullptr ),
55+ QueueProperties(), SyncPoints(), NextSyncPoint(0 ),
5656 IsUpdatable(Desc ? Desc->isUpdatable : false ),
5757 IsProfilingEnabled(Desc ? Desc->enableProfiling : false ),
5858 IsInOrderCmdList(IsInOrderCmdList) {
@@ -102,8 +102,9 @@ ur_exp_command_buffer_handle_t_::~ur_exp_command_buffer_handle_t_() {
102102 urEventReleaseInternal (Event);
103103 }
104104
105- // Release Fences allocated to command_buffer
106- for (auto &ZeFence : ZeFencesList) {
105+ // Release fences allocated to command-buffer
106+ for (auto &ZeFencePair : ZeFencesMap) {
107+ auto &ZeFence = ZeFencePair.second ;
107108 ZE_CALL_NOCHECK (zeFenceDestroy, (ZeFence));
108109 }
109110
@@ -1053,11 +1054,19 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferEnqueueExp(
10531054 uint32_t QueueGroupOrdinal;
10541055 auto &ZeCommandQueue = QGroup.getZeQueue (&QueueGroupOrdinal);
10551056
1056- ze_fence_handle_t ZeFence;
1057- ZeStruct<ze_fence_desc_t > ZeFenceDesc;
1058-
1059- ZE2UR_CALL (zeFenceCreate, (ZeCommandQueue, &ZeFenceDesc, &ZeFence));
1060- CommandBuffer->ZeFencesList .push_back (ZeFence);
1057+ // If we already have created a fence for this queue, first reset then reuse
1058+ // it, otherwise create a new fence.
1059+ ze_fence_handle_t &ZeFence = CommandBuffer->ZeActiveFence ;
1060+ auto ZeWorkloadFenceForQueue =
1061+ CommandBuffer->ZeFencesMap .find (ZeCommandQueue);
1062+ if (ZeWorkloadFenceForQueue == CommandBuffer->ZeFencesMap .end ()) {
1063+ ZeStruct<ze_fence_desc_t > ZeFenceDesc;
1064+ ZE2UR_CALL (zeFenceCreate, (ZeCommandQueue, &ZeFenceDesc, &ZeFence));
1065+ CommandBuffer->ZeFencesMap .insert ({{ZeCommandQueue, ZeFence}});
1066+ } else {
1067+ ZeFence = ZeWorkloadFenceForQueue->second ;
1068+ ZE2UR_CALL (zeFenceReset, (ZeFence));
1069+ }
10611070
10621071 bool MustSignalWaitEvent = true ;
10631072 if (NumEventsInWaitList) {
@@ -1458,10 +1467,11 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferUpdateKernelLaunchExp(
14581467 MutableCommandDesc.flags = 0 ;
14591468
14601469 // We must synchronize mutable command list execution before mutating.
1461- ZE2UR_CALL (zeEventHostSynchronize,
1462- (CommandBuffer->SignalEvent ->ZeEvent , UINT64_MAX));
1470+ if (ze_fence_handle_t &ZeFence = CommandBuffer->ZeActiveFence ) {
1471+ ZE2UR_CALL (zeFenceHostSynchronize, (ZeFence, UINT64_MAX));
1472+ }
14631473
1464- auto Plt = Command-> CommandBuffer ->Context ->getPlatform ();
1474+ auto Plt = CommandBuffer->Context ->getPlatform ();
14651475 UR_ASSERT (Plt->ZeMutableCmdListExt .Supported ,
14661476 UR_RESULT_ERROR_UNSUPPORTED_FEATURE);
14671477 ZE2UR_CALL (Plt->ZeMutableCmdListExt .zexCommandListUpdateMutableCommandsExp ,
0 commit comments