Skip to content

Commit 3dfcdfd

Browse files
[L0] zeDeviceCanAccessPeer call optimization
The more cards used, zeDeviceCanAccessPeer time costing is becoming more and more expensive. Improved by caching p2p devices status thus reducing the number of zeDeviceCanAccessPeer calling times. Signed-off-by: Winston Zhang <winston.zhang@intel.com>
1 parent 6298474 commit 3dfcdfd

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

source/adapters/level_zero/context.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ struct ur_context_handle_t_ : _ur_object {
100100
l0_command_list_cache_info>>>
101101
ZeCopyCommandListCache;
102102

103+
std::unordered_map<ur_device_handle_t, std::list<ur_device_handle_t>>
104+
P2PDeviceCache;
105+
103106
// Store USM pool for USM shared and device allocations. There is 1 memory
104107
// pool per each pair of (context, device) per each memory type.
105108
std::unordered_map<ze_device_handle_t, umf::pool_unique_handle_t>

source/adapters/level_zero/usm.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,26 @@ static ur_result_t USMAllocationMakeResident(
154154
} else {
155155
Devices.push_back(Device);
156156
if (ForceResidency == USMAllocationForceResidencyType::P2PDevices) {
157-
ze_bool_t P2P;
158-
for (const auto &D : Context->Devices) {
159-
if (D == Device)
160-
continue;
161-
// TODO: Cache P2P devices for a context
162-
ZE2UR_CALL(zeDeviceCanAccessPeer,
163-
(D->ZeDevice, Device->ZeDevice, &P2P));
164-
if (P2P)
165-
Devices.push_back(D);
157+
// Check if the P2P devices are already cached
158+
auto it = Context->P2PDeviceCache.find(Device);
159+
if (it != Context->P2PDeviceCache.end()) {
160+
// Use cached P2P devices
161+
Devices.insert(Devices.end(), it->second.begin(), it->second.end());
162+
} else {
163+
// Query for P2P devices and update the cache
164+
std::list<ur_device_handle_t> P2PDevices;
165+
ze_bool_t P2P;
166+
for (const auto &D : Context->Devices) {
167+
if (D == Device)
168+
continue;
169+
ZE2UR_CALL(zeDeviceCanAccessPeer,
170+
(D->ZeDevice, Device->ZeDevice, &P2P));
171+
if (P2P)
172+
P2PDevices.push_back(D);
173+
}
174+
// Update the cache
175+
Context->P2PDeviceCache[Device] = P2PDevices;
176+
Devices.insert(Devices.end(), P2PDevices.begin(), P2PDevices.end());
166177
}
167178
}
168179
}

0 commit comments

Comments
 (0)