diff --git a/unified-runtime/source/adapters/level_zero/kernel.cpp b/unified-runtime/source/adapters/level_zero/kernel.cpp index b6d3d2e64ce4e..ffb13e907f0a9 100644 --- a/unified-runtime/source/adapters/level_zero/kernel.cpp +++ b/unified-runtime/source/adapters/level_zero/kernel.cpp @@ -9,7 +9,9 @@ //===----------------------------------------------------------------------===// #include "kernel.hpp" +#include "common.hpp" #include "logger/ur_logger.hpp" +#include "queue.hpp" #include "ur_api.h" #include "ur_interface_loader.hpp" @@ -221,6 +223,25 @@ ur_result_t urEnqueueKernelLaunch( UR_CALL(Queue->executeCommandList(CommandList, false /*IsBlocking*/, true /*OKToBatchCommand*/)); + // For internal events only, occasionally trigger cleanup to prevent event + // pool exhaustion, but avoid doing this for in-order queues which are + // commonly used in multi-threaded scenarios and may have stricter + // synchronization requirements + if (IsInternal && !Queue->isInOrderQueue()) { + // Use a probabilistic approach - only cleanup 1 in 128 internal events + // to minimize performance impact and reduce chances of race conditions + static thread_local uint32_t CleanupCounter = 0; + if ((++CleanupCounter & 127) == 0) { + if (Queue->UsingImmCmdLists) { + UR_CALL(CleanupEventsInImmCmdLists(Queue, true /*QueueLocked*/, + false /*QueueSynced*/, + nullptr /*CompletedEvent*/)); + } else { + UR_CALL(resetCommandLists(Queue)); + } + } + } + return UR_RESULT_SUCCESS; } diff --git a/unified-runtime/source/adapters/level_zero/kernel.hpp b/unified-runtime/source/adapters/level_zero/kernel.hpp index 131dba270c05d..9a0facde699d7 100644 --- a/unified-runtime/source/adapters/level_zero/kernel.hpp +++ b/unified-runtime/source/adapters/level_zero/kernel.hpp @@ -14,6 +14,7 @@ #include "common.hpp" #include "common/ur_ref_count.hpp" #include "memory.hpp" +#include "queue.hpp" struct ur_kernel_handle_t_ : ur_object { ur_kernel_handle_t_(bool OwnZeHandle, ur_program_handle_t Program)