1111from cuda .core ._utils .cuda_utils import CUDAError
1212
1313NBYTES = 1024
14+ # Every owned pool below holds at most NBYTES, but a pool created without an
15+ # explicit max_size reserves a system-dependent window that scales with device
16+ # memory -- hundreds of GiB on large-memory GPUs. The per-process virtual
17+ # address budget is bounded (~1 TB on Windows MCDM), and reservations are not
18+ # returned until a pool is torn down and its stream-ordered frees retire, so
19+ # oversized windows accumulate across a session and eventually starve later
20+ # pool creations with CUDA_ERROR_OUT_OF_MEMORY (issue #2381). Cap them.
21+ POOL_SIZE = 2097152 # 2MB size
1422
1523pytestmark = pytest .mark .thread_unsafe (reason = "peer access tests mutate process-global CUDA memory-pool access state" )
1624
@@ -22,7 +30,7 @@ def test_peer_access_basic(mempool_device_x2):
2230 one_on_dev0 = make_scratch_buffer (dev0 , 1 , NBYTES )
2331 stream_on_dev0 = dev0 .create_stream ()
2432 # Use owned pool to ensure clean initial state (no stale peer access).
25- dmr_on_dev1 = DeviceMemoryResource (dev1 , DeviceMemoryResourceOptions ())
33+ dmr_on_dev1 = DeviceMemoryResource (dev1 , DeviceMemoryResourceOptions (max_size = POOL_SIZE ))
2634 buf_on_dev1 = dmr_on_dev1 .allocate (NBYTES , stream = dev1 .default_stream )
2735
2836 # No access at first.
@@ -73,7 +81,7 @@ def test_peer_access_transitions(mempool_device_x3):
7381 pgens = [PatternGen (devs [i ], NBYTES , streams [i ]) for i in range (3 )]
7482 # Use owned pools (with options) to ensure clean initial state.
7583 # Default pools are shared and may have stale peer access from prior tests.
76- dmrs = [DeviceMemoryResource (dev , DeviceMemoryResourceOptions ()) for dev in devs ]
84+ dmrs = [DeviceMemoryResource (dev , DeviceMemoryResourceOptions (max_size = POOL_SIZE )) for dev in devs ]
7785 bufs = [dmr .allocate (NBYTES , stream = dev .default_stream ) for dmr , dev in zip (dmrs , devs )]
7886
7987 def verify_state (state , pattern_seed ):
@@ -163,7 +171,7 @@ def isolated_dmr_x2(mempool_device_x2):
163171 proxy tests are not polluted by other tests sharing a default pool.
164172 """
165173 dev0 , dev1 = mempool_device_x2
166- dmr = DeviceMemoryResource (dev0 , DeviceMemoryResourceOptions ())
174+ dmr = DeviceMemoryResource (dev0 , DeviceMemoryResourceOptions (max_size = POOL_SIZE ))
167175 dmr .peer_accessible_by = []
168176 return dmr , dev0 , dev1
169177
@@ -273,7 +281,7 @@ def test_peer_accessible_by_no_cache_across_proxies(mempool_device_x2):
273281def test_peer_accessible_by_iteration_order_is_sorted (mempool_device_x2 ):
274282 """``__iter__`` yields peers in ascending device-ordinal order."""
275283 dev0 , dev1 = mempool_device_x2
276- dmr = DeviceMemoryResource (dev0 , DeviceMemoryResourceOptions ())
284+ dmr = DeviceMemoryResource (dev0 , DeviceMemoryResourceOptions (max_size = POOL_SIZE ))
277285 dmr .peer_accessible_by = [dev1 ]
278286 devices = list (dmr .peer_accessible_by )
279287 ids = [d .device_id for d in devices ]
0 commit comments