Skip to content

Commit 3233538

Browse files
Address review feedback on peer_accessible_by proxy
- Optimize add/discard to check the single target device (1 driver call) instead of scanning all devices via _query_peer_access_ids - Add test for out-of-range int in __contains__ (returns False) - Fix stale comment referencing removed support_multi_insert flag - Add #2018 link to release notes entry Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent b7f6e8c commit 3233538

3 files changed

Lines changed: 23 additions & 6 deletions

File tree

cuda_core/cuda/core/_memory/_peer_access_utils.pyx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,29 @@ class PeerAccessibleBySetProxy(MutableSet):
252252

253253
def add(self, value) -> None:
254254
"""Grant peer access from ``value`` to allocations in this pool."""
255-
self._apply([value], ())
255+
dev_id = _resolve_peer_device_id(value)
256+
cdef DeviceMemoryResource mr = <DeviceMemoryResource>self._mr
257+
if dev_id == mr._dev_id:
258+
return
259+
if _peer_access_includes(mr, dev_id):
260+
return
261+
from cuda.core._device import Device
262+
if not Device(mr._dev_id).can_access_peer(dev_id):
263+
raise ValueError(f"Device {mr._dev_id} cannot access peer: {dev_id}")
264+
_apply_peer_access_diff(mr, (dev_id,), ())
256265

257266
def discard(self, value) -> None:
258267
"""Revoke peer access from ``value`` to allocations in this pool."""
259268
try:
260269
dev_id = _resolve_peer_device_id(value)
261270
except (TypeError, ValueError):
262271
return
263-
self._apply((), [dev_id])
272+
cdef DeviceMemoryResource mr = <DeviceMemoryResource>self._mr
273+
if dev_id == mr._dev_id:
274+
return
275+
if not _peer_access_includes(mr, dev_id):
276+
return
277+
_apply_peer_access_diff(mr, (), (dev_id,))
264278

265279
# --- bulk overrides: one driver call per op ---
266280

cuda_core/docs/source/release/1.0.0-notes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ Breaking changes
123123
- :attr:`DeviceMemoryResource.peer_accessible_by` now returns a
124124
:class:`collections.abc.MutableSet` of :obj:`~_device.Device` objects instead
125125
of a sorted ``tuple[int, ...]``. The property setter is unchanged.
126+
(`#2018 <https://github.com/NVIDIA/cuda-python/pull/2018>`__)
126127

127128
- ``stream`` is now a required keyword-only argument on APIs that schedule
128129
work on a stream

cuda_core/tests/test_memory_peer_access.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,9 @@ def test_peer_access_shared_pool_queries_driver(mempool_device_x2):
147147
#
148148
# These tests exercise the ``PeerAccessibleBySetProxy`` surface added in
149149
# v1.0.0. They run against ``mempool_device_x2`` because every CI machine has
150-
# at most 2 GPUs, which means at most one valid peer device. The relaxed
151-
# ``support_multi_insert=False`` path on ``assert_mutable_set_interface``
152-
# threads that single insertable element through the full ``MutableSet``
153-
# protocol.
150+
# at most 2 GPUs, which means at most one valid peer device. The
151+
# ``assert_single_member_mutable_set_interface`` helper threads that single
152+
# insertable element through the full ``MutableSet`` protocol.
154153
# ---------------------------------------------------------------------------
155154

156155

@@ -244,6 +243,9 @@ def test_peer_accessible_by_rejects_invalid_inputs(isolated_dmr_x2):
244243
# __contains__: returns False on non-coercible values, never raises
245244
assert "not-a-device" not in dmr.peer_accessible_by
246245

246+
# __contains__: out-of-range int returns False, never raises
247+
assert bad_id not in dmr.peer_accessible_by
248+
247249
# remove on a non-member raises KeyError (inherited from MutableSet)
248250
with pytest.raises(KeyError):
249251
dmr.peer_accessible_by.remove(dev1)

0 commit comments

Comments
 (0)