Coverage for cuda/core/_memory/_memory_pool.pyx: 78.18%
165 statements
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-05 01:11 +0000
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-05 01:11 +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 uint64_t, 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
43# Pool attribute reads and writes and cuMemPoolTrimTo are potentially unsafe
44# calls during stream capture: the driver refuses them, and invalidates the
45# capture, while a global-mode capture is active on any thread or a
46# thread-local one on the calling thread. Capture mode is a per-thread
47# property, so the calling thread is switched to relaxed mode around such a
48# call and its previous mode is restored afterwards. This has no observable
49# effect when nothing is capturing. The call executes immediately rather than
50# being recorded into a graph, which is the intent for a process-wide pool.
51cdef inline int _enter_relaxed_capture_mode(cydriver.CUstreamCaptureMode* mode) except?-1 nogil:
52 # On return, mode holds the thread's previous capture mode.
53 mode[0] = cydriver.CU_STREAM_CAPTURE_MODE_RELAXED 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPeV wbQevc. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l wcH xcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
54 return HANDLE_RETURN(cydriver.cuThreadExchangeStreamCaptureMode(mode)) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPeV wbQevc. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l wcH xcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
57cdef int _exit_relaxed_capture_mode(
58 cydriver.CUresult err, cydriver.CUstreamCaptureMode* mode) except?-1 nogil:
59 """Restore the thread's capture mode, then raise if the call or the restore failed."""
60 cdef cydriver.CUresult restore_err = cydriver.cuThreadExchangeStreamCaptureMode(mode) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPeV wbQevc. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l wcH xcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
61 if err != cydriver.CUDA_SUCCESS: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPeV wbQevc. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l wcH xcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
62 with gil:
63 try:
64 HANDLE_RETURN(err)
65 except:
66 if restore_err != cydriver.CUDA_SUCCESS:
67 # The call's error propagates with the restore failure
68 # attached as a note (error handling policy).
69 attach_rollback_failure(
70 b"cuThreadExchangeStreamCaptureMode", restore_err,
71 b"failed to restore the thread's stream capture mode")
72 raise
73 return HANDLE_RETURN(restore_err) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPeV wbQevc. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l wcH xcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
76cdef class _MemPoolAttributes:
77 """Provides access to memory pool attributes.
79 Setting an attribute changes the memory pool itself, which other memory
80 resources that share the pool, such as a device's default pool, also see.
81 Reading or setting an attribute does not affect a stream capture in
82 progress on any thread. The driver rejects reading or setting an
83 attribute of a memory resource mapped from another process
84 (``is_mapped``), which raises ``CUDAError``.
85 """
86 cdef:
87 MemoryPoolHandle _h_pool
89 def __init__(self, *args, **kwargs) -> None:
90 raise RuntimeError("_MemPoolAttributes cannot be instantiated directly. Please use MemoryResource APIs.") 2xg
92 @staticmethod
93 cdef _MemPoolAttributes _init(MemoryPoolHandle h_pool):
94 cdef _MemPoolAttributes self = _MemPoolAttributes.__new__(_MemPoolAttributes) 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
95 self._h_pool = h_pool 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
96 return self 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
98 def __repr__(self) -> str:
99 return f"{self.__class__.__name__}(%s)" % ", ".join( 1meo
100 f"{attr}={getattr(self, attr)}" for attr in dir(self) 1meo
101 if not attr.startswith("_") 1meo
102 )
104 cdef int _getattribute(self, cydriver.CUmemPool_attribute attr_enum, void* value) except?-1:
105 cdef cydriver.CUstreamCaptureMode mode
106 cdef cydriver.CUresult err
107 with nogil: 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
108 _enter_relaxed_capture_mode(&mode) 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
109 err = cydriver.cuMemPoolGetAttribute(as_cu(self._h_pool), attr_enum, value) 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
110 _exit_relaxed_capture_mode(err, &mode) 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
111 return 0 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
113 cdef int _setattribute(self, cydriver.CUmemPool_attribute attr_enum, void* value) except?-1:
114 cdef cydriver.CUstreamCaptureMode mode
115 cdef cydriver.CUresult err
116 with nogil: 1pfqstuhijvwxLMNyzAOPQngrcdabkl
117 _enter_relaxed_capture_mode(&mode) 1pfqstuhijvwxLMNyzAOPQngrcdabkl
118 err = cydriver.cuMemPoolSetAttribute(as_cu(self._h_pool), attr_enum, value) 1pfqstuhijvwxLMNyzAOPQngrcdabkl
119 _exit_relaxed_capture_mode(err, &mode) 1pfqstuhijvwxLMNyzAOPQngrcdabkl
120 return 0 1pfqstuhijvwxLMNyzAOPQngrcdabkl
122 cdef int _setflag(self, cydriver.CUmemPool_attribute attr_enum, bint flag) except?-1:
123 cdef int value = flag 1pfqstuhijvwx
124 return self._setattribute(attr_enum, &value) 1pfqstuhijvwx
126 cdef int _reset_watermark(self, cydriver.CUmemPool_attribute attr_enum, str name, value) except?-1:
127 if value != 0: 1pfqstuhijvwxcdabkl
128 raise AttributeError(f"Attribute '{name}' may only be set to zero (got {value}).") 1pfq
129 cdef cydriver.cuuint64_t zero = 0 1stuhijvwxcdabkl
130 return self._setattribute(attr_enum, &zero) 1stuhijvwxcdabkl
132 @property
133 def reuse_follow_event_dependencies(self) -> bool:
134 """Allow memory to be reused when there are event dependencies between streams."""
135 cdef int value
136 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, &value) 1;%Z[*meopfq
137 return bool(value) 1;%Z[*meopfq
139 @reuse_follow_event_dependencies.setter
140 def reuse_follow_event_dependencies(self, value: bool) -> None:
141 self._setflag(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, value) 1pfq
143 @property
144 def reuse_allow_opportunistic(self) -> bool:
145 """Allow reuse of completed frees without dependencies."""
146 cdef int value
147 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, &value) 1:$Y@)meopfqstuhijvwx
148 return bool(value) 1:$Y@)meopfqstuhijvwx
150 @reuse_allow_opportunistic.setter
151 def reuse_allow_opportunistic(self, value: bool) -> None:
152 self._setflag(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, value) 1pfqstuhijvwx
154 @property
155 def reuse_allow_internal_dependencies(self) -> bool:
156 """Allow insertion of new stream dependencies for memory reuse."""
157 cdef int value
158 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES, &value) 1/#X?(meopfq
159 return bool(value) 1/#X?(meopfq
161 @reuse_allow_internal_dependencies.setter
162 def reuse_allow_internal_dependencies(self, value: bool) -> None:
163 self._setflag(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES, value) 1pfq
165 @property
166 def release_threshold(self) -> int:
167 """
168 Amount of reserved memory, in bytes, to hold before OS release. When
169 more than this is reserved, the pool returns unused memory to the OS
170 at the next synchronization of an event, stream or device.
171 """
172 cdef cydriver.cuuint64_t value
173 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, &value) 2dbebfb. ! W = ' m e o p f q s t u h i j v w x L M N y z A O P Q
174 return int(value) 2dbebfb. ! W = ' m e o p f q s t u h i j v w x L M N y z A O P Q
176 @release_threshold.setter
177 def release_threshold(self, uint64_t value) -> None:
178 self._setattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, &value) 1pfqstuhijvwxLMNyzAOPQngr
180 @property
181 def reserved_mem_current(self) -> int:
182 """Current amount of backing memory allocated."""
183 cdef cydriver.cuuint64_t value
184 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, &value) 1FD62BTRI84meongrcak
185 return int(value) 1FD62BTRI84meongrcak
187 @property
188 def reserved_mem_high(self) -> int:
189 """
190 High watermark of backing memory allocated. It can be set to zero to
191 reset it to the current value.
192 """
193 cdef cydriver.cuuint64_t value
194 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, &value) 162T84meocak
195 return int(value) 162T84meocak
197 @reserved_mem_high.setter
198 def reserved_mem_high(self, value: int) -> None:
199 self._reset_watermark( 1pfqcak
200 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, "reserved_mem_high", value)
202 @property
203 def used_mem_current(self) -> int:
204 """Current amount of memory in use."""
205 cdef cydriver.cuuint64_t value
206 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, &value) 1VGE73CUSJ95meodblH
207 return int(value) 1VGE73CUSJ95meodblH
209 @property
210 def used_mem_high(self) -> int:
211 """
212 High watermark of memory in use. It can be set to zero to reset it to
213 the current value.
214 """
215 cdef cydriver.cuuint64_t value
216 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_HIGH, &value) 173U950K1meodbl
217 return int(value) 173U950K1meodbl
219 @used_mem_high.setter
220 def used_mem_high(self, value: int) -> None:
221 self._reset_watermark( 1pfqstuhijvwxdbl
222 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_HIGH, "used_mem_high", value)
225cdef class _MemPool(MemoryResource):
227 def __cinit__(self) -> None:
228 # Note: subclasses use MP_init_create_pool or MP_init_current_pool to initialize.
229 self._mempool_owned = False 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfNeReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.dHe/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGedcjbkblbmb~ abecfcgcOehcyd| zdicjckclcmcncocpcqcrcsctcucDdubvb` PeybKdV wbQeUexfAdnbyf2dzfSdTdUdAfbbvcob3d. ! F D 6 2 / # : $ ; % G E 7 3 W BfB CfT DfX EfY FfZ GfC HfU If= ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l Vdwc4d5dWeBd} cbWdRdMdsgH xcyczcAcNdOdPdQdBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
230 self._ipc_data = None 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfNeReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.dHe/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGedcjbkblbmb~ abecfcgcOehcyd| zdicjckclcmcncocpcqcrcsctcucDdubvb` PeybKdV wbQeUexfAdnbyf2dzfSdTdUdAfbbvcob3d. ! F D 6 2 / # : $ ; % G E 7 3 W BfB CfT DfX EfY FfZ GfC HfU If= ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l Vdwc4d5dWeBd} cbWdRdMdsgH xcyczcAcNdOdPdQdBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
231 self._attributes = None 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfNeReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.dHe/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGedcjbkblbmb~ abecfcgcOehcyd| zdicjckclcmcncocpcqcrcsctcucDdubvb` PeybKdV wbQeUexfAdnbyf2dzfSdTdUdAfbbvcob3d. ! F D 6 2 / # : $ ; % G E 7 3 W BfB CfT DfX EfY FfZ GfC HfU If= ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l Vdwc4d5dWeBd} cbWdRdMdsgH xcyczcAcNdOdPdQdBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
233 def close(self) -> None:
234 """Release this object's reference to the memory pool.
236 New allocations and operations requiring this object's pool handle are
237 rejected afterward. For owned pools, release of the underlying pool's
238 resources is deferred until all outstanding allocations are freed and
239 pending free operations complete. :meth:`deallocate` remains available
240 after :meth:`close` so existing allocations can still be released.
241 """
242 _MP_close(self) 2{ ] gbEdFdGdHdIdJdJfKf+ Lf, MfNfOfPfQf^ Rf_ SfLdTfUf- VfWfCdXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrg| Dd` KdAd0 K 1 p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l } cbWdRdMdNdOdPdQd
244 @property
245 def is_closed(self) -> bool:
246 """Whether this memory resource has been closed."""
247 return self._h_pool.get() == NULL 2Dd
249 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer:
250 """Allocate a buffer of the requested size.
252 Parameters
253 ----------
254 size : int
255 The size of the buffer to allocate, in bytes.
256 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
257 Keyword-only. The stream on which to perform the allocation
258 asynchronously. Must be passed explicitly; pass
259 ``device.default_stream`` to use the default stream.
261 Returns
262 -------
263 Buffer
264 The allocated buffer object, which is accessible on the device that this memory
265 resource was created for.
266 """
267 MP_check_open(self) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ 9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbccc+ , XeYe^ _ - Ze0e1e2e3e4e5e6e7e8e9e!e#e$ehbib%e'eVedcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucDdubvb` ybvcF D G E m zbn c d wcH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
268 if self.is_mapped: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ 9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbccc+ , XeYe^ _ - Ze0e1e2e3e4e5e6e7e8e9e!e#e$ehbib%e'eVedcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybvcF D G E m zbn c d wcH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
269 raise TypeError("Cannot allocate from a mapped IPC-enabled memory resource")
270 cdef Stream s = Stream_accept(stream) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ 9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbccc+ , XeYe^ _ - Ze0e1e2e3e4e5e6e7e8e9e!e#e$ehbib%e'eVedcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybvcF D G E m zbn c d wcH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
271 return _MP_allocate(self, size, s) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ 9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbccc+ , XeYe^ _ - Ze0e1e2e3e4e5e6e7e8e9e!e#e$ehbib%e'eVedcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybvcF D G E m zbn c d wcH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
273 def deallocate(
274 self,
275 ptr: DevicePointerType,
276 size_t size,
277 *,
278 stream: Stream | GraphBuilder
279 ) -> None:
280 """Deallocate a buffer previously allocated by this resource.
282 Parameters
283 ----------
284 ptr : :obj:`~_memory.DevicePointerType`
285 The pointer or handle to the buffer to deallocate.
286 size : int
287 The size of the buffer to deallocate, in bytes.
288 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
289 Keyword-only. The stream on which to perform the deallocation
290 asynchronously. Must be passed explicitly; pass
291 ``device.default_stream`` to use the default stream.
292 """
293 cdef Stream s = Stream_accept(stream) 2V Vd
294 _MP_deallocate(self, <uintptr_t>ptr, size, s) 2V Vd
296 def trim(self, size_t min_bytes_to_keep=0) -> None:
297 """Release unused memory held by the memory pool back to the OS.
299 Memory that backs live allocations is not released, nor is memory
300 freed on a stream until the host has observed the free through a
301 synchronization. Trimming does not affect a stream capture in progress
302 on any thread. The driver rejects trimming a memory resource mapped
303 from another process (``is_mapped``), which raises ``CUDAError``.
305 Parameters
306 ----------
307 min_bytes_to_keep : int, optional
308 Reserved memory, in bytes, that the pool keeps. Defaults to 0,
309 which releases all unused memory.
310 """
311 MP_check_open(self) 1stuhijvwxngrcdabkl
312 cdef cydriver.CUstreamCaptureMode mode
313 cdef cydriver.CUresult err
314 with nogil: 1stuhijvwxngrcdabkl
315 _enter_relaxed_capture_mode(&mode) 1stuhijvwxngrcdabkl
316 err = cydriver.cuMemPoolTrimTo(as_cu(self._h_pool), min_bytes_to_keep) 1stuhijvwxngrcdabkl
317 _exit_relaxed_capture_mode(err, &mode) 1stuhijvwxngrcdabkl
319 @property
320 @cython.critical_section
321 def attributes(self) -> _MemPoolAttributes:
322 """:obj:`~_memory._memory_pool._MemPoolAttributes` object with the attributes of the memory pool."""
323 MP_check_open(self) 2dbebfbDdV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
324 cdef _MemPoolAttributes attributes
325 if self._attributes is None: 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
326 attributes = _MemPoolAttributes._init(self._h_pool) 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
327 if self._attributes is None: 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
328 self._attributes = attributes 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
329 return self._attributes 2dbebfbV . ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l H
331 @property
332 def handle(self) -> object:
333 """Handle to the underlying memory pool."""
334 return as_py(self._h_pool) 2KdV wb
336 @property
337 def is_handle_owned(self) -> bool:
338 """Whether the memory resource handle is owned. If False, ``close`` has no effect."""
339 return self._mempool_owned 2Kdwb
341 @property
342 def is_ipc_enabled(self) -> bool:
343 """Whether this memory resource has IPC enabled."""
344 return self._ipc_data is not None 2yg6dzg7d+ 8d, 9dXe!d+e#dYe$d,e%d^ 'd_ (dLdtg)dug*d- Ag+dBg,dCdvg-dwg.dHeZe/d-e:d0e;d.e=d1e?d/e@dCg[dDg]dEg^d2e_d3e`dFg{dGg|d4e}d5e~dHgaeIgbe6ece7edeJgeeKgfe:ege;eheLgieMgje=eke?eleNgmeOgne@eoe[epePgqe8ere]ese9ete^eue!eve_ewe#exe`eye$eze{eAehbib%eBe|eCe'eDe}eEeVeFe*eGejbkblbmb~ abubvbybbb. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 zbBd} cbNdOdPdQdpbqb
346 @property
347 def is_mapped(self) -> bool:
348 """
349 Whether this is a mapping of an IPC-enabled memory resource from
350 another process. If True, allocation is not permitted.
351 """
352 return self._ipc_data is not None and self._ipc_data._is_mapped 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - CdZe-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
354 @property
355 def uuid(self) -> uuid.UUID | None:
356 """
357 A universally unique identifier for this memory resource. Meaningful
358 only for IPC-enabled memory resources.
359 """
360 return getattr(self._ipc_data, 'uuid', None) 2+ , tgug- CdvgwgVe*e~ ab
363cdef int MP_init_create_pool(
364 _MemPool self,
365 cydriver.CUmemLocationType loc_type,
366 int loc_id,
367 cydriver.CUmemAllocationType alloc_type,
368 bint ipc_enabled,
369 size_t max_size,
370) except? -1:
371 """Initialize a _MemPool by creating a new memory pool with the given
372 parameters.
374 Sets ``_h_pool`` (owning), ``_mempool_owned``, and ``_ipc_data``.
375 """
376 cdef cydriver.CUmemPoolProps properties
377 memset(&properties, 0, sizeof(cydriver.CUmemPoolProps)) 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
379 properties.allocType = alloc_type 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
380 properties.handleTypes = ( 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
381 _ipc.IPC_HANDLE_TYPE if ipc_enabled 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
382 else cydriver.CUmemAllocationHandleType.CU_MEM_HANDLE_TYPE_NONE 2{ ] gbReSeTeyd| zd` ybKdV wbUeAdnbSdTdUdbbob. F 6 / : ; G 7 W B T X Y Z C U = R 8 ? @ [ S 9 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBdcbWdMdH
383 )
384 properties.location.id = loc_id 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
385 properties.location.type = loc_type 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
386 properties.maxSize = max_size 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
388 self._mempool_owned = True 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
389 self._h_pool = create_mempool_handle(properties) 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
390 if not self._h_pool: 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdWeBd} cbWdRdMdH NdOdPdQdpbqb
391 HANDLE_RETURN(get_last_error()) 2We
392 raise RuntimeError(
393 f"Failed to initialize {self.__class__.__name__}: "
394 "cuda-core returned an empty memory pool handle without recording a CUDA error. "
395 "This is an internal cuda-core error; please report it with your CUDA driver, "
396 "CUDA Toolkit, and cuda-python versions."
397 )
399 if ipc_enabled: 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdBd} cbWdRdMdH NdOdPdQdpbqb
400 alloc_handle = _ipc.MP_export_mempool(self) 26d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ ab! D 2 # $ % E 3 ' I 4 ( ) * J 5 } RdMdNdOdPdQdpbqb
401 self._ipc_data = _ipc.IPCDataForMR(alloc_handle, False) 26d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ ab! D 2 # $ % E 3 ' I 4 ( ) * J 5 } RdMdNdOdPdQdpbqb
403 return 0 2{ ] gbReSeTe6d7d+ 8d, 9d!d#d$d%d^ 'd_ (dLd)d*d- +d,dCd-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAehbibBeCeDeEeFeGejbkblbmb~ abyd| zd` ybKdV wbUeAdnbSdTdUdbbob. ! F D 6 2 / # : $ ; % G E 7 3 W B T X Y Z C U = ' R I 8 4 ? ( @ ) [ * S J 9 5 0 K 1 m e o p f q s t u h i j v w x zbL M N y z A O P Q n g r c d a b k l VdBd} cbWdRdMdH NdOdPdQdpbqb
406cdef int MP_init_current_pool(
407 _MemPool self,
408 cydriver.CUmemLocationType loc_type,
409 int loc_id,
410 cydriver.CUmemAllocationType alloc_type,
411) except? -1:
412 """Initialize a _MemPool by getting the driver's current pool for a
413 location and allocation type.
415 Sets ``_h_pool`` (non-owning) via ``cuMemGetMemPool``.
416 Requires CUDA 13+.
417 """
418 IF CUDA_CORE_BUILD_MAJOR >= 13:
419 cdef cydriver.CUmemoryPool pool
420 cdef cydriver.CUmemLocation loc = cumemlocation_from_id(loc_type, loc_id) 2] EdFdGdHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfxfAdnbyf2dzfSdTdUdAfbbob3dW BfB CfT DfX EfY FfZ GfC HfU IfK e f h i j y z A g a b 4d5d
421 with nogil: 2] EdFdGdHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfxfAdnbyf2dzfSdTdUdAfbbob3dW BfB CfT DfX EfY FfZ GfC HfU IfK e f h i j y z A g a b 4d5d
422 HANDLE_RETURN(cydriver.cuMemGetMemPool(&pool, &loc, alloc_type)) 2] EdFdGdHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfxfAdnbyf2dzfSdTdUdAfbbob3dW BfB CfT DfX EfY FfZ GfC HfU IfK e f h i j y z A g a b 4d5d
423 self._h_pool = create_mempool_handle_ref(pool) 2] EdFdGdHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfxfAdnbyf2dzfSdTdUdAfbbob3dW BfB CfT DfX EfY FfZ GfC HfU IfK e f h i j y z A g a b 4d5d
424 self._mempool_owned = False 2] EdFdGdHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfxfAdnbyf2dzfSdTdUdAfbbob3dW BfB CfT DfX EfY FfZ GfC HfU IfK e f h i j y z A g a b 4d5d
425 return 0 2] EdFdGdHdIdJdjfkflfmfXdYdnfZdof0dpf1dqfrfsftfufvfwfxfAdnbyf2dzfSdTdUdAfbbob3dW BfB CfT DfX EfY FfZ GfC HfU IfK e f h i j y z A g a b 4d5d
426 ELSE:
427 raise RuntimeError(
428 "Getting the current memory pool requires CUDA 13.0 or later"
429 )
432cdef int MP_raise_release_threshold(_MemPool self) except? -1:
433 """Raise the pool's release threshold to ULLONG_MAX if currently zero.
435 By default the release threshold is 0, meaning memory is returned to
436 the OS as soon as there are no active suballocations. Setting it to
437 ULLONG_MAX avoids repeated OS round-trips.
439 The read and the write run in relaxed capture mode, like every pool
440 attribute access (see ``_enter_relaxed_capture_mode``).
441 """
442 MP_check_open(self) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
443 cdef cydriver.cuuint64_t current_threshold
444 cdef cydriver.cuuint64_t max_threshold = ULLONG_MAX 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
445 cdef cydriver.CUstreamCaptureMode mode
446 cdef cydriver.CUresult err
447 with nogil: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
448 _enter_relaxed_capture_mode(&mode) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
449 err = cydriver.cuMemPoolGetAttribute( 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
450 as_cu(self._h_pool),
451 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD,
452 ¤t_threshold
453 )
454 if err == cydriver.CUDA_SUCCESS and current_threshold == 0: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
455 err = cydriver.cuMemPoolSetAttribute( 2xb
456 as_cu(self._h_pool),
457 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD,
458 &max_threshold
459 )
460 _exit_relaxed_capture_mode(err, &mode) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
461 return 0 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbIeJeKerbsbtbLeMedbebfbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccNeHedcecfcgcOehcicjckclcmcncocpcqcrcsctcucDdubvbPewbQevcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
464# Raise an exception if the given stream is capturing.
465# A result of CU_STREAM_CAPTURE_STATUS_INVALIDATED is considered an error.
466cdef inline int check_not_capturing(cydriver.CUstream s) except?-1 nogil:
467 cdef cydriver.CUstreamCaptureStatus capturing
468 HANDLE_RETURN(cydriver.cuStreamIsCapturing(s, &capturing)) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
469 if capturing != cydriver.CUstreamCaptureStatus.CU_STREAM_CAPTURE_STATUS_NONE: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
470 raise RuntimeError("_MemPool cannot perform memory operations on " 2rbsbtb
471 "a capturing stream (consider using GraphMemoryResource).")
474cdef Buffer _MP_allocate(_MemPool self, size_t size, Stream stream, type cls = Buffer):
475 MP_check_open(self) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
476 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
477 cdef DevicePtrHandle h_ptr
478 with nogil: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
479 check_not_capturing(s) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
480 h_ptr = deviceptr_alloc_from_pool(size, self._h_pool, stream._h_stream) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
481 if not h_ptr: 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
482 HANDLE_RETURN(get_last_error()) 1`
483 raise RuntimeError(
484 f"Failed to allocate {size} bytes from {self.__class__.__name__}: "
485 "cuda-core returned an empty allocation handle without recording a CUDA error. "
486 "This is an internal cuda-core error; please report it with your CUDA driver, "
487 "CUDA Toolkit, and cuda-python versions."
488 )
489 return Buffer_from_deviceptr_handle(h_ptr, size, self, None, cls) 2AbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbrbsbtbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b{ ] gb9b!b#b$b%b(e'b)e(b)b*b+b,b-b.b/b:bEdFdGd;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccHdIdJd~eafbfXdYdZd0d1dcfdfefffgfhfif+ , Xe+eYe,e^ _ - Ze-e0e.e1e/e2e3e4e5e6e7e:e;e=e?e@e[e8e]e9e^e!e_e#e`e$e{ehbib%e|e'e}eVe*edcjbkblbmb~ abecfcgchcyd| zdicjckclcmcncocpcqcrcsctcucubvb` ybnb2dbbvcob3dF D G E B C R I S J m e o zbn g r c d a b k l wc4d5dBd} cbH xcyczcAcBcCcDcEcFcGcpbqbHcIcJcKcLcMcNcOcxbPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxd
492cdef inline void _MP_deallocate(
493 _MemPool self, uintptr_t ptr, size_t size, Stream stream
494) except *:
495 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2V Vd
496 cdef cydriver.CUdeviceptr devptr = <cydriver.CUdeviceptr>ptr 2V Vd
497 with nogil: 2V Vd
498 HANDLE_RETURN(cydriver.cuMemFreeAsync(devptr, s)) 2V Vd
500cdef inline _MP_close(_MemPool self):
501 if not self._h_pool: 2{ ] gbEdFdGdHdIdJdJfKf+ Lf, MfNfOfPfQf^ Rf_ SfLdTfUf- VfWfCdXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrg| Dd` KdAd0 K 1 p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l } cbWdRdMdNdOdPdQd
502 return 2Kd
504 # Reset members in declaration order.
505 # The RAII deleter calls cuMemPoolDestroy if this is an owning handle.
506 self._h_pool.reset() 2{ ] gbEdFdGdHdIdJdJfKf+ Lf, MfNfOfPfQf^ Rf_ SfLdTfUf- VfWfCdXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrg| Dd` KdAd0 K 1 p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l } cbWdRdMdNdOdPdQd
507 self._mempool_owned = False 2{ ] gbEdFdGdHdIdJdJfKf+ Lf, MfNfOfPfQf^ Rf_ SfLdTfUf- VfWfCdXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrg| Dd` KdAd0 K 1 p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l } cbWdRdMdNdOdPdQd
508 self._ipc_data = None 2{ ] gbEdFdGdHdIdJdJfKf+ Lf, MfNfOfPfQf^ Rf_ SfLdTfUf- VfWfCdXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrg| Dd` KdAd0 K 1 p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l } cbWdRdMdNdOdPdQd
509 self._attributes = None 2{ ] gbEdFdGdHdIdJdJfKf+ Lf, MfNfOfPfQf^ Rf_ SfLdTfUf- VfWfCdXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrg| Dd` KdAd0 K 1 p f q s t u h i j v w x L M N y z A O P Q n g r c d a b k l } cbWdRdMdNdOdPdQd