Skip to content

Commit 8a5d6d3

Browse files
committed
[L0] avoid using pointers into event cache related vectors
1 parent 2aa10dd commit 8a5d6d3

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

source/adapters/level_zero/context.hpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@ struct ur_context_handle_t_ : _ur_object {
142142
//
143143
// Cache of event pools to which host-visible events are added to.
144144
std::vector<std::list<ze_event_pool_handle_t>> ZeEventPoolCache{4};
145-
std::vector<std::unordered_map<ze_device_handle_t,
146-
std::list<ze_event_pool_handle_t> *>>
145+
std::vector<std::unordered_map<ze_device_handle_t, size_t>>
147146
ZeEventPoolCacheDeviceMap{4};
148147

149148
// This map will be used to determine if a pool is full or not
@@ -165,9 +164,9 @@ struct ur_context_handle_t_ : _ur_object {
165164
ur_mutex EventCacheMutex;
166165

167166
// Caches for events.
168-
std::vector<std::list<ur_event_handle_t>> EventCaches{4};
169-
std::vector<
170-
std::unordered_map<ur_device_handle_t, std::list<ur_event_handle_t> *>>
167+
using EventCache = std::vector<std::list<ur_event_handle_t>>;
168+
EventCache EventCaches{4};
169+
std::vector<std::unordered_map<ur_device_handle_t, size_t>>
171170
EventCachesDeviceMap{4};
172171

173172
// Initialize the PI context.
@@ -205,18 +204,20 @@ struct ur_context_handle_t_ : _ur_object {
205204
// Add ur_event_handle_t to cache.
206205
void addEventToContextCache(ur_event_handle_t);
207206

208-
auto getZeEventPoolCache(bool HostVisible, bool WithProfiling,
209-
ze_device_handle_t ZeDevice) {
207+
std::list<ze_event_pool_handle_t> *
208+
getZeEventPoolCache(bool HostVisible, bool WithProfiling,
209+
ze_device_handle_t ZeDevice) {
210210
if (HostVisible) {
211211
if (ZeDevice) {
212212
auto ZeEventPoolCacheMap = WithProfiling
213213
? &ZeEventPoolCacheDeviceMap[0]
214214
: &ZeEventPoolCacheDeviceMap[1];
215215
if (ZeEventPoolCacheMap->find(ZeDevice) == ZeEventPoolCacheMap->end()) {
216216
ZeEventPoolCache.emplace_back();
217-
(*ZeEventPoolCacheMap)[ZeDevice] = &ZeEventPoolCache.back();
217+
ZeEventPoolCacheMap->insert(
218+
std::make_pair(ZeDevice, ZeEventPoolCache.size() - 1));
218219
}
219-
return (*ZeEventPoolCacheMap)[ZeDevice];
220+
return &ZeEventPoolCache[(*ZeEventPoolCacheMap)[ZeDevice]];
220221
} else {
221222
return WithProfiling ? &ZeEventPoolCache[0] : &ZeEventPoolCache[1];
222223
}
@@ -227,9 +228,10 @@ struct ur_context_handle_t_ : _ur_object {
227228
: &ZeEventPoolCacheDeviceMap[3];
228229
if (ZeEventPoolCacheMap->find(ZeDevice) == ZeEventPoolCacheMap->end()) {
229230
ZeEventPoolCache.emplace_back();
230-
(*ZeEventPoolCacheMap)[ZeDevice] = &ZeEventPoolCache.back();
231+
ZeEventPoolCacheMap->insert(
232+
std::make_pair(ZeDevice, ZeEventPoolCache.size() - 1));
231233
}
232-
return (*ZeEventPoolCacheMap)[ZeDevice];
234+
return &ZeEventPoolCache[(*ZeEventPoolCacheMap)[ZeDevice]];
233235
} else {
234236
return WithProfiling ? &ZeEventPoolCache[2] : &ZeEventPoolCache[3];
235237
}
@@ -280,9 +282,10 @@ struct ur_context_handle_t_ : _ur_object {
280282
WithProfiling ? &EventCachesDeviceMap[0] : &EventCachesDeviceMap[1];
281283
if (EventCachesMap->find(Device) == EventCachesMap->end()) {
282284
EventCaches.emplace_back();
283-
(*EventCachesMap)[Device] = &EventCaches.back();
285+
EventCachesMap->insert(
286+
std::make_pair(Device, EventCaches.size() - 1));
284287
}
285-
return (*EventCachesMap)[Device];
288+
return &EventCaches[(*EventCachesMap)[Device]];
286289
} else {
287290
return WithProfiling ? &EventCaches[0] : &EventCaches[1];
288291
}
@@ -292,9 +295,10 @@ struct ur_context_handle_t_ : _ur_object {
292295
WithProfiling ? &EventCachesDeviceMap[2] : &EventCachesDeviceMap[3];
293296
if (EventCachesMap->find(Device) == EventCachesMap->end()) {
294297
EventCaches.emplace_back();
295-
(*EventCachesMap)[Device] = &EventCaches.back();
298+
EventCachesMap->insert(
299+
std::make_pair(Device, EventCaches.size() - 1));
296300
}
297-
return (*EventCachesMap)[Device];
301+
return &EventCaches[(*EventCachesMap)[Device]];
298302
} else {
299303
return WithProfiling ? &EventCaches[2] : &EventCaches[3];
300304
}

source/adapters/level_zero/queue.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,9 +1273,9 @@ ur_result_t ur_queue_handle_t_::addEventToQueueCache(ur_event_handle_t Event) {
12731273
: &EventCachesDeviceMap[1];
12741274
if (EventCachesMap->find(Device) == EventCachesMap->end()) {
12751275
EventCaches.emplace_back();
1276-
(*EventCachesMap)[Device] = &EventCaches.back();
1276+
EventCachesMap->insert(std::make_pair(Device, EventCaches.size() - 1));
12771277
}
1278-
(*EventCachesMap)[Device]->emplace_back(Event);
1278+
EventCaches[EventCachesMap->at(Device)].emplace_back(Event);
12791279
} else {
12801280
auto Cache = Event->isHostVisible() ? &EventCaches[0] : &EventCaches[1];
12811281
Cache->emplace_back(Event);
@@ -1301,9 +1301,11 @@ ur_result_t urQueueReleaseInternal(ur_queue_handle_t Queue) {
13011301
if (!UrQueue->RefCount.decrementAndTest())
13021302
return UR_RESULT_SUCCESS;
13031303

1304-
for (auto &Cache : UrQueue->EventCaches)
1304+
for (auto &Cache : UrQueue->EventCaches) {
13051305
for (auto &Event : Cache)
13061306
UR_CALL(urEventReleaseInternal(Event));
1307+
Cache.clear();
1308+
}
13071309

13081310
if (UrQueue->OwnZeCommandQueue) {
13091311
for (auto &QueueMap :
@@ -1462,8 +1464,8 @@ ur_event_handle_t ur_queue_handle_t_::getEventFromQueueCache(bool IsMultiDevice,
14621464

14631465
if (!IsMultiDevice) {
14641466
auto Device = this->Device;
1465-
Cache = HostVisible ? EventCachesDeviceMap[0][Device]
1466-
: EventCachesDeviceMap[1][Device];
1467+
Cache = HostVisible ? &EventCaches[EventCachesDeviceMap[0][Device]]
1468+
: &EventCaches[EventCachesDeviceMap[1][Device]];
14671469
if (!Cache) {
14681470
return nullptr;
14691471
}

source/adapters/level_zero/queue.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,7 @@ struct ur_queue_handle_t_ : _ur_object {
343343
// inside all command lists in the queue as described in the 2-event model.
344344
// Leftover events in the cache are relased at the queue destruction.
345345
std::vector<std::list<ur_event_handle_t>> EventCaches{2};
346-
std::vector<
347-
std::unordered_map<ur_device_handle_t, std::list<ur_event_handle_t> *>>
346+
std::vector<std::unordered_map<ur_device_handle_t, size_t>>
348347
EventCachesDeviceMap{2};
349348

350349
// adjust the queue's batch size, knowing that the current command list

0 commit comments

Comments
 (0)