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

1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5from __future__ import annotations 

6  

7cimport cython 

8from libc.limits cimport ULLONG_MAX 

9from libc.stdint cimport uint64_t, uintptr_t 

10from libc.string cimport memset 

11  

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 

30  

31from cuda.core._utils.cuda_utils cimport ( 

32 HANDLE_RETURN, 

33) 

34  

35import uuid 

36from typing import TYPE_CHECKING 

37  

38if TYPE_CHECKING: 

39 from cuda.core.graph import GraphBuilder 

40 from cuda.core.typing import DevicePointerType 

41  

42  

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

55  

56  

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

74  

75  

76cdef class _MemPoolAttributes: 

77 """Provides access to memory pool attributes. 

78  

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 

88  

89 def __init__(self, *args, **kwargs) -> None: 

90 raise RuntimeError("_MemPoolAttributes cannot be instantiated directly. Please use MemoryResource APIs.") 2xg

91  

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

97  

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 ) 

103  

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

112  

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

121  

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

125  

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

131  

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

138  

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

142  

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

149  

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

153  

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

160  

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

164  

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

175  

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

179  

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

186  

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

196  

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) 

201  

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

208  

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

218  

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) 

223  

224  

225cdef class _MemPool(MemoryResource): 

226  

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

232  

233 def close(self) -> None: 

234 """Release this object's reference to the memory pool. 

235  

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

243  

244 @property 

245 def is_closed(self) -> bool: 

246 """Whether this memory resource has been closed.""" 

247 return self._h_pool.get() == NULL 2Dd

248  

249 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer: 

250 """Allocate a buffer of the requested size. 

251  

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. 

260  

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

272  

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. 

281  

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

295  

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. 

298  

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``. 

304  

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

318  

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

330  

331 @property 

332 def handle(self) -> object: 

333 """Handle to the underlying memory pool.""" 

334 return as_py(self._h_pool) 2KdV wb

335  

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

340  

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

345  

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

353  

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

361  

362  

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. 

373  

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

378  

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

387  

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 ) 

398  

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

402  

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

404  

405  

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. 

414  

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 ) 

430  

431  

432cdef int MP_raise_release_threshold(_MemPool self) except? -1: 

433 """Raise the pool's release threshold to ULLONG_MAX if currently zero. 

434  

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. 

438  

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 &current_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

462  

463  

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).") 

472  

473  

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

490  

491  

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

499  

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

503  

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