Skip to content

Commit 6d9c97f

Browse files
authored
Merge pull request #2013 from winstonzhang-intel/URLZA-186
[L0] zeDeviceCanAccessPeer call optimization
2 parents ce0325d + 3dfcdfd commit 6d9c97f

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)