Coverage for cuda/core/_memory/_memory_pool.pyx: 78.63%
131 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-16 01:23 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-16 01:23 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5from __future__ import annotations
7cimport cython
8from libc.limits cimport ULLONG_MAX
9from libc.stdint cimport uintptr_t
10from libc.string cimport memset
12from cuda.bindings cimport cydriver
13from cuda.core._memory._buffer cimport Buffer, Buffer_from_deviceptr_handle, MemoryResource
14from cuda.core._memory cimport _ipc
15# cumemlocation_from_id is referenced only from a CUDA 13 branch. cython-lint
16# does not evaluate compile-time IF blocks, so it needs a pragma to be seen as used.
17from cuda.core._memory._location cimport cumemlocation_from_id # no-cython-lint
18from cuda.core._stream cimport Stream_accept, Stream
19from cuda.core._rt cimport (
20 MemoryPoolHandle,
21 DevicePtrHandle,
22 create_mempool_handle,
23 deviceptr_alloc_from_pool,
24 get_last_error,
25 attach_rollback_failure,
26 as_cu,
27 as_py,
28)
29from cuda.core._rt cimport create_mempool_handle_ref # no-cython-lint
31from cuda.core._utils.cuda_utils cimport (
32 HANDLE_RETURN,
33)
35import uuid
36from typing import TYPE_CHECKING
38if TYPE_CHECKING:
39 from cuda.core.graph import GraphBuilder
40 from cuda.core.typing import DevicePointerType
43cdef class _MemPoolAttributes:
44 """Provides access to memory pool attributes."""
45 cdef:
46 MemoryPoolHandle _h_pool
48 def __init__(self, *args, **kwargs) -> None:
49 raise RuntimeError("_MemPoolAttributes cannot be instantiated directly. Please use MemoryResource APIs.") 28f
51 @staticmethod
52 cdef _MemPoolAttributes _init(MemoryPoolHandle h_pool):
53 cdef _MemPoolAttributes self = _MemPoolAttributes.__new__(_MemPoolAttributes) 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
54 self._h_pool = h_pool 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
55 return self 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
57 def __repr__(self) -> str:
58 return f"{self.__class__.__name__}(%s)" % ", ".join( 1bac
59 f"{attr}={getattr(self, attr)}" for attr in dir(self) 1bac
60 if not attr.startswith("_") 1bac
61 )
63 cdef int _getattribute(self, cydriver.CUmemPool_attribute attr_enum, void* value) except?-1:
64 with nogil: 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
65 HANDLE_RETURN(cydriver.cuMemPoolGetAttribute(as_cu(self._h_pool), attr_enum, value)) 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
66 return 0 1_`{x$ThfLG%U'V(WigMHydpzABeq)XnkNI*Y+Z,0olOJCmDbacj
68 @property
69 def reuse_follow_event_dependencies(self) -> bool:
70 """Allow memory to be reused when there are event dependencies between streams."""
71 cdef int value
72 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, &value) 1(WB,0bac
73 return bool(value) 1(WB,0bac
75 @property
76 def reuse_allow_opportunistic(self) -> bool:
77 """Allow reuse of completed frees without dependencies."""
78 cdef int value
79 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, &value) 1'VA+Zbac
80 return bool(value) 1'VA+Zbac
82 @property
83 def reuse_allow_internal_dependencies(self) -> bool:
84 """Allow insertion of new stream dependencies for memory reuse."""
85 cdef int value
86 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES, &value) 1%Uz*Ybac
87 return bool(value) 1%Uz*Ybac
89 @property
90 def release_threshold(self) -> int:
91 """Amount of reserved memory to hold before OS release."""
92 cdef cydriver.cuuint64_t value
93 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, &value) 2,c-c_ ` { $ T y ) X b a c
94 return int(value) 1_`{$Ty)Xbac
96 @property
97 def reserved_mem_current(self) -> int:
98 """Current amount of backing memory allocated."""
99 cdef cydriver.cuuint64_t value
100 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, &value) 1hfLGdpnkNIbac
101 return int(value) 1hfLGdpnkNIbac
103 @property
104 def reserved_mem_high(self) -> int:
105 """High watermark of backing memory allocated."""
106 cdef cydriver.cuuint64_t value
107 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, &value) 1LGpNIbac
108 return int(value) 1LGpNIbac
110 @property
111 def used_mem_current(self) -> int:
112 """Current amount of memory in use."""
113 cdef cydriver.cuuint64_t value
114 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, &value) 1xigMHeqolOJbacj
115 return int(value) 1xigMHeqolOJbacj
117 @property
118 def used_mem_high(self) -> int:
119 """High watermark of memory in use."""
120 cdef cydriver.cuuint64_t value
121 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_HIGH, &value) 1MHqOJCmDbac
122 return int(value) 1MHqOJCmDbac
125cdef class _MemPool(MemoryResource):
127 def __cinit__(self) -> None:
128 # Note: subclasses use MP_init_create_pool or MP_init_current_pool to initialize.
129 self._mempool_owned = False 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbKbLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e|d=d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/c[dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] }d- ]cx ^ ~d]d$e8 %eld'ebdcddd(eR .b9 md$ T h f L G % U ' V ( W i g M H y )ed *ep +ez ,eA -eB .ee /eq :e) X n k N I * Y + Z , 0 o l O J C m D b a c . ed/bndodae.cK S fdad`c5fj :b;b=b?b{c|c}c~c@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
130 self._ipc_data = None 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbKbLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e|d=d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/c[dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] }d- ]cx ^ ~d]d$e8 %eld'ebdcddd(eR .b9 md$ T h f L G % U ' V ( W i g M H y )ed *ep +ez ,eA -eB .ee /eq :e) X n k N I * Y + Z , 0 o l O J C m D b a c . ed/bndodae.cK S fdad`c5fj :b;b=b?b{c|c}c~c@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
131 self._attributes = None 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbKbLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e|d=d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/c[dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] }d- ]cx ^ ~d]d$e8 %eld'ebdcddd(eR .b9 md$ T h f L G % U ' V ( W i g M H y )ed *ep +ez ,eA -eB .ee /eq :e) X n k N I * Y + Z , 0 o l O J C m D b a c . ed/bndodae.cK S fdad`c5fj :b;b=b?b{c|c}c~c@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
133 def close(self) -> None:
134 """Release this object's reference to the memory pool.
136 New allocations and operations requiring this object's pool handle are
137 rejected afterward. For owned pools, release of the underlying pool's
138 resources is deferred until all outstanding allocations are freed and
139 pending free operations complete. :meth:`deallocate` remains available
140 after :meth:`close` so existing allocations can still be released.
141 """
142 _MP_close(self) 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c
144 @property
145 def is_closed(self) -> bool:
146 """Whether this memory resource has been closed."""
147 return self._h_pool.get() == NULL 2_c
149 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer:
150 """Allocate a buffer of the requested size.
152 Parameters
153 ----------
154 size : int
155 The size of the buffer to allocate, in bytes.
156 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
157 Keyword-only. The stream on which to perform the allocation
158 asynchronously. Must be passed explicitly; pass
159 ``device.default_stream`` to use the default stream.
161 Returns
162 -------
163 Buffer
164 The allocated buffer object, which is accessible on the device that this memory
165 resource was created for.
166 """
167 MP_check_open(self) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
168 if self.is_mapped: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
169 raise TypeError("Cannot allocate from a mapped IPC-enabled memory resource")
170 cdef Stream s = Stream_accept(stream) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
171 return _MP_allocate(self, size, s) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
173 def deallocate(
174 self,
175 ptr: DevicePointerType,
176 size_t size,
177 *,
178 stream: Stream | GraphBuilder
179 ) -> None:
180 """Deallocate a buffer previously allocated by this resource.
182 Parameters
183 ----------
184 ptr : :obj:`~_memory.DevicePointerType`
185 The pointer or handle to the buffer to deallocate.
186 size : int
187 The size of the buffer to deallocate, in bytes.
188 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
189 Keyword-only. The stream on which to perform the deallocation
190 asynchronously. Must be passed explicitly; pass
191 ``device.default_stream`` to use the default stream.
192 """
193 cdef Stream s = Stream_accept(stream) 2x ed
194 _MP_deallocate(self, <uintptr_t>ptr, size, s) 2x ed
196 @property
197 @cython.critical_section
198 def attributes(self) -> _MemPoolAttributes:
199 """Memory pool attributes."""
200 MP_check_open(self) 2,c-c_ ` { _cx $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
201 cdef _MemPoolAttributes attributes
202 if self._attributes is None: 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
203 attributes = _MemPoolAttributes._init(self._h_pool) 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
204 if self._attributes is None: 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
205 self._attributes = attributes 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
206 return self._attributes 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j
208 @property
209 def handle(self) -> object:
210 """Handle to the underlying memory pool."""
211 return as_py(self._h_pool) 2]cx ^
213 @property
214 def is_handle_owned(self) -> bool:
215 """Whether the memory resource handle is owned. If False, ``close`` has no effect."""
216 return self._mempool_owned 2]c^
218 @property
219 def is_ipc_enabled(self) -> bool:
220 """Whether this memory resource has IPC enabled."""
221 return self._ipc_data is not None 29fpd!fqdr rds sdbetdweudcevdxewdv xdw yd^c6fzd7fAdt #fBd$fCd/c[ddeDdyeEdeeFdzeGdfeHdAeId%fJd'fKd(fLdgeMdheNd)fOd*fPdieQdjeRd+fSd,fTdkeUdleVd-fWd.fXdBeYdCeZd/f0d:f1dDe2dEe3d;f4d=f5dFe6dGe7d?f8dme9dHe!dne#dIe$doe%dJe'dpe(dKe)dqe*dLe+d2 3 re,dMe-dse.dNe/d^d:dve;d4 5 6 7 P Q [ ] - R $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J . .cK S {c|c}c~c! #
223 @property
224 def is_mapped(self) -> bool:
225 """
226 Whether this is a mapping of an IPC-enabled memory resource from
227 another process. If True, allocation is not permitted.
228 """
229 return self._ipc_data is not None and self._ipc_data._is_mapped 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t /cdeyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
231 @property
232 def uuid(self) -> uuid.UUID | None:
233 """
234 A universally unique identifier for this memory resource. Meaningful
235 only for IPC-enabled memory resources.
236 """
237 return getattr(self._ipc_data, 'uuid', None) 2r s 6f7ft /c^dveP Q
240cdef int MP_init_create_pool(
241 _MemPool self,
242 cydriver.CUmemLocationType loc_type,
243 int loc_id,
244 cydriver.CUmemAllocationType alloc_type,
245 bint ipc_enabled,
246 size_t max_size,
247) except? -1:
248 """Initialize a _MemPool by creating a new memory pool with the given
249 parameters.
251 Sets ``_h_pool`` (owning), ``_mempool_owned``, and ``_ipc_data``.
252 """
253 cdef cydriver.CUmemPoolProps properties
254 memset(&properties, 0, sizeof(cydriver.CUmemPoolProps)) 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
256 properties.allocType = alloc_type 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
257 properties.handleTypes = ( 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
258 _ipc.IPC_HANDLE_TYPE if ipc_enabled 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
259 else cydriver.CUmemAllocationHandleType.CU_MEM_HANDLE_TYPE_NONE 2E u 1 =d?d@d? F @ - ]cx ^ ]d8 bdcdddR 9 $ h L % ' ( i M y d p z A B e q ) n N * + , o O C m D b a c . edae.cS fd`cj
260 )
261 properties.location.id = loc_id 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
262 properties.location.type = loc_type 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
263 properties.maxSize = max_size 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
265 self._mempool_owned = True 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
266 self._h_pool = create_mempool_handle(properties) 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
267 if not self._h_pool: 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #
268 HANDLE_RETURN(get_last_error()) 2ae
269 raise RuntimeError(
270 f"Failed to initialize {self.__class__.__name__}: "
271 "cuda-core returned an empty memory pool handle without recording a CUDA error. "
272 "This is an internal cuda-core error; please report it with your CUDA driver, "
273 "CUDA Toolkit, and cuda-python versions."
274 )
276 if ipc_enabled: 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . ed.cK S fdad`cj {c|c}c~c! #
277 alloc_handle = _ipc.MP_export_mempool(self) 2pdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q T f G U V W g H X k I Y Z 0 l J K ad`c{c|c}c~c! #
278 self._ipc_data = _ipc.IPCDataForMR(alloc_handle, False) 2pdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q T f G U V W g H X k I Y Z 0 l J K ad`c{c|c}c~c! #
280 return 0 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . ed.cK S fdad`cj {c|c}c~c! #
283cdef int MP_init_current_pool(
284 _MemPool self,
285 cydriver.CUmemLocationType loc_type,
286 int loc_id,
287 cydriver.CUmemAllocationType alloc_type,
288) except? -1:
289 """Initialize a _MemPool by getting the driver's current pool for a
290 location and allocation type.
292 Sets ``_h_pool`` (non-owning) via ``cuMemGetMemPool``.
293 Requires CUDA 13+.
294 """
295 IF CUDA_CORE_BUILD_MAJOR >= 13:
296 cdef cydriver.CUmemoryPool pool
297 cdef cydriver.CUmemLocation loc = cumemlocation_from_id(loc_type, loc_id) 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod
298 with nogil: 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod
299 HANDLE_RETURN(cydriver.cuMemGetMemPool(&pool, &loc, alloc_type)) 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod
300 self._h_pool = create_mempool_handle_ref(pool) 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod
301 self._mempool_owned = False 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod
302 return 0 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod
303 ELSE:
304 raise RuntimeError(
305 "Getting the current memory pool requires CUDA 13.0 or later"
306 )
309cdef int MP_raise_release_threshold(_MemPool self) except? -1:
310 """Raise the pool's release threshold to ULLONG_MAX if currently zero.
312 By default the release threshold is 0, meaning memory is returned to
313 the OS as soon as there are no active suballocations. Setting it to
314 ULLONG_MAX avoids repeated OS round-trips.
316 Pool attribute reads and writes are potentially unsafe calls while the
317 calling thread is inside a global or thread-local stream capture: the
318 driver refuses them and invalidates the capture. Capture mode is a
319 per-thread property, so the thread is switched to relaxed mode around the
320 two calls and its previous mode is restored afterwards. This has no
321 observable effect when the thread is not capturing. The attribute write
322 executes immediately rather than being recorded into a graph, which is the
323 intent for a process-wide pool setting.
324 """
325 MP_check_open(self) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
326 cdef cydriver.cuuint64_t current_threshold
327 cdef cydriver.cuuint64_t max_threshold = ULLONG_MAX 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
328 cdef cydriver.CUstreamCaptureMode mode = cydriver.CU_STREAM_CAPTURE_MODE_RELAXED 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
329 cdef cydriver.CUresult err
330 cdef cydriver.CUresult restore_err
331 with nogil: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
332 # On return, mode holds the thread's previous capture mode.
333 HANDLE_RETURN(cydriver.cuThreadExchangeStreamCaptureMode(&mode)) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
334 err = cydriver.cuMemPoolGetAttribute( 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
335 as_cu(self._h_pool),
336 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD,
337 ¤t_threshold
338 )
339 if err == cydriver.CUDA_SUCCESS and current_threshold == 0: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
340 err = cydriver.cuMemPoolSetAttribute( 1=
341 as_cu(self._h_pool),
342 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD,
343 &max_threshold
344 )
345 restore_err = cydriver.cuThreadExchangeStreamCaptureMode(&mode) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
346 try: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
347 HANDLE_RETURN(err) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
348 except:
349 if restore_err != cydriver.CUDA_SUCCESS:
350 # The attribute error propagates with the restore failure attached
351 # as a note (error handling policy).
352 attach_rollback_failure(
353 b"cuThreadExchangeStreamCaptureMode", restore_err,
354 b"failed to restore the thread's stream capture mode")
355 raise
356 HANDLE_RETURN(restore_err) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
357 return 0 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
360# Raise an exception if the given stream is capturing.
361# A result of CU_STREAM_CAPTURE_STATUS_INVALIDATED is considered an error.
362cdef inline int check_not_capturing(cydriver.CUstream s) except?-1 nogil:
363 cdef cydriver.CUstreamCaptureStatus capturing
364 HANDLE_RETURN(cydriver.cuStreamIsCapturing(s, &capturing)) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
365 if capturing != cydriver.CUstreamCaptureStatus.CU_STREAM_CAPTURE_STATUS_NONE: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
366 raise RuntimeError("_MemPool cannot perform memory operations on " 1/:;
367 "a capturing stream (consider using GraphMemoryResource).")
370cdef Buffer _MP_allocate(_MemPool self, size_t size, Stream stream, type cls = Buffer):
371 MP_check_open(self) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
372 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
373 cdef DevicePtrHandle h_ptr
374 with nogil: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
375 check_not_capturing(s) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
376 h_ptr = deviceptr_alloc_from_pool(size, self._h_pool, stream._h_stream) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
377 if not h_ptr: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
378 HANDLE_RETURN(get_last_error())
379 raise RuntimeError(
380 f"Failed to allocate {size} bytes from {self.__class__.__name__}: "
381 "cuda-core returned an empty allocation handle without recording a CUDA error. "
382 "This is an internal cuda-core error; please report it with your CUDA driver, "
383 "CUDA Toolkit, and cuda-python versions."
384 )
385 return Buffer_from_deviceptr_handle(h_ptr, size, self, None, cls) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c
388cdef inline void _MP_deallocate(
389 _MemPool self, uintptr_t ptr, size_t size, Stream stream
390) except *:
391 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2x ed
392 cdef cydriver.CUdeviceptr devptr = <cydriver.CUdeviceptr>ptr 2x ed
393 with nogil: 2x ed
394 HANDLE_RETURN(cydriver.cuMemFreeAsync(devptr, s)) 2x ed
396cdef inline _MP_close(_MemPool self):
397 if not self._h_pool: 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c
398 return 2]c
400 # Reset members in declaration order.
401 # The RAII deleter calls cuMemPoolDestroy if this is an owning handle.
402 self._h_pool.reset() 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c
403 self._mempool_owned = False 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c
404 self._ipc_data = None 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c
405 self._attributes = None 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c