Coverage for cuda/core/_memory/_memory_pool.pyx: 78.63%

131 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-16 01:23 +0000

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

43cdef class _MemPoolAttributes: 

44 """Provides access to memory pool attributes.""" 

45 cdef: 

46 MemoryPoolHandle _h_pool 

47  

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

49 raise RuntimeError("_MemPoolAttributes cannot be instantiated directly. Please use MemoryResource APIs.") 28f

50  

51 @staticmethod 

52 cdef _MemPoolAttributes _init(MemoryPoolHandle h_pool): 

53 cdef _MemPoolAttributes self = _MemPoolAttributes.__new__(_MemPoolAttributes) 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

54 self._h_pool = h_pool 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

55 return self 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

56  

57 def __repr__(self) -> str: 

58 return f"{self.__class__.__name__}(%s)" % ", ".join( 1bac

59 f"{attr}={getattr(self, attr)}" for attr in dir(self) 1bac

60 if not attr.startswith("_") 1bac

61 ) 

62  

63 cdef int _getattribute(self, cydriver.CUmemPool_attribute attr_enum, void* value) except?-1: 

64 with nogil: 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

65 HANDLE_RETURN(cydriver.cuMemPoolGetAttribute(as_cu(self._h_pool), attr_enum, value)) 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

66 return 0 1_`{x$ThfLG%U'V(WigMHydpzABeq)XnkNI*Y+Z,0olOJCmDbacj

67  

68 @property 

69 def reuse_follow_event_dependencies(self) -> bool: 

70 """Allow memory to be reused when there are event dependencies between streams.""" 

71 cdef int value 

72 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, &value) 1(WB,0bac

73 return bool(value) 1(WB,0bac

74  

75 @property 

76 def reuse_allow_opportunistic(self) -> bool: 

77 """Allow reuse of completed frees without dependencies.""" 

78 cdef int value 

79 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, &value) 1'VA+Zbac

80 return bool(value) 1'VA+Zbac

81  

82 @property 

83 def reuse_allow_internal_dependencies(self) -> bool: 

84 """Allow insertion of new stream dependencies for memory reuse.""" 

85 cdef int value 

86 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES, &value) 1%Uz*Ybac

87 return bool(value) 1%Uz*Ybac

88  

89 @property 

90 def release_threshold(self) -> int: 

91 """Amount of reserved memory to hold before OS release.""" 

92 cdef cydriver.cuuint64_t value 

93 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, &value) 2,c-c_ ` { $ T y ) X b a c

94 return int(value) 1_`{$Ty)Xbac

95  

96 @property 

97 def reserved_mem_current(self) -> int: 

98 """Current amount of backing memory allocated.""" 

99 cdef cydriver.cuuint64_t value 

100 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, &value) 1hfLGdpnkNIbac

101 return int(value) 1hfLGdpnkNIbac

102  

103 @property 

104 def reserved_mem_high(self) -> int: 

105 """High watermark of backing memory allocated.""" 

106 cdef cydriver.cuuint64_t value 

107 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, &value) 1LGpNIbac

108 return int(value) 1LGpNIbac

109  

110 @property 

111 def used_mem_current(self) -> int: 

112 """Current amount of memory in use.""" 

113 cdef cydriver.cuuint64_t value 

114 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, &value) 1xigMHeqolOJbacj

115 return int(value) 1xigMHeqolOJbacj

116  

117 @property 

118 def used_mem_high(self) -> int: 

119 """High watermark of memory in use.""" 

120 cdef cydriver.cuuint64_t value 

121 self._getattribute(cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_USED_MEM_HIGH, &value) 1MHqOJCmDbac

122 return int(value) 1MHqOJCmDbac

123  

124  

125cdef class _MemPool(MemoryResource): 

126  

127 def __cinit__(self) -> None: 

128 # Note: subclasses use MP_init_create_pool or MP_init_current_pool to initialize. 

129 self._mempool_owned = False 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbKbLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e|d=d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/c[dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] }d- ]cx ^ ~d]d$e8 %eld'ebdcddd(eR .b9 md$ T h f L G % U ' V ( W i g M H y )ed *ep +ez ,eA -eB .ee /eq :e) X n k N I * Y + Z , 0 o l O J C m D b a c . ed/bndodae.cK S fdad`c5fj :b;b=b?b{c|c}c~c@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

