1313#include " context.hpp"
1414#include " event_provider_normal.hpp"
1515
16+ static std::vector<ur_device_handle_t >
17+ filterP2PDevices (ur_device_handle_t hSourceDevice,
18+ const std::vector<ur_device_handle_t > &devices) {
19+ std::vector<ur_device_handle_t > p2pDevices;
20+ for (auto &device : devices) {
21+ if (device == hSourceDevice) {
22+ continue ;
23+ }
24+
25+ ze_bool_t p2p;
26+ ZE2UR_CALL_THROWS (zeDeviceCanAccessPeer,
27+ (hSourceDevice->ZeDevice , device->ZeDevice , &p2p));
28+
29+ if (p2p) {
30+ p2pDevices.push_back (device);
31+ }
32+ }
33+ return p2pDevices;
34+ }
35+
36+ static std::vector<std::vector<ur_device_handle_t >>
37+ populateP2PDevices (size_t maxDevices,
38+ const std::vector<ur_device_handle_t > &devices) {
39+ std::vector<std::vector<ur_device_handle_t >> p2pDevices (maxDevices);
40+ for (auto &device : devices) {
41+ p2pDevices[device->Id .value ()] = filterP2PDevices (device, devices);
42+ }
43+ return p2pDevices;
44+ }
45+
1646ur_context_handle_t_::ur_context_handle_t_ (ze_context_handle_t hContext,
1747 uint32_t numDevices,
1848 const ur_device_handle_t *phDevices,
1949 bool ownZeContext)
20- : hContext(hContext, ownZeContext),
21- hDevices(phDevices, phDevices + numDevices), commandListCache(hContext),
50+ : commandListCache(hContext),
2251 eventPoolCache(phDevices[0 ]->Platform->getNumDevices (),
2352 [context = this,
2453 platform = phDevices[0]->Platform](DeviceId deviceId) {
@@ -28,6 +57,10 @@ ur_context_handle_t_::ur_context_handle_t_(ze_context_handle_t hContext,
2857 context, device, v2::EVENT_COUNTER,
2958 v2::QUEUE_IMMEDIATE);
3059 }),
60+ hContext(hContext, ownZeContext),
61+ hDevices(phDevices, phDevices + numDevices),
62+ p2pAccessDevices(populateP2PDevices(
63+ phDevices[0 ]->Platform->getNumDevices (), this->hDevices)),
3164 defaultUSMPool(this , nullptr ) {}
3265
3366ur_result_t ur_context_handle_t_::retain () {
@@ -65,6 +98,11 @@ ur_usm_pool_handle_t ur_context_handle_t_::getDefaultUSMPool() {
6598 return &defaultUSMPool;
6699}
67100
101+ const std::vector<ur_device_handle_t > &
102+ ur_context_handle_t_::getP2PDevices (ur_device_handle_t hDevice) const {
103+ return p2pAccessDevices[hDevice->Id .value ()];
104+ }
105+
68106namespace ur ::level_zero {
69107ur_result_t urContextCreate (uint32_t deviceCount,
70108 const ur_device_handle_t *phDevices,
0 commit comments