[llvm] [OFFLOAD][L0] Use counter-based events for inorder queues (PR #202301)

Alex Duran via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 09:20:07 PDT 2026


https://github.com/adurang updated https://github.com/llvm/llvm-project/pull/202301

>From 35be83f366dcfe2ced9e0baeda05f56c0179879f Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 5 Jun 2026 07:00:24 -0700
Subject: [PATCH 1/4] [OFFLOAD][L0] Use counter-based events for inorder queues

---
 .../plugins-nextgen/level_zero/include/L0Event.h   | 14 +++++++++++---
 .../plugins-nextgen/level_zero/src/L0Context.cpp   | 14 +++++++++++++-
 offload/plugins-nextgen/level_zero/src/L0Event.cpp |  5 +++--
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/offload/plugins-nextgen/level_zero/include/L0Event.h b/offload/plugins-nextgen/level_zero/include/L0Event.h
index 82361e4c74200..2ea729c821963 100644
--- a/offload/plugins-nextgen/level_zero/include/L0Event.h
+++ b/offload/plugins-nextgen/level_zero/include/L0Event.h
@@ -33,9 +33,10 @@ class L0EventTy {
   ze_event_handle_t getZeEvent() const { return ZeEvent; }
   L0QueueTy *getQueue() const { return Queue; }
 
-  Error reset() {
+  Error reset(bool SkipEventReset) {
     Queue = nullptr;
-    CALL_ZE_RET_ERROR(zeEventHostReset, ZeEvent);
+    if (!SkipEventReset)
+      CALL_ZE_RET_ERROR(zeEventHostReset, ZeEvent);
     return Plugin::success();
   }
 
@@ -71,6 +72,9 @@ class EventPoolTy {
   /// Additional event pool flags common to this pool.
   uint32_t Flags = 0;
 
+  /// Whether counter-based events are being used (don't need reset).
+  bool UseCounterBasedEvents = false;
+
   /// Protection.
   std::unique_ptr<std::mutex> Mtx;
 
@@ -89,9 +93,13 @@ class EventPoolTy {
 
 public:
   /// Initialize context, flags, and mutex.
-  Error init(ze_context_handle_t ContextIn, uint32_t FlagsIn) {
+  Error init(ze_context_handle_t ContextIn, bool UseCounterBased,
+             uint32_t FlagsIn) {
     Context = ContextIn;
     Flags = FlagsIn;
+    UseCounterBasedEvents = UseCounterBased;
+    if (UseCounterBasedEvents)
+      Flags |= ZE_EVENT_POOL_FLAG_KERNEL_TIMESTAMP;
     Mtx.reset(new std::mutex);
     return Plugin::success();
   }
diff --git a/offload/plugins-nextgen/level_zero/src/L0Context.cpp b/offload/plugins-nextgen/level_zero/src/L0Context.cpp
index b9c2c97ce31fd..4fe0aa34ecbaf 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Context.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Context.cpp
@@ -28,7 +28,19 @@ Error L0ContextTy::init() {
 
   ze_context_desc_t Desc{ZE_STRUCTURE_TYPE_CONTEXT_DESC, nullptr, 0};
   CALL_ZE_RET_ERROR(zeContextCreate, zeDriver, &Desc, &zeContext);
-  if (auto Err = EventPool.init(zeContext, 0)) {
+
+  const auto &Options = Plugin.getOptions();
+  bool UseCounterBasedEvents = Options.CommandMode == CommandModeTy::InOrder ||
+                               Options.CommandMode == CommandModeTy::Sync;
+  if (UseCounterBasedEvents)
+    ODBG(OLDT_Init) << "Using counter-based events for "
+                    << (Options.CommandMode == CommandModeTy::InOrder
+                            ? "InOrder"
+                            : "Sync")
+                    << " command mode";
+
+  if (auto Err = EventPool.init(zeContext, UseCounterBasedEvents,
+                                /* Flags */ 0)) {
     cleanupOnError();
     return Err;
   }
diff --git a/offload/plugins-nextgen/level_zero/src/L0Event.cpp b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
index cb70df71da74d..2d28c11a16398 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Event.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
@@ -62,7 +62,8 @@ Expected<ze_event_handle_t> EventPoolTy::getEventLocked() {
 /// Return an event to the pool.
 Error EventPoolTy::releaseEvent(ze_event_handle_t Event) {
   std::lock_guard<std::mutex> Lock(*Mtx);
-  CALL_ZE_RET_ERROR(zeEventHostReset, Event);
+  if (!UseCounterBasedEvents)
+    CALL_ZE_RET_ERROR(zeEventHostReset, Event);
   Events.push_back(Event);
   return Plugin::success();
 }
@@ -80,7 +81,7 @@ Expected<L0EventTy *> EventPoolTy::getEventObject() {
   }
 
   auto *Ret = EventObjects.back();
-  if (auto Err = Ret->reset())
+  if (auto Err = Ret->reset(/* SkipZeReset */ UseCounterBasedEvents))
     return std::move(Err);
 
   EventObjects.pop_back();

>From 1f7b859a9ea4c43f48c0af611d789563cf6f2c8f Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 5 Jun 2026 07:03:35 -0700
Subject: [PATCH 2/4] nit

---
 offload/plugins-nextgen/level_zero/src/L0Event.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/offload/plugins-nextgen/level_zero/src/L0Event.cpp b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
index 2d28c11a16398..010c5ba1e0921 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Event.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
@@ -81,7 +81,7 @@ Expected<L0EventTy *> EventPoolTy::getEventObject() {
   }
 
   auto *Ret = EventObjects.back();
-  if (auto Err = Ret->reset(/* SkipZeReset */ UseCounterBasedEvents))
+  if (auto Err = Ret->reset(/* SkipEventReset */ UseCounterBasedEvents))
     return std::move(Err);
 
   EventObjects.pop_back();

>From 37977ffc2b397bf43b52b9b65d8dc779a76a0496 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Thu, 11 Jun 2026 09:11:54 -0700
Subject: [PATCH 3/4] correctly create event pool

---
 .../level_zero/dynamic_l0/level_zero/ze_api.h    | 16 ++++++++++++++++
 .../plugins-nextgen/level_zero/include/L0Event.h |  2 --
 .../plugins-nextgen/level_zero/src/L0Event.cpp   |  7 +++++++
 3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/offload/plugins-nextgen/level_zero/dynamic_l0/level_zero/ze_api.h b/offload/plugins-nextgen/level_zero/dynamic_l0/level_zero/ze_api.h
index b3214378e5da1..4d8cf1e9367c0 100644
--- a/offload/plugins-nextgen/level_zero/dynamic_l0/level_zero/ze_api.h
+++ b/offload/plugins-nextgen/level_zero/dynamic_l0/level_zero/ze_api.h
@@ -169,6 +169,7 @@ typedef enum _ze_structure_type_t {
   ZE_STRUCTURE_TYPE_DEVICE_IP_VERSION_EXT = 0x1000f,
   ZE_STRUCTURE_TYPE_COMMAND_LIST_APPEND_PARAM_COOPERATIVE_DESC = 0x00020036,
   ZE_STRUCTURE_TYPE_RELAXED_ALLOCATION_LIMITS_EXP_DESC = 0x00020001,
+  ZE_STRUCTURE_TYPE_COUNTER_BASED_EVENT_POOL_EXP_DESC = 0x00020014,
   ZE_STRUCTURE_TYPE_FORCE_UINT32 = 0x7fffffff
 } ze_structure_type_t;
 
@@ -286,6 +287,14 @@ typedef enum _ze_event_pool_flag_t {
   ZE_EVENT_POOL_FLAG_FORCE_UINT32 = 0x7fffffff
 } ze_event_pool_flag_t;
 
+/* Counter-based event pool flags */
+typedef uint32_t ze_event_pool_counter_based_exp_flags_t;
+typedef enum _ze_event_pool_counter_based_exp_flag_t {
+  ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE = ZE_BIT(0),
+  ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_NON_IMMEDIATE = ZE_BIT(1),
+  ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_FORCE_UINT32 = 0x7fffffff
+} ze_event_pool_counter_based_exp_flag_t;
+
 /* Event scope flags */
 typedef uint32_t ze_event_scope_flags_t;
 typedef enum _ze_event_scope_flag_t {
@@ -600,6 +609,13 @@ typedef struct _ze_event_pool_desc_t {
   uint32_t count;
 } ze_event_pool_desc_t;
 
+/* Counter-based event pool descriptor */
+typedef struct _ze_event_pool_counter_based_exp_desc_t {
+  ze_structure_type_t stype;
+  const void *pNext;
+  ze_event_pool_counter_based_exp_flags_t flags;
+} ze_event_pool_counter_based_exp_desc_t;
+
 /* Event descriptor */
 typedef struct _ze_event_desc_t {
   ze_structure_type_t stype;
diff --git a/offload/plugins-nextgen/level_zero/include/L0Event.h b/offload/plugins-nextgen/level_zero/include/L0Event.h
index 2ea729c821963..f28834e530b82 100644
--- a/offload/plugins-nextgen/level_zero/include/L0Event.h
+++ b/offload/plugins-nextgen/level_zero/include/L0Event.h
@@ -98,8 +98,6 @@ class EventPoolTy {
     Context = ContextIn;
     Flags = FlagsIn;
     UseCounterBasedEvents = UseCounterBased;
-    if (UseCounterBasedEvents)
-      Flags |= ZE_EVENT_POOL_FLAG_KERNEL_TIMESTAMP;
     Mtx.reset(new std::mutex);
     return Plugin::success();
   }
diff --git a/offload/plugins-nextgen/level_zero/src/L0Event.cpp b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
index 010c5ba1e0921..4cdef79ef899b 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Event.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
@@ -25,6 +25,13 @@ Expected<ze_event_handle_t> EventPoolTy::getEventLocked() {
                               /* count */ 0};
     Desc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE | Flags;
     Desc.count = static_cast<uint32_t>(PoolSize);
+
+    ze_event_pool_counter_based_exp_desc_t counterBasedDesc = {ZE_STRUCTURE_TYPE_COUNTER_BASED_EVENT_POOL_EXP_DESC};
+    counterBasedDesc.flags = ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE;
+
+    if (UseCounterBasedEvents)
+      Desc.pNext = &counterBasedDesc;
+
     ze_event_pool_handle_t Pool;
     CALL_ZE_RET_ERROR(zeEventPoolCreate, Context, &Desc, 0, nullptr, &Pool);
     Pools.push_back(Pool);

>From 1f0852efd64b1dd0aa96937da862702b85146792 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Thu, 11 Jun 2026 09:19:52 -0700
Subject: [PATCH 4/4] move counter based semantics inside the L0Event object

---
 offload/plugins-nextgen/level_zero/include/L0Event.h | 8 +++++---
 offload/plugins-nextgen/level_zero/src/L0Event.cpp   | 7 ++++---
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/offload/plugins-nextgen/level_zero/include/L0Event.h b/offload/plugins-nextgen/level_zero/include/L0Event.h
index f28834e530b82..7f4c74e504256 100644
--- a/offload/plugins-nextgen/level_zero/include/L0Event.h
+++ b/offload/plugins-nextgen/level_zero/include/L0Event.h
@@ -26,16 +26,18 @@ class L0QueueTy;
 
 class L0EventTy {
   ze_event_handle_t ZeEvent = nullptr;
+  bool CounterBased = false;
   L0QueueTy *Queue = nullptr;
 
 public:
-  L0EventTy(ze_event_handle_t ZeEvent) : ZeEvent(ZeEvent) {}
+  L0EventTy(ze_event_handle_t ZeEvent, bool CounterBased)
+      : ZeEvent(ZeEvent), CounterBased(CounterBased) {}
   ze_event_handle_t getZeEvent() const { return ZeEvent; }
   L0QueueTy *getQueue() const { return Queue; }
 
-  Error reset(bool SkipEventReset) {
+  Error reset() {
     Queue = nullptr;
-    if (!SkipEventReset)
+    if (!CounterBased)
       CALL_ZE_RET_ERROR(zeEventHostReset, ZeEvent);
     return Plugin::success();
   }
diff --git a/offload/plugins-nextgen/level_zero/src/L0Event.cpp b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
index 4cdef79ef899b..8bcf228ac33f1 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Event.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Event.cpp
@@ -26,7 +26,8 @@ Expected<ze_event_handle_t> EventPoolTy::getEventLocked() {
     Desc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE | Flags;
     Desc.count = static_cast<uint32_t>(PoolSize);
 
-    ze_event_pool_counter_based_exp_desc_t counterBasedDesc = {ZE_STRUCTURE_TYPE_COUNTER_BASED_EVENT_POOL_EXP_DESC};
+    ze_event_pool_counter_based_exp_desc_t counterBasedDesc = {
+        ZE_STRUCTURE_TYPE_COUNTER_BASED_EVENT_POOL_EXP_DESC};
     counterBasedDesc.flags = ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE;
 
     if (UseCounterBasedEvents)
@@ -83,12 +84,12 @@ Expected<L0EventTy *> EventPoolTy::getEventObject() {
     if (!EventOrErr)
       return EventOrErr.takeError();
     auto Event = *EventOrErr;
-    auto *EventObj = new L0EventTy(Event);
+    auto *EventObj = new L0EventTy(Event, UseCounterBasedEvents);
     return EventObj;
   }
 
   auto *Ret = EventObjects.back();
-  if (auto Err = Ret->reset(/* SkipEventReset */ UseCounterBasedEvents))
+  if (auto Err = Ret->reset())
     return std::move(Err);
 
   EventObjects.pop_back();



More information about the llvm-commits mailing list