130 self._ipc_data = None 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbKbLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e|d=d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/c[dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] }d- ]cx ^ ~d]d$e8 %eld'ebdcddd(eR .b9 md$ T h f L G % U ' V ( W i g M H y )ed *ep +ez ,eA -eB .ee /eq :e) X n k N I * Y + Z , 0 o l O J C m D b a c . ed/bndodae.cK S fdad`c5fj :b;b=b?b{c|c}c~c@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

131 self._attributes = None 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbKbLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e|d=d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/c[dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] }d- ]cx ^ ~d]d$e8 %eld'ebdcddd(eR .b9 md$ T h f L G % U ' V ( W i g M H y )ed *ep +ez ,eA -eB .ee /eq :e) X n k N I * Y + Z , 0 o l O J C m D b a c . ed/bndodae.cK S fdad`c5fj :b;b=b?b{c|c}c~c@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

132  

133 def close(self) -> None: 

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

135  

136 New allocations and operations requiring this object's pool handle are 

137 rejected afterward. For owned pools, release of the underlying pool's 

138 resources is deferred until all outstanding allocations are freed and 

139 pending free operations complete. :meth:`deallocate` remains available 

140 after :meth:`close` so existing allocations can still be released. 

141 """ 

142 _MP_close(self) 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c

143  

144 @property 

145 def is_closed(self) -> bool: 

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

147 return self._h_pool.get() == NULL 2_c

148  

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

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

151  

152 Parameters 

153 ---------- 

154 size : int 

155 The size of the buffer to allocate, in bytes. 

156 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

157 Keyword-only. The stream on which to perform the allocation 

158 asynchronously. Must be passed explicitly; pass 

159 ``device.default_stream`` to use the default stream. 

160  

161 Returns 

162 ------- 

163 Buffer 

164 The allocated buffer object, which is accessible on the device that this memory 

165 resource was created for. 

166 """ 

167 MP_check_open(self) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b_c[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

168 if self.is_mapped: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

169 raise TypeError("Cannot allocate from a mapped IPC-enabled memory resource") 

170 cdef Stream s = Stream_accept(stream) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

171 return _MP_allocate(self, size, s) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9br s becev w t deeefegeheiejekelemeneoepeqe2 3 rese^d!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - .bh f i g b . /bj :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

172  

173 def deallocate( 

174 self, 

175 ptr: DevicePointerType, 

176 size_t size, 

177 *, 

178 stream: Stream | GraphBuilder 

179 ) -> None: 

180 """Deallocate a buffer previously allocated by this resource. 

181  

182 Parameters 

183 ---------- 

184 ptr : :obj:`~_memory.DevicePointerType` 

185 The pointer or handle to the buffer to deallocate. 

186 size : int 

187 The size of the buffer to deallocate, in bytes. 

188 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

189 Keyword-only. The stream on which to perform the deallocation 

190 asynchronously. Must be passed explicitly; pass 

191 ``device.default_stream`` to use the default stream. 

192 """ 

193 cdef Stream s = Stream_accept(stream) 2x ed

194 _MP_deallocate(self, <uintptr_t>ptr, size, s) 2x ed

195  

196 @property 

197 @cython.critical_section 

198 def attributes(self) -> _MemPoolAttributes: 

199 """Memory pool attributes.""" 

200 MP_check_open(self) 2,c-c_ ` { _cx $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

201 cdef _MemPoolAttributes attributes 

202 if self._attributes is None: 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

203 attributes = _MemPoolAttributes._init(self._h_pool) 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

204 if self._attributes is None: 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

205 self._attributes = attributes 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

206 return self._attributes 2,c-c_ ` { x $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c j

207  

208 @property 

209 def handle(self) -> object: 

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

211 return as_py(self._h_pool) 2]cx ^

212  

213 @property 

214 def is_handle_owned(self) -> bool: 

215 """Whether the memory resource handle is owned. If False, ``close`` has no effect.""" 

216 return self._mempool_owned 2]c^

