Coverage for cuda / core / _module.pyx: 85.62%

320 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-25 01:07 +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  

7from libc.stddef cimport size_t 

8  

9import functools 

10import threading 

11from collections import namedtuple 

12  

13from cuda.core._device import Device 

14from cuda.core._launch_config cimport LaunchConfig 

15from cuda.core._launch_config import LaunchConfig 

16from cuda.core._stream cimport Stream 

17from cuda.core._resource_handles cimport ( 

18 LibraryHandle, 

19 KernelHandle, 

20 create_library_handle_from_file, 

21 create_library_handle_from_data, 

22 create_kernel_handle, 

23 create_kernel_handle_ref, 

24 get_kernel_library, 

25 get_last_error, 

26 as_cu, 

27 as_py, 

28 as_intptr, 

29) 

30from cuda.core._stream import Stream 

31from cuda.core._utils.clear_error_support import ( 

32 assert_type_str_or_bytes_like, 

33 raise_code_path_meant_to_be_unreachable, 

34) 

35from cuda.core._utils.cuda_utils cimport HANDLE_RETURN 

36from cuda.core._utils.cuda_utils import driver, get_binding_version 

37from cuda.bindings cimport cydriver 

38  

39__all__ = ["Kernel", "ObjectCode"] 

40  

41# Lazy initialization state and synchronization 

42# For Python 3.13t (free-threaded builds), we use a lock to ensure thread-safe initialization. 

43# For regular Python builds with GIL, the lock overhead is minimal and the code remains safe. 

44cdef object _init_lock = threading.Lock() 

45cdef bint _inited = False 

46cdef int _py_major_ver = 0 

47cdef int _py_minor_ver = 0 

48cdef int _driver_ver = 0 

49cdef tuple _kernel_ctypes = None 

50cdef bint _paraminfo_supported = False 

51  

52  

53cdef int _lazy_init() except -1: 

54 """ 

55 Initialize module-level state in a thread-safe manner. 

56  

57 This function is thread-safe and suitable for both: 

58 - Regular Python builds (with GIL) 

59 - Python 3.13t free-threaded builds (without GIL) 

60  

61 Uses double-checked locking pattern for performance: 

62 - Fast path: check without lock if already initialized 

63 - Slow path: acquire lock and initialize if needed 

64 """ 

65 global _inited 

66 # Fast path: already initialized (no lock needed for read) 

