[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