217  

218 @property 

219 def is_ipc_enabled(self) -> bool: 

220 """Whether this memory resource has IPC enabled.""" 

221 return self._ipc_data is not None 29fpd!fqdr rds sdbetdweudcevdxewdv xdw yd^c6fzd7fAdt #fBd$fCd/c[ddeDdyeEdeeFdzeGdfeHdAeId%fJd'fKd(fLdgeMdheNd)fOd*fPdieQdjeRd+fSd,fTdkeUdleVd-fWd.fXdBeYdCeZd/f0d:f1dDe2dEe3d;f4d=f5dFe6dGe7d?f8dme9dHe!dne#dIe$doe%dJe'dpe(dKe)dqe*dLe+d2 3 re,dMe-dse.dNe/d^d:dve;d4 5 6 7 P Q [ ] - R $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J . .cK S {c|c}c~c! #

222  

223 @property 

224 def is_mapped(self) -> bool: 

225 """ 

226 Whether this is a mapping of an IPC-enabled memory resource from 

227 another process. If True, allocation is not permitted. 

228 """ 

229 return self._ipc_data is not None and self._ipc_data._is_mapped 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t /cdeyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

230  

231 @property 

232 def uuid(self) -> uuid.UUID | None: 

233 """ 

234 A universally unique identifier for this memory resource. Meaningful 

235 only for IPC-enabled memory resources. 

236 """ 

237 return getattr(self._ipc_data, 'uuid', None) 2r s 6f7ft /c^dveP Q

238  

239  

240cdef int MP_init_create_pool( 

241 _MemPool self, 

242 cydriver.CUmemLocationType loc_type, 

243 int loc_id, 

244 cydriver.CUmemAllocationType alloc_type, 

245 bint ipc_enabled, 

246 size_t max_size, 

247) except? -1: 

248 """Initialize a _MemPool by creating a new memory pool with the given 

249 parameters. 

250  

251 Sets ``_h_pool`` (owning), ``_mempool_owned``, and ``_ipc_data``. 

252 """ 

253 cdef cydriver.CUmemPoolProps properties 

254 memset(&properties, 0, sizeof(cydriver.CUmemPoolProps)) 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

255  

256 properties.allocType = alloc_type 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

257 properties.handleTypes = ( 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

258 _ipc.IPC_HANDLE_TYPE if ipc_enabled 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

259 else cydriver.CUmemAllocationHandleType.CU_MEM_HANDLE_TYPE_NONE 2E u 1 =d?d@d? F @ - ]cx ^ ]d8 bdcdddR 9 $ h L % ' ( i M y d p z A B e q ) n N * + , o O C m D b a c . edae.cS fd`cj

260 ) 

261 properties.location.id = loc_id 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

262 properties.location.type = loc_type 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

263 properties.maxSize = max_size 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

264  

265 self._mempool_owned = True 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

266 self._h_pool = create_mempool_handle(properties) 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

267 if not self._h_pool: 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . edae.cK S fdad`cj {c|c}c~c! #

268 HANDLE_RETURN(get_last_error()) 2ae

269 raise RuntimeError( 

270 f"Failed to initialize {self.__class__.__name__}: " 

271 "cuda-core returned an empty memory pool handle without recording a CUDA error. " 

272 "This is an internal cuda-core error; please report it with your CUDA driver, " 

273 "CUDA Toolkit, and cuda-python versions." 

274 ) 

275  

276 if ipc_enabled: 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . ed.cK S fdad`cj {c|c}c~c! #

277 alloc_handle = _ipc.MP_export_mempool(self) 2pdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q T f G U V W g H X k I Y Z 0 l J K ad`c{c|c}c~c! #

278 self._ipc_data = _ipc.IPCDataForMR(alloc_handle, False) 2pdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q T f G U V W g H X k I Y Z 0 l J K ad`c{c|c}c~c! #