67 if _inited: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tc{ ucy vcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdZeddSeed0efdTegd1ehd2eid3ejd4ekdUeld5emd6end7eod8epd9eqd!erd#esdVetdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

68 return 0 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tc{ ucy vcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdZeddSeed0efdTegd1ehd2eid3ejd4ekdUeld5emd6end7eod8epd9eqd!erd#esdVetdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

69  

70 cdef int drv_ver 

71 # Slow path: acquire lock and initialize 

72 with _init_lock: 1t

73 # Double-check: another thread might have initialized while we waited 

74 if _inited: 1t

75 return 0 

76  

77 global _py_major_ver, _py_minor_ver, _driver_ver, _kernel_ctypes, _paraminfo_supported 

78 # binding availability depends on cuda-python version 

79 _py_major_ver, _py_minor_ver = get_binding_version() 1t

80 _kernel_ctypes = (driver.CUkernel,) 1t

81 with nogil: 1t

82 HANDLE_RETURN(cydriver.cuDriverGetVersion(&drv_ver)) 1t

83 _driver_ver = drv_ver 1t

84 _paraminfo_supported = _driver_ver >= 12040 1t

85  

86 # Mark as initialized (must be last to ensure all state is set) 

87 _inited = True 1t

88  

89 return 0 1t

90  

91  

92# Auto-initializing accessors (cdef for internal use) 

93cdef inline int _get_py_major_ver() except -1: 

94 """Get the Python binding major version, initializing if needed.""" 

95 _lazy_init() 

96 return _py_major_ver 

97  

98  

99cdef inline int _get_py_minor_ver() except -1: 

100 """Get the Python binding minor version, initializing if needed.""" 

101 _lazy_init() 

102 return _py_minor_ver 

103  

104  

105cdef inline int _get_driver_ver() except -1: 

106 """Get the CUDA driver version, initializing if needed.""" 

107 _lazy_init() 

108 return _driver_ver 

109  

110  

111cdef inline tuple _get_kernel_ctypes(): 

112 """Get the kernel ctypes tuple, initializing if needed.""" 

113 _lazy_init() 

114 return _kernel_ctypes 

115  

116  

117cdef inline bint _is_paraminfo_supported() except -1: 

118 """Return True if cuKernelGetParamInfo is available (driver >= 12.4).""" 

119 _lazy_init() 2d s o e f g h p i j k l Ve

120 return _paraminfo_supported 2d s o e f g h p i j k l Ve

121  

122  

123@functools.cache 

124def _is_cukernel_get_library_supported() -> bool: 

125 """Return True when cuKernelGetLibrary is available for inverse kernel-to-library lookup. 

126  

127 Requires cuda-python bindings >= 12.5 and driver >= 12.5. 

128 """ 

129 return ( 

130 (_get_py_major_ver(), _get_py_minor_ver()) >= (12, 5) 

131 and _get_driver_ver() >= 12050 

132 and hasattr(driver, "cuKernelGetLibrary") 

133 ) 

134  

135  

136cdef inline LibraryHandle _make_empty_library_handle(): 

137 """Create an empty LibraryHandle to indicate no library loaded.""" 

138 return LibraryHandle() # Empty shared_ptr 

139  

140  

141cdef class KernelAttributes: 

142 """Provides access to kernel attributes.""" 

143  

144 def __init__(self, *args, **kwargs): 

145 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2Dh

146  

147 @staticmethod 

148 cdef KernelAttributes _init(KernelHandle h_kernel): 

149 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

150 self._h_kernel = h_kernel 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

151 self._cache = {} 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

152 _lazy_init() 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

153 return self 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

154  

155 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1: 

156 """Helper function to get a cached attribute or fetch and cache it if not present.""" 

157 cdef tuple cache_key = (device_id, <int>attribute) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

158 cached = self._cache.get(cache_key, cache_key) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

159 if cached is not cache_key: 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

160 return cached 2ZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

161 cdef int result 

162 with nogil: 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

163 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

164 self._cache[cache_key] = result 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

165 return result 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

166  

167 cdef inline int _resolve_device_id(self, device_id) except? -1: 

168 """Convert Device or int to device_id int.""" 

169 return Device(device_id).device_id 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

170  

171 def max_threads_per_block(self, device_id: Device | int = None) -> int: 

172 """int : The maximum number of threads per block. 

173 This attribute is read-only.""" 

174 return self._get_cached_attribute( 2c m n u b { y 4e

175 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2c m n u b { y 4e

176 ) 

177  

178 def shared_size_bytes(self, device_id: Device | int = None) -> int: 

179 """int : The size in bytes of statically-allocated shared memory required by this function. 

180 This attribute is read-only.""" 

181 return self._get_cached_attribute( 2#e

182 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2#e

183 ) 

184  

185 def const_size_bytes(self, device_id: Device | int = None) -> int: 

186 """int : The size in bytes of user-allocated constant memory required by this function. 

187 This attribute is read-only.""" 

188 return self._get_cached_attribute( 21e

189 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 21e

190 ) 

191  

192 def local_size_bytes(self, device_id: Device | int = None) -> int: 

193 """int : The size in bytes of local memory used by each thread of this function. 

194 This attribute is read-only.""" 

195 return self._get_cached_attribute( 22e

196 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 22e

197 ) 

198  

199 def num_regs(self, device_id: Device | int = None) -> int: 

200 """int : The number of registers used by each thread of this function. 

201 This attribute is read-only.""" 

202 return self._get_cached_attribute( 2GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c5e

203 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c5e

204 ) 

205  

206 def ptx_version(self, device_id: Device | int = None) -> int: 

207 """int : The PTX virtual architecture version for which the function was compiled. 

208 This attribute is read-only.""" 

209 return self._get_cached_attribute( 27e

210 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 27e

211 ) 

212  

213 def binary_version(self, device_id: Device | int = None) -> int: 

214 """int : The binary architecture version for which the function was compiled. 

215 This attribute is read-only.""" 

216 return self._get_cached_attribute( 2Ze

217 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2Ze

218 ) 

219  

220 def cache_mode_ca(self, device_id: Device | int = None) -> bool: 

221 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set. 

222 This attribute is read-only.""" 

223 return bool( 2Se

224 self._get_cached_attribute( 2Se

225 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2Se

226 ) 

227 ) 

228  

229 def max_dynamic_shared_size_bytes(self, device_id: Device | int = None) -> int: 

230 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used 

231 by this function.""" 

232 return self._get_cached_attribute( 23e

233 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 23e

234 ) 

235  

236 def preferred_shared_memory_carveout(self, device_id: Device | int = None) -> int: 

237 """int : The shared memory carveout preference, in percent of the total shared memory.""" 

238 return self._get_cached_attribute( 26e

239 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 26e

240 ) 

241  

242 def cluster_size_must_be_set(self, device_id: Device | int = None) -> bool: 

243 """bool : The kernel must launch with a valid cluster size specified. 

244 This attribute is read-only.""" 

245 return bool( 2Te

246 self._get_cached_attribute( 2Te

247 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2Te

248 ) 

249 ) 

250  

251 def required_cluster_width(self, device_id: Device | int = None) -> int: 

252 """int : The required cluster width in blocks.""" 

253 return self._get_cached_attribute( 2!e

254 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2!e

255 ) 

256  

257 def required_cluster_height(self, device_id: Device | int = None) -> int: 

258 """int : The required cluster height in blocks.""" 

259 return self._get_cached_attribute( 29e

260 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 29e

261 ) 

262  

263 def required_cluster_depth(self, device_id: Device | int = None) -> int: 

264 """int : The required cluster depth in blocks.""" 

265 return self._get_cached_attribute( 28e

266 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 28e

267 ) 

268  

269 def non_portable_cluster_size_allowed(self, device_id: Device | int = None) -> bool: 

270 """bool : Whether the function can be launched with non-portable cluster size.""" 

271 return bool( 2Ue

272 self._get_cached_attribute( 2Ue

273 self._resolve_device_id(device_id), 2Ue

274 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 

275 ) 

276 ) 

277  

278 def cluster_scheduling_policy_preference(self, device_id: Device | int = None) -> int: 

279 """int : The block scheduling policy of a function.""" 

280 return self._get_cached_attribute( 20e

281 self._resolve_device_id(device_id), 20e

282 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE, 

283 ) 

284  

285  

286MaxPotentialBlockSizeOccupancyResult = namedtuple("MaxPotential", ("min_grid_size", "max_block_size")) 

287  

288  

289cdef class KernelOccupancy: 

290 """This class offers methods to query occupancy metrics that help determine optimal 

291 launch parameters such as block size, grid size, and shared memory usage. 

292 """ 

293  

294 def __init__(self, *args, **kwargs): 

295 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 2Eh

296  

297 @staticmethod 

298 cdef KernelOccupancy _init(KernelHandle h_kernel): 

299 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

300 self._h_kernel = h_kernel 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

301 return self 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

302  

303 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int: 

304 """Occupancy of the kernel. 

305  

306 Returns the maximum number of active blocks per multiprocessor for this kernel. 

307  

308 Parameters 

309 ---------- 

310 block_size: int 

311 Block size parameter used to launch this kernel. 

312 dynamic_shared_memory_size: int 

313 The amount of dynamic shared memory in bytes needed by block. 

314 Use `0` if block does not need shared memory. 

315  

316 Returns 

317 ------- 

318 int 

319 The maximum number of active blocks per multiprocessor. 

320  

321 Note 

322 ---- 

323 The fraction of the product of maximum number of active blocks per multiprocessor 

324 and the block size to the maximum number of threads per multiprocessor is known as 

325 theoretical multiprocessor utilization (occupancy). 

326  

327 """ 

328 cdef int num_blocks 

329 cdef int c_block_size = block_size 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c

330 cdef size_t c_shmem_size = dynamic_shared_memory_size 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c

331 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c

332 with nogil: 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c

333 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c

334 &num_blocks, func, c_block_size, c_shmem_size 

335 )) 

336 return num_blocks 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c

337  

338 def max_potential_block_size( 

339 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int 

340 ) -> MaxPotentialBlockSizeOccupancyResult: 

341 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy. 

342  

343 Returns the minimum grid size needed to achieve the maximum occupancy and 

344 the maximum block size that can achieve the maximum occupancy. 

345  

346 Parameters 

347 ---------- 

348 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize] 

349 The amount of dynamic shared memory in bytes needed by block. 

350 Use `0` if block does not need shared memory. Use C-callable 

351 represented by :obj:`~driver.CUoccupancyB2DSize` to encode 

352 amount of needed dynamic shared memory which varies depending 

353 on tne block size. 

354 block_size_limit: int 

355 Known upper limit on the kernel block size. Use `0` to indicate 

356 the maximum block size permitted by the device / kernel instead 

357  

358 Returns 

359 ------- 

360 :obj:`~MaxPotentialBlockSizeOccupancyResult` 

361 An object with `min_grid_size` amd `max_block_size` attributes encoding 

362 the suggested launch configuration. 

363  

364 Note 

365 ---- 

366 Please be advised that use of C-callable that requires Python Global 

367 Interpreter Lock may lead to deadlocks. 

368  

369 """ 

370 cdef int min_grid_size, max_block_size 

371 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

372 cdef cydriver.CUoccupancyB2DSize callback 

373 cdef size_t c_shmem_size 

374 cdef int c_block_size_limit = block_size_limit 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

375 if isinstance(dynamic_shared_memory_needed, int): 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

376 c_shmem_size = dynamic_shared_memory_needed 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

377 with nogil: 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

378 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

379 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit 

380 )) 

381 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

382 # Callback may require GIL, so don't use nogil here 

383 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr() 

384 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 

385 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit 

386 )) 

387 else: 

388 raise TypeError( 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

389 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

390 f"got {type(dynamic_shared_memory_needed)}" 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

391 ) 

392 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

393  

394 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int: 

395 """Dynamic shared memory available per block for given launch configuration. 

396  

397 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration. 

398  

399 Parameters 

400 ---------- 

401 num_blocks_per_multiprocessor: int 

402 Number of blocks to be concurrently executing on a multiprocessor. 

403 block_size: int 

404 Block size parameter used to launch this kernel. 

405  

406 Returns 

407 ------- 

408 int 

409 Dynamic shared memory available per block for given launch configuration. 

410 """ 

411 cdef size_t dynamic_smem_size 

412 cdef int c_num_blocks = num_blocks_per_multiprocessor 2tgugvgwgxgyg

413 cdef int c_block_size = block_size 2tgugvgwgxgyg

414 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2tgugvgwgxgyg

415 with nogil: 2tgugvgwgxgyg

416 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2tgugvgwgxgyg

417 &dynamic_smem_size, func, c_num_blocks, c_block_size 

418 )) 

419 return dynamic_smem_size 2tgugvgwgxgyg

420  

421 def max_potential_cluster_size(self, config: LaunchConfig, stream: Stream | None = None) -> int: 

422 """Maximum potential cluster size. 

423  

424 The maximum potential cluster size for this kernel and given launch configuration. 

425  

426 Parameters 

427 ---------- 

428 config: :obj:`~_launch_config.LaunchConfig` 

429 Kernel launch configuration. Cluster dimensions in the configuration are ignored. 

430 stream: :obj:`~Stream`, optional 

431 The stream on which this kernel is to be launched. 

432  

433 Returns 

434 ------- 

435 int 

436 The maximum cluster size that can be launched for this kernel and launch configuration. 

437 """ 

438 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config() 

439 cdef Stream s 

440 if stream is not None: 

441 s = <Stream>stream 

442 drv_cfg.hStream = as_cu(s._h_stream) 

443 cdef int cluster_size 

444 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 

445 with nogil: 

446 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg)) 

447 return cluster_size 

448  

449 def max_active_clusters(self, config: LaunchConfig, stream: Stream | None = None) -> int: 

450 """Maximum number of active clusters on the target device. 

451  

452 The maximum number of clusters that could concurrently execute on the target device. 

453  

454 Parameters 

455 ---------- 

456 config: :obj:`~_launch_config.LaunchConfig` 

457 Kernel launch configuration. 

458 stream: :obj:`~Stream`, optional 

459 The stream on which this kernel is to be launched. 

460  

461 Returns 

462 ------- 

463 int 

464 The maximum number of clusters that could co-exist on the target device. 

465 """ 

466 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config() 

467 cdef Stream s 

468 if stream is not None: 

469 s = <Stream>stream 

470 drv_cfg.hStream = as_cu(s._h_stream) 

471 cdef int num_clusters 

472 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 

473 with nogil: 

474 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg)) 

475 return num_clusters 

476  

477  

478ParamInfo = namedtuple("ParamInfo", ["offset", "size"]) 

479  

480  

481cdef class Kernel: 

482 """Represent a compiled kernel that had been loaded onto the device. 

483  

484 Kernel instances can execution when passed directly into the 

485 :func:`~launch` function. 

486  

487 Directly creating a :obj:`~_module.Kernel` is not supported, and they 

488 should instead be created through a :obj:`~_module.ObjectCode` object. 

489  

490 """ 

491  

492 def __init__(self, *args, **kwargs): 

493 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 2Fh

494  

495 @staticmethod 

496 cdef Kernel _from_handle(KernelHandle h_kernel): 

497 cdef Kernel ker = Kernel.__new__(Kernel) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe

498 ker._h_kernel = h_kernel 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe

499 ker._attributes = None 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe

500 ker._occupancy = None 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe

501 return ker 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe

502  

503 @property 

504 def attributes(self) -> KernelAttributes: 

505 """Get the read-only attributes of this kernel.""" 

506 if self._attributes is None: 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

507 self._attributes = KernelAttributes._init(self._h_kernel) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

508 return self._attributes 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e

509  

510 cdef tuple _get_arguments_info(self, bint param_info=False): 

511 if not _is_paraminfo_supported(): 2d s o e f g h p i j k l Ve

512 driver_ver = _get_driver_ver() 

513 raise NotImplementedError( 

514 "Driver version 12.4 or newer is required for this function. " 

515 f"Using driver version {driver_ver // 1000}.{(driver_ver % 1000) // 10}" 

516 ) 

517 cdef size_t arg_pos = 0 2d s o e f g h p i j k l Ve

518 cdef list param_info_data = [] 2d s o e f g h p i j k l Ve

519 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2d s o e f g h p i j k l Ve

520 cdef size_t param_offset, param_size 

521 cdef cydriver.CUresult err 

522 while True: 2d s o e f g h p i j k l Ve

523 with nogil: 2d s o e f g h p i j k l Ve

524 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, &param_offset, &param_size) 2d s o e f g h p i j k l Ve

525 if err != cydriver.CUDA_SUCCESS: 2d s o e f g h p i j k l Ve

526 break 2d s o e f g h p i j k l Ve

527 if param_info: 2d e f g h i j k l Ve

528 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2e f g h i j k l Ve

529 arg_pos = arg_pos + 1 2d e f g h i j k l Ve

530 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2d s o e f g h p i j k l Ve

531 HANDLE_RETURN(err) 1s

532 return arg_pos, param_info_data 2d o e f g h p i j k l Ve

533  

534 @property 

535 def num_arguments(self) -> int: 

536 """int : The number of arguments of this function""" 

537 num_args, _ = self._get_arguments_info() 2d s o e f g h p i j k l Ve

538 return num_args 2d o e f g h p i j k l Ve

539  

540 @property 

541 def arguments_info(self) -> list[ParamInfo]: 

542 """list[ParamInfo]: (offset, size) for each argument of this function""" 

543 _, param_info = self._get_arguments_info(param_info=True) 2o e f g h p i j k l Ve

544 return param_info 2o e f g h p i j k l Ve

545  

546 @property 

547 def occupancy(self) -> KernelOccupancy: 

548 """Get the occupancy information for launching this kernel.""" 

549 if self._occupancy is None: 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

550 self._occupancy = KernelOccupancy._init(self._h_kernel) 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

551 return self._occupancy 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf

552  

553 @property 

554 def handle(self): 

555 """Return the underlying kernel handle object. 

556  

557 .. caution:: 

558  

559 This handle is a Python object. To get the memory address of the underlying C 

560 handle, call ``int(Kernel.handle)``. 

561 """ 

562 return as_py(self._h_kernel) 2c Ghb ~e{ y d v q

563  

564 @property 

565 def _handle(self): 

566 return self.handle 

567  

568 @staticmethod 

569 def from_handle(handle, mod: ObjectCode = None) -> Kernel: 

570 """Creates a new :obj:`Kernel` object from a kernel handle. 

571  

572 Parameters 

573 ---------- 

574 handle : int 

575 Kernel handle representing the address of a foreign 

576 kernel object (CUkernel). 

577 mod : :obj:`ObjectCode`, optional 

578 The ObjectCode object associated with this kernel. Provides 

579 library lifetime for foreign kernels not created by 

580 cuda.core. 

581 """ 

582  

583 if not isinstance(handle, int): 2c u b ~e{ thuhvhwhxhyhzhAhBhChy q

584 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2thuhvhwhxhyhzhAhBhCh

585  

586 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2c u b ~e{ y q

587 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2c u b ~e{ y q

588 if not h_kernel: 2c u b ~e{ y q

589 HANDLE_RETURN(get_last_error()) 

590  

591 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2c u b ~e{ y q

592 cdef LibraryHandle h_caller_lib 

593  

594 if mod is not None: 2c u b ~e{ y q

595 h_caller_lib = (<ObjectCode>mod)._h_library 2b ~ey

596 if h_existing_lib and h_caller_lib: 2b ~ey

597 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2b ~ey

598 import warnings 1b

599 warnings.warn( 1b

600 "The library from the provided ObjectCode does not match " 

601 "the library associated with this kernel.", 

602 stacklevel=2, 

603 ) 

604  

605 cdef Kernel k = Kernel._from_handle(h_kernel) 2c u b ~e{ y q

606 if mod is not None and not h_existing_lib: 2c u b ~e{ y q

607 k._keepalive = mod 

608 return k 2c u b ~e{ y q

609  

610 def __eq__(self, other) -> bool: 

611 if not isinstance(other, Kernel): 2phqhv q B C D E F G H I J K L M N O P Q R S T U V W x X Y z A

612 return NotImplemented 1vBCDEFGHIJKLMNOPQRSTUVWxX

613 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2phqhv q Y z A

614  

615 def __hash__(self) -> int: 

616 return hash(as_intptr(self._h_kernel)) 1qZ0123456789!#$%'()*+,-.w/:=?zA

617  

618 def __repr__(self) -> str: 

619 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1t;

620  

621  

622CodeTypeT = bytes | bytearray | str 

623  

624cdef tuple _supported_code_type = ("cubin", "ptx", "ltoir", "fatbin", "object", "library") 

625  

626cdef class ObjectCode: 

627 """Represent a compiled program to be loaded onto the device. 

628  

629 This object provides a unified interface for different types of 

630 compiled programs that will be loaded onto the device. 

631  

632 Note 

633 ---- 

634 This class has no default constructor. If you already have a cubin that you would 

635 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly 

636 from all other possible code types should be avoided in favor of compilation through 

637 :class:`~cuda.core.Program` 

638 """ 

639  

640 def __init__(self, *args, **kwargs): 

641 raise RuntimeError( 2Hh

642 "ObjectCode objects cannot be instantiated directly. " 

643 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)." 

644 ) 

645  

646 @classmethod 

647 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict | None = None): 

648 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

649 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

650  

651 # _h_library is assigned during _lazy_load_module 

652 self._h_library = LibraryHandle() # Empty handle 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

653 _lazy_init() 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

654  

655 self._code_type = code_type 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

656 self._module = module 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

657 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

658 self._name = name if name else "" 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

659  

660 return self 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f

661  

662 @staticmethod 

663 def _reduce_helper(module, code_type, name, symbol_mapping): 

664 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2vf{f|f

665  

666 def __reduce__(self): 

667 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2vf{f|f

668  

669 @staticmethod 

670 def from_cubin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

671 """Create an :class:`ObjectCode` instance from an existing cubin. 

672  

673 Parameters 

674 ---------- 

675 module : Union[bytes, str] 

676 Either a bytes object containing the in-memory cubin to load, or 

677 a file path string pointing to the on-disk cubin to load. 

678 name : Optional[str] 

679 A human-readable identifier representing this code object. 

680 symbol_mapping : Optional[dict] 

681 A dictionary specifying how the unmangled symbol names (as keys) 

682 should be mapped to the mangled names before trying to retrieve 

683 them (default to no mappings). 

684 """ 

685 return ObjectCode._init(module, "cubin", name=name, symbol_mapping=symbol_mapping) 1|}

686  

687 @staticmethod 

688 def from_ptx(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

689 """Create an :class:`ObjectCode` instance from an existing PTX. 

690  

691 Parameters 

692 ---------- 

693 module : Union[bytes, str] 

694 Either a bytes object containing the in-memory ptx code to load, or 

695 a file path string pointing to the on-disk ptx file to load. 

696 name : Optional[str] 

697 A human-readable identifier representing this code object. 

698 symbol_mapping : Optional[dict] 

699 A dictionary specifying how the unmangled symbol names (as keys) 

700 should be mapped to the mangled names before trying to retrieve 

701 them (default to no mappings). 

702 """ 

703 return ObjectCode._init(module, "ptx", name=name, symbol_mapping=symbol_mapping) 2wfyf2f

704  

705 @staticmethod 

706 def from_ltoir(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

707 """Create an :class:`ObjectCode` instance from an existing LTOIR. 

708  

709 Parameters 

710 ---------- 

711 module : Union[bytes, str] 

712 Either a bytes object containing the in-memory ltoir code to load, or 

713 a file path string pointing to the on-disk ltoir file to load. 

714 name : Optional[str] 

715 A human-readable identifier representing this code object. 

716 symbol_mapping : Optional[dict] 

717 A dictionary specifying how the unmangled symbol names (as keys) 

718 should be mapped to the mangled names before trying to retrieve 

719 them (default to no mappings). 

720 """ 

721 return ObjectCode._init(module, "ltoir", name=name, symbol_mapping=symbol_mapping) 2xfNe

722  

723 @staticmethod 

724 def from_fatbin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

725 """Create an :class:`ObjectCode` instance from an existing fatbin. 

726  

727 Parameters 

728 ---------- 

729 module : Union[bytes, str] 

730 Either a bytes object containing the in-memory fatbin to load, or 

731 a file path string pointing to the on-disk fatbin to load. 

732 name : Optional[str] 

733 A human-readable identifier representing this code object. 

734 symbol_mapping : Optional[dict] 

735 A dictionary specifying how the unmangled symbol names (as keys) 

736 should be mapped to the mangled names before trying to retrieve 

737 them (default to no mappings). 

738 """ 

739 return ObjectCode._init(module, "fatbin", name=name, symbol_mapping=symbol_mapping) 

740  

741 @staticmethod 

742 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

743 """Create an :class:`ObjectCode` instance from an existing object code. 

744  

745 Parameters 

746 ---------- 

747 module : Union[bytes, str] 

748 Either a bytes object containing the in-memory object code to load, or 

749 a file path string pointing to the on-disk object code to load. 

750 name : Optional[str] 

751 A human-readable identifier representing this code object. 

752 symbol_mapping : Optional[dict] 

753 A dictionary specifying how the unmangled symbol names (as keys) 

754 should be mapped to the mangled names before trying to retrieve 

755 them (default to no mappings). 

756 """ 

757 return ObjectCode._init(module, "object", name=name, symbol_mapping=symbol_mapping) 

758  

759 @staticmethod 

760 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode: 

761 """Create an :class:`ObjectCode` instance from an existing library. 

762  

763 Parameters 

764 ---------- 

765 module : Union[bytes, str] 

766 Either a bytes object containing the in-memory library to load, or 

767 a file path string pointing to the on-disk library to load. 

768 name : Optional[str] 

769 A human-readable identifier representing this code object. 

770 symbol_mapping : Optional[dict] 

771 A dictionary specifying how the unmangled symbol names (as keys) 

772 should be mapped to the mangled names before trying to retrieve 

773 them (default to no mappings). 

774 """ 

775 return ObjectCode._init(module, "library", name=name, symbol_mapping=symbol_mapping) 

776  

777 # TODO: do we want to unload in a finalizer? Probably not.. 

778  

779 cdef int _lazy_load_module(self) except -1: 

780 if self._h_library: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l rhxc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

781 return 0 2fbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbt LbrhOeWew XeYePeQeMb

782 module = self._module 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

783 assert_type_str_or_bytes_like(module) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

784 cdef bytes path_bytes 

785 if isinstance(module, str): 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

786 path_bytes = module.encode() 1|

787 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 1|

788 if not self._h_library: 1|

789 HANDLE_RETURN(get_last_error()) 

790 return 0 1|

791 if isinstance(module, (bytes, bytearray)): 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

792 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

793 if not self._h_library: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

794 HANDLE_RETURN(get_last_error()) 

795 return 0 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb

796 raise_code_path_meant_to_be_unreachable() 

797 return -1 

798  

799 def get_kernel(self, name) -> Kernel: 

800 """Return the :obj:`~_module.Kernel` of a specified name from this object code. 

801  

802 Parameters 

803 ---------- 

804 name : str | bytes 

805 Name of the kernel to retrieve. 

806  

807 Returns 

808 ------- 

809 :obj:`~_module.Kernel` 

810 Newly created kernel object. 

811  

812 """ 

813 self._lazy_load_module() 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

814 supported_code_types = ("cubin", "ptx", "fatbin") 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

815 if self._code_type not in supported_code_types: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

816 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2Ne

817 try: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

818 name = self._sym_map[name] 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

819 except KeyError: 2@ [ ] ^ _ r ` d v q Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . w / : B C D E F G H I J K L M N O P Q R S T U V W x X ; Y = ? z A ~ abMb

820 if isinstance(name, str): 2@ [ ] ^ _ r ` d v q Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . w / : B C D E F G H I J K L M N O P Q R S T U V W x X ; Y = ? z A ~ abMb

821 name = name.encode() 2@ [ ] ^ _ r ` d v q Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . w / : B C D E F G H I J K L M N O P Q R S T U V W x X ; Y = ? z A ~ abMb

822  

823 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

824 if not h_kernel: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb

825 HANDLE_RETURN(get_last_error()) 2Mb

826 return Kernel._from_handle(h_kernel) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe

827  

828 @property 

829 def code(self) -> CodeTypeT: 

830 """Return the underlying code object.""" 

831 return self._module 2zfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZfshwf0f1fu vf| } xfNeyfog2fpg}f~fagbgcgdgegfggghgigjgkglgmgng3f4f5f6f7f8f9f!f#f

832  

833 @property 

834 def name(self) -> str: 

835 """Return a human-readable name of this code object.""" 

836 return self._name 2zfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZfshwf0f1f}f~fagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!f#f

837  

838 @property 

839 def code_type(self) -> str: 

840 """Return the type of the underlying code object.""" 

841 return self._code_type 2zfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZfshwf0f1fvfxfNeyf3f4f5f6f7f8f9f!f#f

842  

843 @property 

844 def symbol_mapping(self) -> dict: 

845 """Return a copy of the symbol mapping dictionary.""" 

846 return dict(self._sym_map) 2u vf| } xfNeyf2f

847  

848 @property 

849 def handle(self): 

850 """Return the underlying handle object. 

851  

852 .. caution:: 

853  

854 This handle is a Python object. To get the memory address of the underlying C 

855 handle, call ``int(ObjectCode.handle)``. 

856 """ 

857 self._lazy_load_module() 2rhOe

858 return as_py(self._h_library) 2rhOe

859  

860 def __eq__(self, other) -> bool: 

861 if not isinstance(other, ObjectCode): 2Oe$f%f'f(f)f*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_f`fRePeQe

862 return NotImplemented 2Oe$f%f'f(f)f*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_f`f

863 # Trigger lazy load for both objects to compare handles 

864 self._lazy_load_module() 2OeRePeQe

865 (<ObjectCode>other)._lazy_load_module() 2OeRePeQe

866 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2OeRePeQe

867  

868 def __hash__(self) -> int: 

869 # Trigger lazy load to get the handle 

870 self._lazy_load_module() 2We$e%e'e(e)e*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e`e{eXeYePeQe

871 return hash(as_intptr(self._h_library)) 2We$e%e'e(e)e*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e`e{eXeYePeQe

872  

873 def __repr__(self) -> str: 

874 # Trigger lazy load to get the handle 

875 self._lazy_load_module() 2t |e}eMb

876 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2t |e}eMb