Skip to content

Commit aeb676a

Browse files
committed
[L0 v2] implement in-order list without driver support
1 parent 2838523 commit aeb676a

File tree

7 files changed

+220
-57
lines changed

7 files changed

+220
-57
lines changed

source/adapters/level_zero/v2/context.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ ur_context_handle_t_::ur_context_handle_t_(ze_context_handle_t hContext,
5353
[context = this, platform = phDevices[0]->Platform](
5454
DeviceId deviceId, v2::event_flags_t flags)
5555
-> std::unique_ptr<v2::event_provider> {
56-
assert((flags & v2::EVENT_FLAGS_COUNTER) != 0);
57-
5856
std::ignore = deviceId;
5957
std::ignore = platform;
6058

source/adapters/level_zero/v2/event.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ ur_event_handle_t_::ur_event_handle_t_(ur_context_handle_t hContext,
9595

9696
void ur_event_handle_t_::resetQueueAndCommand(ur_queue_handle_t hQueue,
9797
ur_command_t commandType) {
98+
resetted = false;
9899
this->hQueue = hQueue;
99100
this->commandType = commandType;
100101
}
@@ -124,6 +125,7 @@ void ur_event_handle_t_::reset() {
124125
if (!(flags & v2::EVENT_FLAGS_COUNTER)) {
125126
zeEventHostReset(hZeEvent);
126127
}
128+
resetted = true;
127129
}
128130

129131
ze_event_handle_t ur_event_handle_t_::getZeEvent() const {
@@ -187,7 +189,7 @@ ur_pooled_event_t::ur_pooled_event_t(
187189
zeEvent(std::move(eventAllocation)), pool(pool) {}
188190

189191
ur_result_t ur_pooled_event_t::forceRelease() {
190-
pool->free(this);
192+
pool->free(this, false);
191193
return UR_RESULT_SUCCESS;
192194
}
193195

@@ -376,8 +378,8 @@ urEventCreateWithNativeHandle(ur_native_handle_t hNativeEvent,
376378
const ur_event_native_properties_t *pProperties,
377379
ur_event_handle_t *phEvent) try {
378380
if (!hNativeEvent) {
379-
assert(hContext->nativeEventsPool.getFlags() &
380-
v2::EVENT_FLAGS_COUNTER == 0);
381+
assert((hContext->nativeEventsPool.getFlags() & v2::EVENT_FLAGS_COUNTER) ==
382+
0);
381383

382384
*phEvent = hContext->nativeEventsPool.allocate();
383385
ZE2UR_CALL(zeEventHostSignal, ((*phEvent)->getZeEvent()));

source/adapters/level_zero/v2/event.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ struct ur_event_handle_t_ : _ur_object {
9797
uint64_t getEventStartTimestmap() const;
9898
uint64_t getEventEndTimestamp();
9999

100+
bool isResetted() const { return resetted; }
101+
100102
protected:
101103
ur_context_handle_t hContext;
102104

@@ -110,6 +112,8 @@ struct ur_event_handle_t_ : _ur_object {
110112

111113
v2::event_flags_t flags;
112114
event_profiling_data_t profilingData;
115+
116+
bool resetted = false;
113117
};
114118

115119
struct ur_pooled_event_t : ur_event_handle_t_ {

source/adapters/level_zero/v2/event_pool.cpp

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ namespace v2 {
1717

1818
static constexpr size_t EVENTS_BURST = 64;
1919

20+
static uint64_t CHECK_EXECUTING = []() {
21+
return getenv_to_unsigned("UR_L0_V2_CHECK_EXECUTING").value_or(16);
22+
}();
23+
24+
static uint64_t EVENT_POOL_CLEANUP_SIZE = []() {
25+
return getenv_to_unsigned("UR_L0_V2_EVENT_POOL_CLEANUP_SIZE").value_or(1000);
26+
}();
27+
2028
ur_pooled_event_t *event_pool::allocate() {
2129
TRACK_SCOPE_LATENCY("event_pool::allocate");
2230

@@ -39,13 +47,53 @@ ur_pooled_event_t *event_pool::allocate() {
3947
return event;
4048
}
4149

42-
void event_pool::free(ur_pooled_event_t *event) {
50+
void event_pool::forceCleanupExecuting() {
51+
TRACK_SCOPE_LATENCY("event_pool::forceCleanupExecuting");
52+
53+
std::unique_lock<std::mutex> lock(*mutex);
54+
55+
for (auto &event : executing) {
56+
event->reset();
57+
freelist.push_back(event);
58+
}
59+
60+
executing.clear();
61+
}
62+
63+
void event_pool::cleanupExecuting() {
64+
TRACK_SCOPE_LATENCY("event_pool::cleanupExecuting");
65+
66+
std::unique_lock<std::mutex> lock(*mutex);
67+
68+
if (executing.size() < EVENT_POOL_CLEANUP_SIZE) {
69+
return;
70+
}
71+
72+
size_t completed = 0;
73+
for (size_t i = 0; i < std::min(CHECK_EXECUTING, executing.size()); i++) {
74+
if (zeEventQueryStatus(executing[i]->getZeEvent()) == ZE_RESULT_SUCCESS) {
75+
executing[i]->reset();
76+
freelist.push_back(executing[i]);
77+
completed++;
78+
} else {
79+
break;
80+
}
81+
}
82+
83+
executing.erase(executing.begin(), executing.begin() + completed);
84+
}
85+
86+
void event_pool::free(ur_pooled_event_t *event, bool completed) {
4387
TRACK_SCOPE_LATENCY("event_pool::free");
4488

4589
std::unique_lock<std::mutex> lock(*mutex);
4690

47-
event->reset();
48-
freelist.push_back(event);
91+
if (completed) {
92+
event->reset();
93+
freelist.push_back(event);
94+
} else {
95+
executing.push_back(event);
96+
}
4997

5098
// The event is still in the pool, so we need to increment the refcount
5199
assert(event->RefCount.load() == 0);

source/adapters/level_zero/v2/event_pool.hpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,22 @@ class event_pool {
4040
event_pool(const event_pool &) = delete;
4141
event_pool &operator=(const event_pool &) = delete;
4242

43+
~event_pool() {
44+
for (auto &event : executing) {
45+
zeEventHostSynchronize(event->getZeEvent(), UINT64_MAX);
46+
}
47+
}
48+
4349
// Allocate an event from the pool. Thread safe.
4450
ur_pooled_event_t *allocate();
4551

4652
// Free an event back to the pool. Thread safe.
47-
void free(ur_pooled_event_t *event);
53+
void free(ur_pooled_event_t *event, bool completed);
54+
55+
// Move events from the executing list to the freelist (if they are
56+
// completed). Thread safe.
57+
void cleanupExecuting();
58+
void forceCleanupExecuting();
4859

4960
event_provider *getProvider() const;
5061
event_flags_t getFlags() const;
@@ -54,6 +65,7 @@ class event_pool {
5465
std::unique_ptr<event_provider> provider;
5566

5667
std::deque<ur_pooled_event_t> events;
68+
std::deque<ur_pooled_event_t *> executing;
5769
std::vector<ur_pooled_event_t *> freelist;
5870

5971
std::unique_ptr<std::mutex> mutex;

0 commit comments

Comments
 (0)