279  

280 return 0 2E u 1 =d?d@dpdqdr rds sdtdudvdwdv xdw yd^czdAdt BdCd/cDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d2 3 ,d-d.d/d:d;d4 5 6 7 P Q ? F @ - ]cx ^ ]d8 bdcdddR 9 $ T h f L G % U ' V ( W i g M H y d p z A B e q ) X n k N I * Y + Z , 0 o l O J C m D b a c . ed.cK S fdad`cj {c|c}c~c! #

281  

282  

283cdef int MP_init_current_pool( 

284 _MemPool self, 

285 cydriver.CUmemLocationType loc_type, 

286 int loc_id, 

287 cydriver.CUmemAllocationType alloc_type, 

288) except? -1: 

289 """Initialize a _MemPool by getting the driver's current pool for a 

290 location and allocation type. 

291  

292 Sets ``_h_pool`` (non-owning) via ``cuMemGetMemPool``. 

293 Requires CUDA 13+. 

294 """ 

295 IF CUDA_CORE_BUILD_MAJOR >= 13: 

296 cdef cydriver.CUmemoryPool pool 

297 cdef cydriver.CUmemLocation loc = cumemlocation_from_id(loc_type, loc_id) 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod

298 with nogil: 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod

299 HANDLE_RETURN(cydriver.cuMemGetMemPool(&pool, &loc, alloc_type)) 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod

300 self._h_pool = create_mempool_handle_ref(pool) 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod

301 self._mempool_owned = False 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod

