Coverage for cuda/core/_memory/_memory_pool.pyx: 92.62%
122 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-10 02:27 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-10 02:27 +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._resource_handles cimport (
20 MemoryPoolHandle,
21 DevicePtrHandle,
22 create_mempool_handle,
23 deviceptr_alloc_from_pool,
24 get_last_error,
25 as_cu,
26 as_py,
27)
28from cuda.core._resource_handles cimport create_mempool_handle_ref # no-cython-lint
30from cuda.core._utils.cuda_utils cimport (
31 HANDLE_RETURN,
32)
34import uuid
35from typing import TYPE_CHECKING
37if TYPE_CHECKING:
38 from cuda.core.graph import GraphBuilder
39 from cuda.core.typing import DevicePointerType
42cdef class _MemPoolAttributes:
43 """Provides access to memory pool attributes."""
44 cdef:
45 MemoryPoolHandle _h_pool
47 def __init__(self, *args, **kwargs) -> None:
48 raise RuntimeError("_MemPoolAttributes cannot be instantiated directly. Please use MemoryResource APIs.") 28f
50 @staticmethod
51 cdef _MemPoolAttributes _init(MemoryPoolHandle h_pool):
52 cdef _MemPoolAttributes self = _MemPoolAttributes.__new__(_MemPoolAttributes) 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
53 self._h_pool = h_pool 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
54 return self 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
56 def __repr__(self) -> str:
57 return f"{self.__class__.__name__}(%s)" % ", ".join( 1bac
58 f"{attr}={getattr(self, attr)}" for attr in dir(self) 1bac
59 if not attr.startswith("_") 1bac
60 )
62 cdef int _getattribute(self, cydriver.CUmemPool_attribute attr_enum, void* value) except?-1:
63 with nogil: 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
64 HANDLE_RETURN(cydriver.cuMemPoolGetAttribute(as_cu(self._h_pool), attr_enum, value)) 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
65 return 0 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
67 @property
68 def reuse_follow_event_dependencies(self) -> bool:
69 """Allow memory to be reused when there are event dependencies between streams."""
70 cdef int value
71 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, &value) 1'1J+5bac
72 return bool(value) 1'1J+5bac
74 @property
75 def reuse_allow_opportunistic(self) -> bool:
76 """Allow reuse of completed frees without dependencies."""
77 cdef int value
78 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, &value) 2[d% 0 I * 4 b a c
79 return bool(value) 1%0I*4bac
81 @property
82 def reuse_allow_internal_dependencies(self) -> bool:
83 """Allow insertion of new stream dependencies for memory reuse."""
84 cdef int value
85 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES, &value) 1$ZH)3bac
86 return bool(value) 1$ZH)3bac
88 @property
89 def release_threshold(self) -> int:
90 """Amount of reserved memory to hold before OS release."""
91 cdef cydriver.cuuint64_t value
92 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, &value) 1#YG(2bac
93 return int(value) 1#YG(2bac
95 @property
96 def reserved_mem_current(self) -> int:
97 """Current amount of backing memory allocated."""
98 cdef cydriver.cuuint64_t value
99 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, &value) 1hfSNdpnkUPbac
100 return int(value) 1hfSNdpnkUPbac
102 @property
103 def reserved_mem_high(self) -> int:
104 """High watermark of backing memory allocated."""
105 cdef cydriver.cuuint64_t value
106 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, &value) 1SNpUPbac
107 return int(value) 1SNpUPbac
109 @property
110 def used_mem_current(self) -> int:
111 """Current amount of memory in use."""
112 cdef cydriver.cuuint64_t value
113 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, &value) 1FigTOeqolVQbacj
114 return int(value) 1FigTOeqolVQbacj
116 @property
117 def used_mem_high(self) -> int:
118 """High watermark of memory in use."""
119 cdef cydriver.cuuint64_t value
120 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_HIGH, &value) 1TOqVQKmLbac
121 return int(value) 1TOqVQKmLbac
124cdef class _MemPool(MemoryResource):
126 def __cinit__(self) -> None:
127 # Note: subclasses use MP_init_create_pool or MP_init_current_pool to initialize.
128 self._mempool_owned = False 2_dabbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbIbJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.eudvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ FeIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v 9b!b#b$b%b'b(bpd` { Xe, | F } Ye]d/e7 :eqd;egdhdid=eW )b8 rd# Y h f S N $ Z % 0 ' 1 i g T O G ?ed @ep [eH ]eI ^eJ _ee `eq {e( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd*bsdtd`d. R X kdfd+b5fj ~ ,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
129 self._ipc_data = None 2_dabbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbIbJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.eudvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ FeIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v 9b!b#b$b%b'b(bpd` { Xe, | F } Ye]d/e7 :eqd;egdhdid=eW )b8 rd# Y h f S N $ Z % 0 ' 1 i g T O G ?ed @ep [eH ]eI ^eJ _ee `eq {e( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd*bsdtd`d. R X kdfd+b5fj ~ ,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
130 self._attributes = None 2_dabbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbIbJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.eudvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ FeIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v 9b!b#b$b%b'b(bpd` { Xe, | F } Ye]d/e7 :eqd;egdhdid=eW )b8 rd# Y h f S N $ Z % 0 ' 1 i g T O G ?ed @ep [eH ]eI ^eJ _ee `eq {e( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd*bsdtd`d. R X kdfd+b5fj ~ ,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
132 def close(self) -> None:
133 """Release this object's reference to the memory pool.
135 New allocations and operations requiring this object's pool handle are
136 rejected afterward. For owned pools, release of the underlying pool's
137 resources is deferred until all outstanding allocations are freed and
138 pending free operations complete. :meth:`deallocate` remains available
139 after :meth:`close` so existing allocations can still be released.
140 """
141 _MP_close(self) 2_dM w 6 ? @ [ ] ^ _ |e}er ~es afbfcfdfefx ffy gf8bhfift jfkf/ lfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfz A Zf0f1f2f3f4fB C D E u v pd| K m L R X kdfd+b.b/b:b;b
143 @property
144 def is_closed(self) -> bool:
145 """Whether this memory resource has been closed."""
146 return self._h_pool.get() == NULL 2pd
148 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer:
149 """Allocate a buffer of the requested size.
151 Parameters
152 ----------
153 size : int
154 The size of the buffer to allocate, in bytes.
155 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
156 Keyword-only. The stream on which to perform the allocation
157 asynchronously. Must be passed explicitly; pass
158 ``device.default_stream`` to use the default stream.
160 Returns
161 -------
162 Buffer
163 The allocated buffer object, which is accessible on the device that this memory
164 resource was created for.
165 """
166 MP_check_open(self) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7br s {d|dx y t }d~daebecedeeefegeheiejekez A leme^dB C D E u v 9b!b#b$b%b'b(bpd` { , )bh f i g b - *bj ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
167 if self.is_mapped: 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7br s {d|dx y t }d~daebecedeeefegeheiejekez A leme^dB C D E u v 9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
168 raise TypeError("Cannot allocate from a mapped IPC-enabled memory resource")
169 cdef Stream s = Stream_accept(stream) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7br s {d|dx y t }d~daebecedeeefegeheiejekez A leme^dB C D E u v 9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
170 return _MP_allocate(self, size, s) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7br s {d|dx y t }d~daebecedeeefegeheiejekez A leme^dB C D E u v 9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
172 def deallocate(
173 self,
174 ptr: DevicePointerType,
175 size_t size,
176 *,
177 stream: Stream | GraphBuilder
178 ) -> None:
179 """Deallocate a buffer previously allocated by this resource.
181 Parameters
182 ----------
183 ptr : :obj:`~_memory.DevicePointerType`
184 The pointer or handle to the buffer to deallocate.
185 size : int
186 The size of the buffer to deallocate, in bytes.
187 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
188 Keyword-only. The stream on which to perform the deallocation
189 asynchronously. Must be passed explicitly; pass
190 ``device.default_stream`` to use the default stream.
191 """
192 cdef Stream s = Stream_accept(stream) 2F jd
193 _MP_deallocate(self, <uintptr_t>ptr, size, s) 2F jd
195 @property
196 @cython.critical_section
197 def attributes(self) -> _MemPoolAttributes:
198 """Memory pool attributes."""
199 MP_check_open(self) 2pdF # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c j
200 cdef _MemPoolAttributes attributes
201 if self._attributes is None: 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
202 attributes = _MemPoolAttributes._init(self._h_pool) 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
203 if self._attributes is None: 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
204 self._attributes = attributes 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
205 return self._attributes 1F#YhfSN$Z%0'1igTOGdpHIJeq(2nkUP)3*4+5olVQKmLbacj
207 @property
208 def handle(self) -> object:
209 """Handle to the underlying memory pool."""
210 return as_py(self._h_pool) 1|F}
212 @property
213 def is_handle_owned(self) -> bool:
214 """Whether the memory resource handle is owned. If False, ``close`` has no effect."""
215 return self._mempool_owned 1|}
217 @property
218 def is_ipc_enabled(self) -> bool:
219 """Whether this memory resource has IPC enabled."""
220 return self._ipc_data is not None 29fud!fvdr wds xd{dydGezd|dAdHeBdx Cdy Dd8b6fEd7fFdt #fGd$fHd/ Fe}dIdIeJd~dKdJeLd%fMd'fNd(fOdaePdbeQd)fRd*fSdceTddeUd+fVd,fWdeeXdfeYd-fZd.f0dKe1dLe2d/f3d:f4dMe5dNe6d;f7d=f8dOe9dPe!d?f#dge$dQe%dhe'dRe(die)dSe*dje+dTe,dke-dUe.dz A le/dVe:dme;dWe=d^d?dEe@dB C D E u v ` { , W # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q - . R X .b/b:b;b9 !
222 @property
223 def is_mapped(self) -> bool:
224 """
225 Whether this is a mapping of an IPC-enabled memory resource from
226 another process. If True, allocation is not permitted.
227 """
228 return self._ipc_data is not None and self._ipc_data._is_mapped 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t / }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
230 @property
231 def uuid(self) -> uuid.UUID | None:
232 """
233 A universally unique identifier for this memory resource. Meaningful
234 only for IPC-enabled memory resources.
235 """
236 return getattr(self._ipc_data, 'uuid', None) 2r s 6f7ft / ^dEeu v
239cdef int MP_init_create_pool(
240 _MemPool self,
241 cydriver.CUmemLocationType loc_type,
242 int loc_id,
243 cydriver.CUmemAllocationType alloc_type,
244 bint ipc_enabled,
245 size_t max_size,
246) except? -1:
247 """Initialize a _MemPool by creating a new memory pool with the given
248 parameters.
250 Sets ``_h_pool`` (owning), ``_mempool_owned``, and ``_ipc_data``.
251 """
252 cdef cydriver.CUmemPoolProps properties
253 memset(&properties, 0, sizeof(cydriver.CUmemPoolProps)) 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
255 properties.allocType = alloc_type 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
256 properties.handleTypes = ( 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
257 _ipc.IPC_HANDLE_TYPE if ipc_enabled 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
258 else cydriver.CUmemAllocationHandleType.CU_MEM_HANDLE_TYPE_NONE 2M w 6 , | F } ]d7 gdhdidW 8 # h S $ % ' i T G d p H I J e q ( n U ) * + o V K m L b a c - jd`d. X kd+bj
259 )
260 properties.location.id = loc_id 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
261 properties.location.type = loc_type 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
262 properties.maxSize = max_size 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
264 self._mempool_owned = True 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
265 self._h_pool = create_mempool_handle(properties) 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
266 if not self._h_pool: 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd`d. R X kdfd+bj .b/b:b;b9 !
267 HANDLE_RETURN(get_last_error()) 2`d
268 raise RuntimeError(
269 f"Failed to initialize {self.__class__.__name__}: "
270 "cuda-core returned an empty memory pool handle without recording a CUDA error. "
271 "This is an internal cuda-core error; please report it with your CUDA driver, "
272 "CUDA Toolkit, and cuda-python versions."
273 )
275 if ipc_enabled: 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd. R X kdfd+bj .b/b:b;b9 !
276 alloc_handle = _ipc.MP_export_mempool(self) 2udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v Y f N Z 0 1 g O 2 k P 3 4 5 l Q R fd+b.b/b:b;b9 !
277 self._ipc_data = _ipc.IPCDataForMR(alloc_handle, False) 2udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v Y f N Z 0 1 g O 2 k P 3 4 5 l Q R fd+b.b/b:b;b9 !
279 return 0 2M w 6 udvdr wds xdydzdAdBdx Cdy Dd8bEdFdt GdHd/ IdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.dz A /d:d;d=d?d@dB C D E u v , | F } ]d7 gdhdidW 8 # Y h f S N $ Z % 0 ' 1 i g T O G d p H I J e q ( 2 n k U P ) 3 * 4 + 5 o l V Q K m L b a c - jd. R X kdfd+bj .b/b:b;b9 !
282cdef int MP_init_current_pool(
283 _MemPool self,
284 cydriver.CUmemLocationType loc_type,
285 int loc_id,
286 cydriver.CUmemAllocationType alloc_type,
287) except? -1:
288 """Initialize a _MemPool by getting the driver's current pool for a
289 location and allocation type.
291 Sets ``_h_pool`` (non-owning) via ``cuMemGetMemPool``.
292 Requires CUDA 13+.
293 """
294 IF CUDA_CORE_BUILD_MAJOR >= 13:
295 cdef cydriver.CUmemoryPool pool
296 cdef cydriver.CUmemLocation loc = cumemlocation_from_id(loc_type, loc_id) 2_dw ? @ [ ] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.e/e7 :eqd;egdhdid=eW 8 rdG ?ed @ep [eH ]eI ^eJ _ee `eq {em a sdtd
297 with nogil: 2_dw ? @ [ ] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.e/e7 :eqd;egdhdid=eW 8 rdG ?ed @ep [eH ]eI ^eJ _ee `eq {em a sdtd
298 HANDLE_RETURN(cydriver.cuMemGetMemPool(&pool, &loc, alloc_type)) 2_dw ? @ [ ] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.e/e7 :eqd;egdhdid=eW 8 rdG ?ed @ep [eH ]eI ^eJ _ee `eq {em a sdtd
299 self._h_pool = create_mempool_handle_ref(pool) 2_dw ? @ [ ] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.e/e7 :eqd;egdhdid=eW 8 rdG ?ed @ep [eH ]eI ^eJ _ee `eq {em a sdtd
300 self._mempool_owned = False 2_dw ? @ [ ] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.e/e7 :eqd;egdhdid=eW 8 rdG ?ed @ep [eH ]eI ^eJ _ee `eq {em a sdtd
301 return 0 2_dw ? @ [ ] ^ _ 9e!e#e$eldmd%end'eod(e)e*e+e,e-e.e/e7 :eqd;egdhdid=eW 8 rdG ?ed @ep [eH ]eI ^eJ _ee `eq {em a sdtd
302 ELSE:
303 raise RuntimeError(
304 "Getting the current memory pool requires CUDA 13.0 or later"
305 )
308cdef int MP_raise_release_threshold(_MemPool self) except? -1:
309 """Raise the pool's release threshold to ULLONG_MAX if currently zero.
311 By default the release threshold is 0, meaning memory is returned to
312 the OS as soon as there are no active suballocations. Setting it to
313 ULLONG_MAX avoids repeated OS round-trips.
314 """
315 MP_check_open(self) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
316 cdef cydriver.cuuint64_t current_threshold
317 cdef cydriver.cuuint64_t max_threshold = ULLONG_MAX 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
318 with nogil: 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
319 HANDLE_RETURN( 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
320 cydriver.cuMemPoolGetAttribute( 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
321 as_cu(self._h_pool),
322 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD,
323 ¤t_threshold
324 )
325 )
326 if current_threshold == 0: 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
327 HANDLE_RETURN(cydriver.cuMemPoolSetAttribute( 1~
328 as_cu(self._h_pool),
329 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD,
330 &max_threshold
331 ))
332 return 0 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7bFe9b!b#b$b%b'b(bpd` { Xe} Ye)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,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcddded
335# Raise an exception if the given stream is capturing.
336# A result of CU_STREAM_CAPTURE_STATUS_INVALIDATED is considered an error.
337cdef inline int check_not_capturing(cydriver.CUstream s) except?-1 nogil:
338 cdef cydriver.CUstreamCaptureStatus capturing
339 HANDLE_RETURN(cydriver.cuStreamIsCapturing(s, &capturing)) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
340 if capturing != cydriver.CUstreamCaptureStatus.CU_STREAM_CAPTURE_STATUS_NONE: 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
341 raise RuntimeError("_MemPool cannot perform memory operations on " 1:;=
342 "a capturing stream (consider using GraphMemoryResource).")
345cdef Buffer _MP_allocate(_MemPool self, size_t size, Stream stream, type cls = Buffer):
346 MP_check_open(self) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
347 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
348 cdef DevicePtrHandle h_ptr
349 with nogil: 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
350 check_not_capturing(s) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
351 h_ptr = deviceptr_alloc_from_pool(size, self._h_pool, stream._h_stream) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
352 if not h_ptr: 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
353 HANDLE_RETURN(get_last_error())
354 raise RuntimeError(
355 f"Failed to allocate {size} bytes from {self.__class__.__name__}: "
356 "cuda-core returned an empty allocation handle without recording a CUDA error. "
357 "This is an internal cuda-core error; please report it with your CUDA driver, "
358 "CUDA Toolkit, and cuda-python versions."
359 )
360 return Buffer_from_deviceptr_handle(h_ptr, size, self, None, cls) 2abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsb: ; = tbubvbwbxbybzbAbBbCbM w 6 DbEbFbGbHbneIboeJbKbLbMbNbObPbQbRb? @ [ SbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b] ^ _ Ze0e1eldmdndod2e3e4e5e6e7e8er s {dGe|dHex y t }dIe~dJeaebecedeeefeKeLeMeNeOePegeQeheReieSejeTekeUez A leVemeWe^dEeB C D E u v 9b!b#b$b%b'b(b` { , 7 qdW )b8 rdh f i g d e n k o l b a c - *bsdtd. R X j ~ ,b-b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOc9 ! PcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$cpe%cqe'cre(c)c*c+c,c-cse.c/c:cte;c=cue?c@c[c]cve^c_c`cwe{c|c}c~cxeyezeadAeBeCeDebdcddded
363cdef inline void _MP_deallocate(
364 _MemPool self, uintptr_t ptr, size_t size, Stream stream
365) except *:
366 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2F jd
367 cdef cydriver.CUdeviceptr devptr = <cydriver.CUdeviceptr>ptr 2F jd
368 with nogil: 2F jd
369 HANDLE_RETURN(cydriver.cuMemFreeAsync(devptr, s)) 2F jd
371cdef inline _MP_close(_MemPool self):
372 if not self._h_pool: 2_dM w 6 ? @ [ ] ^ _ |e}er ~es afbfcfdfefx ffy gf8bhfift jfkf/ lfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfz A Zf0f1f2f3f4fB C D E u v pd| K m L R X kdfd+b.b/b:b;b
373 return 1|
375 # Reset members in declaration order.
376 # The RAII deleter calls cuMemPoolDestroy if this is an owning handle.
377 self._h_pool.reset() 2_dM w 6 ? @ [ ] ^ _ |e}er ~es afbfcfdfefx ffy gf8bhfift jfkf/ lfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfz A Zf0f1f2f3f4fB C D E u v pd| K m L R X kdfd+b.b/b:b;b
378 self._mempool_owned = False 2_dM w 6 ? @ [ ] ^ _ |e}er ~es afbfcfdfefx ffy gf8bhfift jfkf/ lfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfz A Zf0f1f2f3f4fB C D E u v pd| K m L R X kdfd+b.b/b:b;b
379 self._ipc_data = None 2_dM w 6 ? @ [ ] ^ _ |e}er ~es afbfcfdfefx ffy gf8bhfift jfkf/ lfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfz A Zf0f1f2f3f4fB C D E u v pd| K m L R X kdfd+b.b/b:b;b
380 self._attributes = None 2_dM w 6 ? @ [ ] ^ _ |e}er ~es afbfcfdfefx ffy gf8bhfift jfkf/ lfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfz A Zf0f1f2f3f4fB C D E u v pd| K m L R X kdfd+b.b/b:b;b