302 return 0 2u :c;c=c?c@c[cYeZe0e1egdhd2eid3ejd4ekd5e6e7e8e9e!e#e$e8 %eld'ebdcddd(eR 9 mdy )ed *ep +ez ,eA -eB .ee /eq :em a ndod

303 ELSE: 

304 raise RuntimeError( 

305 "Getting the current memory pool requires CUDA 13.0 or later" 

306 ) 

307  

308  

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

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

311  

312 By default the release threshold is 0, meaning memory is returned to 

313 the OS as soon as there are no active suballocations. Setting it to 

314 ULLONG_MAX avoids repeated OS round-trips. 

315  

316 Pool attribute reads and writes are potentially unsafe calls while the 

317 calling thread is inside a global or thread-local stream capture: the 

318 driver refuses them and invalidates the capture. Capture mode is a 

319 per-thread property, so the thread is switched to relaxed mode around the 

320 two calls and its previous mode is restored afterwards. This has no 

321 observable effect when the thread is not capturing. The attribute write 

322 executes immediately rather than being recorded into a graph, which is the 

323 intent for a process-wide pool setting. 

324 """ 

325 MP_check_open(self) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

326 cdef cydriver.cuuint64_t current_threshold 

327 cdef cydriver.cuuint64_t max_threshold = ULLONG_MAX 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

328 cdef cydriver.CUstreamCaptureMode mode = cydriver.CU_STREAM_CAPTURE_MODE_RELAXED 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

329 cdef cydriver.CUresult err 

330 cdef cydriver.CUresult restore_err 

331 with nogil: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

332 # On return, mode holds the thread's previous capture mode. 

333 HANDLE_RETURN(cydriver.cuThreadExchangeStreamCaptureMode(&mode)) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

334 err = cydriver.cuMemPoolGetAttribute( 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

335 as_cu(self._h_pool), 

336 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, 

337 &current_threshold 

338 ) 

339 if err == cydriver.CUDA_SUCCESS and current_threshold == 0: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

340 err = cydriver.cuMemPoolSetAttribute( 1=

341 as_cu(self._h_pool), 

342 cydriver.CUmemPool_attribute.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, 

343 &max_threshold 

344 ) 

345 restore_err = cydriver.cuThreadExchangeStreamCaptureMode(&mode) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

346 try: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

347 HANDLE_RETURN(err) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

348 except: 

349 if restore_err != cydriver.CUDA_SUCCESS: 

350 # The attribute error propagates with the restore failure attached 

351 # as a note (error handling policy). 

352 attach_rollback_failure( 

353 b"cuThreadExchangeStreamCaptureMode", restore_err, 

354 b"failed to restore the thread's stream capture mode") 

355 raise 

356 HANDLE_RETURN(restore_err) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

357 return 0 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb_d`d{d/ : ; ,c-c_ ` { qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b|d[d!b= #b$b%b'b(b)b*b+b,b-b_c[ ] }d^ ~d.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

358  

359  

360# Raise an exception if the given stream is capturing. 

361# A result of CU_STREAM_CAPTURE_STATUS_INVALIDATED is considered an error. 

362cdef inline int check_not_capturing(cydriver.CUstream s) except?-1 nogil: 

363 cdef cydriver.CUstreamCaptureStatus capturing 

364 HANDLE_RETURN(cydriver.cuStreamIsCapturing(s, &capturing)) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

365 if capturing != cydriver.CUstreamCaptureStatus.CU_STREAM_CAPTURE_STATUS_NONE: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

366 raise RuntimeError("_MemPool cannot perform memory operations on " 1/:;

367 "a capturing stream (consider using GraphMemoryResource).") 

368  

369  

370cdef Buffer _MP_allocate(_MemPool self, size_t size, Stream stream, type cls = Buffer): 

371 MP_check_open(self) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

372 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

373 cdef DevicePtrHandle h_ptr 

374 with nogil: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

375 check_not_capturing(s) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

376 h_ptr = deviceptr_alloc_from_pool(size, self._h_pool, stream._h_stream) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

377 if not h_ptr: 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

378 HANDLE_RETURN(get_last_error()) 

379 raise RuntimeError( 

380 f"Failed to allocate {size} bytes from {self.__class__.__name__}: " 

381 "cuda-core returned an empty allocation handle without recording a CUDA error. " 

382 "This is an internal cuda-core error; please report it with your CUDA driver, " 

383 "CUDA Toolkit, and cuda-python versions." 

384 ) 

385 return Buffer_from_deviceptr_handle(h_ptr, size, self, None, cls) 2| } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb/ : ; qbrbsbtbubvbwbxbybzbAbBbCbDbEbE u 1 FbGbHbIbJbteKbueLbMbNbObPbQbRbSbTb:c;c=cUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b?c@c[cOePeQegdhdidjdkdReSeTeUeVeWeXer s bewecexev w t deyeeezefeAegeheiejekeleBeCeDeEeFeGemeHeneIeoeJepeKeqeLe2 3 reMeseNe^dve!b4 5 6 7 P Q = #b? F @ $b%b'b(b)b*b+b,b-b[ ] - 8 ldR .b9 mdh f i g d e n k o l b a c . /bndod.cK S j :b;b=b?b@b[b]b^b_b`b! # {b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c

386  

387  

388cdef inline void _MP_deallocate( 

389 _MemPool self, uintptr_t ptr, size_t size, Stream stream 

390) except *: 

391 cdef cydriver.CUstream s = as_cu(stream._h_stream) 2x ed

392 cdef cydriver.CUdeviceptr devptr = <cydriver.CUdeviceptr>ptr 2x ed

393 with nogil: 2x ed

394 HANDLE_RETURN(cydriver.cuMemFreeAsync(devptr, s)) 2x ed

395  

396cdef inline _MP_close(_MemPool self): 

397 if not self._h_pool: 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c

398 return 2]c

399  

400 # Reset members in declaration order. 

401 # The RAII deleter calls cuMemPoolDestroy if this is an owning handle. 

402 self._h_pool.reset() 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c

403 self._mempool_owned = False 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c

404 self._ipc_data = None 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c

405 self._attributes = None 2E u 1 :c;c=c?c@c[c;e=er ?es @e[e]e^e_ev `ew {e^c|e}et ~eaf/cbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4fF _c]cC m D K S fdad`c{c|c}c~c