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

269 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-22 01:37 +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  

9from collections import namedtuple 

10  

11from cuda.core._device import Device 

12from cuda.core._launch_config cimport LaunchConfig 

13from cuda.core._launch_config import LaunchConfig 

14from cuda.core._stream cimport Stream, Stream_accept 

15from cuda.core._program import ObjectCodeFormatType 

16from cuda.core._resource_handles cimport ( 

17 LibraryHandle, 

18 KernelHandle, 

19 create_library_handle_from_file, 

20 create_library_handle_from_data, 

21 create_kernel_handle, 

22 create_kernel_handle_ref, 

23 get_kernel_library, 

24 get_last_error, 

25 as_cu, 

26 as_py, 

27 as_intptr, 

28) 

29from cuda.core._stream import Stream 

30from cuda.core._utils.clear_error_support import ( 

31 assert_type_str_or_bytes_like, 

32 raise_code_path_meant_to_be_unreachable, 

33) 

34from cuda.core._utils.cuda_utils cimport HANDLE_RETURN 

35from cuda.core._utils.version cimport cy_binding_version, cy_driver_version 

36from cuda.core._utils.cuda_utils import driver 

37from cuda.bindings cimport cydriver 

38  

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

40  

41  

42cdef class KernelAttributes: 

43 """Read-only view of a kernel's per-device attributes. 

44  

45 The default view returned by :attr:`Kernel.attributes` is bound to 

46 the current device, resolved at attribute-access time. Use 

47 ``kernel.attributes[device]`` to obtain a view bound to a specific 

48 device (an :class:`int` device ordinal or :class:`Device`). Per-device 

49 views share the underlying cache so a value queried through one view 

50 is visible through the others. 

51 """ 

52  

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

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

55  

56 @staticmethod 

57 cdef KernelAttributes _init(KernelHandle h_kernel): 

58 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

59 self._h_kernel = h_kernel 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

60 self._device_id = -1 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

61 self._cache = {} 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

62 return self 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

63  

64 cdef KernelAttributes _view_for_device(self, int device_id): 

65 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

66 view._h_kernel = self._h_kernel 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

67 view._device_id = device_id 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

68 view._cache = self._cache 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

69 return view 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

70  

71 cdef inline int _effective_device_id(self) except? -1: 

72 if self._device_id >= 0: 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

73 return self._device_id 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

74 return Device().device_id 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

75  

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

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

78 cdef tuple cache_key = (device_id, <int>attribute) 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

79 cached = self._cache.get(cache_key, cache_key) 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

80 if cached is not cache_key: 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

81 return cached 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

82 cdef int result 

83 with nogil: 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

84 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

85 self._cache[cache_key] = result 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

86 return result 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

87  

88 def __getitem__(self, device) -> KernelAttributes: 

89 """Return a view of these attributes bound to a specific device. 

90  

91 Parameters 

92 ---------- 

93 device : Device or int 

94 The device whose attributes to query. Accepts a :class:`Device` 

95 or a device ordinal (:class:`int`). 

96  

97 Returns 

98 ------- 

99 KernelAttributes 

100 A view bound to ``device`` that shares the underlying cache 

101 with this view. 

102 """ 

103 return self._view_for_device(Device(device).device_id) 27g.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

104  

105 @property 

106 def max_threads_per_block(self) -> int: 

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

108 This attribute is read-only.""" 

109 return self._get_cached_attribute( 2b d e .bs a C u ;e

110 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e .bs a C u ;e

111 ) 

112  

113 @property 

114 def shared_size_bytes(self) -> int: 

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

116 This attribute is read-only.""" 

117 return self._get_cached_attribute( 2_e

118 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2_e

119 ) 

120  

121 @property 

122 def const_size_bytes(self) -> int: 

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

124 This attribute is read-only.""" 

125 return self._get_cached_attribute( 2.e

126 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2.e

127 ) 

128  

129 @property 

130 def local_size_bytes(self) -> int: 

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

132 This attribute is read-only.""" 

133 return self._get_cached_attribute( 2n /e

134 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2/e

135 ) 

136  

137 @property 

138 def num_regs(self) -> int: 

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

140 This attribute is read-only.""" 

141 return self._get_cached_attribute( 2.bmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb=e

142 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2.bmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb=e

143 ) 

144  

145 @property 

146 def ptx_version(self) -> int: 

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

148 This attribute is read-only.""" 

149 return self._get_cached_attribute( 2@e

150 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2@e

151 ) 

152  

153 @property 

154 def binary_version(self) -> int: 

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

156 This attribute is read-only.""" 

157 return self._get_cached_attribute( 2,e

158 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2,e

159 ) 

160  

161 @property 

162 def cache_mode_ca(self) -> bool: 

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

164 This attribute is read-only.""" 

165 return bool( 2)e

166 self._get_cached_attribute( 2)e

167 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2)e

168 ) 

169 ) 

170  

171 @property 

172 def max_dynamic_shared_size_bytes(self) -> int: 

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

174 by this function.""" 

175 return self._get_cached_attribute( 2:e

176 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2:e

177 ) 

178  

179 @property 

180 def preferred_shared_memory_carveout(self) -> int: 

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

182 return self._get_cached_attribute( 2?e

183 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2?e

184 ) 

185  

186 @property 

187 def cluster_size_must_be_set(self) -> bool: 

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

189 This attribute is read-only.""" 

190 return bool( 2*e

191 self._get_cached_attribute( 2*e

192 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2*e

193 ) 

194 ) 

195  

196 @property 

197 def required_cluster_width(self) -> int: 

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

199 return self._get_cached_attribute( 2^e

200 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2^e

201 ) 

202  

203 @property 

204 def required_cluster_height(self) -> int: 

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

206 return self._get_cached_attribute( 2]e

207 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2]e

208 ) 

209  

210 @property 

211 def required_cluster_depth(self) -> int: 

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

213 return self._get_cached_attribute( 2[e

214 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2[e

215 ) 

216  

217 @property 

218 def non_portable_cluster_size_allowed(self) -> bool: 

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

220 return bool( 2+e

221 self._get_cached_attribute( 2+e

222 self._effective_device_id(), 2+e

223 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 

224 ) 

225 ) 

226  

227 @property 

228 def cluster_scheduling_policy_preference(self) -> int: 

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

230 return self._get_cached_attribute( 2-e

231 self._effective_device_id(), 2-e

232 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE, 

233 ) 

234  

235  

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

237  

238  

239cdef class KernelOccupancy: 

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

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

242 """ 

243  

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

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

246  

247 @staticmethod 

248 cdef KernelOccupancy _init(KernelHandle h_kernel): 

249 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

250 self._h_kernel = h_kernel 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

251 return self 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

252  

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

254 """Occupancy of the kernel. 

255  

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

257  

258 Parameters 

259 ---------- 

260 block_size: int 

261 Block size parameter used to launch this kernel. 

262 dynamic_shared_memory_size: int 

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

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

265  

266 Returns 

267 ------- 

268 int 

269 The maximum number of active blocks per multiprocessor. 

270  

271 Note 

272 ---- 

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

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

275 theoretical multiprocessor utilization (occupancy). 

276  

277 """ 

278 cdef int num_blocks 

279 cdef int c_block_size = block_size 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb

280 cdef size_t c_shmem_size = dynamic_shared_memory_size 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb

281 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb

282 with nogil: 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb

283 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb

284 &num_blocks, func, c_block_size, c_shmem_size 

285 )) 

286 return num_blocks 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb

287  

288 def max_potential_block_size( 

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

290 ) -> MaxPotentialBlockSizeOccupancyResult: 

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

292  

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

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

295  

296 Parameters 

297 ---------- 

298 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize] 

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

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

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

302 amount of needed dynamic shared memory which varies depending 

303 on tne block size. 

304 block_size_limit: int 

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

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

307  

308 Returns 

309 ------- 

310 :obj:`~MaxPotentialBlockSizeOccupancyResult` 

311 An object with `min_grid_size` and `max_block_size` attributes encoding 

312 the suggested launch configuration. 

313  

314 Note 

315 ---- 

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

317 Interpreter Lock may lead to deadlocks. 

318  

319 """ 

320 cdef int min_grid_size, max_block_size 

321 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

322 cdef cydriver.CUoccupancyB2DSize callback 

323 cdef size_t c_shmem_size 

324 cdef int c_block_size_limit = block_size_limit 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

325 if isinstance(dynamic_shared_memory_needed, int): 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

326 c_shmem_size = dynamic_shared_memory_needed 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

327 with nogil: 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

328 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

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

330 )) 

331 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

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

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

334 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 

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

336 )) 

337 else: 

338 raise TypeError( 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

339 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

340 f"got {type(dynamic_shared_memory_needed)}" 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

341 ) 

342 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

343  

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

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

346  

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

348  

349 Parameters 

350 ---------- 

351 num_blocks_per_multiprocessor: int 

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

353 block_size: int 

354 Block size parameter used to launch this kernel. 

355  

356 Returns 

357 ------- 

358 int 

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

360 """ 

361 cdef size_t dynamic_smem_size 

362 cdef int c_num_blocks = num_blocks_per_multiprocessor 20f1f2f3f4f5f

363 cdef int c_block_size = block_size 20f1f2f3f4f5f

364 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 20f1f2f3f4f5f

365 with nogil: 20f1f2f3f4f5f

366 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 20f1f2f3f4f5f

367 &dynamic_smem_size, func, c_num_blocks, c_block_size 

368 )) 

369 return dynamic_smem_size 20f1f2f3f4f5f

370  

371 def max_potential_cluster_size(self, config: LaunchConfig, *, stream: Stream) -> int: 

372 """Maximum potential cluster size. 

373  

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

375  

376 Parameters 

377 ---------- 

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

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

380 stream: :obj:`~Stream` 

381 Keyword-only. The stream on which this kernel is to be launched. 

382 Must be passed explicitly; pass ``device.default_stream`` to 

383 use the default stream. 

384  

385 Returns 

386 ------- 

387 int 

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

389 """ 

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

391 cdef Stream s = Stream_accept(stream) 

392 drv_cfg.hStream = as_cu(s._h_stream) 

393 cdef int cluster_size 

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

395 with nogil: 

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

397 return cluster_size 

398  

399 def max_active_clusters(self, config: LaunchConfig, *, stream: Stream) -> int: 

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

401  

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

403  

404 Parameters 

405 ---------- 

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

407 Kernel launch configuration. 

408 stream: :obj:`~Stream` 

409 Keyword-only. The stream on which this kernel is to be launched. 

410 Must be passed explicitly; pass ``device.default_stream`` to 

411 use the default stream. 

412  

413 Returns 

414 ------- 

415 int 

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

417 """ 

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

419 cdef Stream s = Stream_accept(stream) 

420 drv_cfg.hStream = as_cu(s._h_stream) 

421 cdef int num_clusters 

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

423 with nogil: 

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

425 return num_clusters 

426  

427  

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

429  

430  

431cdef class Kernel: 

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

433  

434 Kernel instances can execution when passed directly into the 

435 :func:`~launch` function. 

436  

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

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

439  

440 """ 

441  

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

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

444  

445 @staticmethod 

446 cdef Kernel _from_handle(KernelHandle h_kernel): 

447 cdef Kernel ker = Kernel.__new__(Kernel) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

448 ker._h_kernel = h_kernel 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

449 ker._attributes = None 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

450 ker._occupancy = None 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

451 return ker 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

452  

453 @property 

454 def attributes(self) -> KernelAttributes: 

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

456 if self._attributes is None: 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

457 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

458 return self._attributes 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e

459  

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

461 if cy_driver_version() < (12, 4, 0): 2c t o f g h i p j k l m af

462 raise NotImplementedError( 

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

464 f"Using driver version {'.'.join(map(str, cy_driver_version()))}" 

465 ) 

466 if cy_binding_version() < (12, 4, 0): 2c t o f g h i p j k l m af

467 raise NotImplementedError( 

468 "cuda.bindings 12.4 or newer is required for this function. " 

469 f"Using binding version {'.'.join(map(str, cy_binding_version()))}" 

470 ) 

471 cdef size_t arg_pos = 0 2c t o f g h i p j k l m af

472 cdef list param_info_data = [] 2c t o f g h i p j k l m af

473 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2c t o f g h i p j k l m af

474 cdef size_t param_offset, param_size 

475 cdef cydriver.CUresult err 

476 while True: 2c t o f g h i p j k l m af

477 with nogil: 2c t o f g h i p j k l m af

478 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, &param_offset, &param_size) 2c t o f g h i p j k l m af

479 if err != cydriver.CUDA_SUCCESS: 2c t o f g h i p j k l m af

480 break 2c t o f g h i p j k l m af

481 if param_info: 2c f g h i j k l m af

482 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2f g h i j k l m af

483 arg_pos = arg_pos + 1 2c f g h i j k l m af

484 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2c t o f g h i p j k l m af

485 HANDLE_RETURN(err) 1t

486 return arg_pos, param_info_data 2c o f g h i p j k l m af

487  

488 @property 

489 def num_arguments(self) -> int: 

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

491 num_args, _ = self._get_arguments_info() 2c t o f g h i p j k l m af

492 return num_args 2c o f g h i p j k l m af

493  

494 @property 

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

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

497 _, param_info = self._get_arguments_info(param_info=True) 2o f g h i p j k l m af

498 return param_info 2o f g h i p j k l m af

499  

500 @property 

501 def occupancy(self) -> KernelOccupancy: 

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

503 if self._occupancy is None: 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

504 self._occupancy = KernelOccupancy._init(self._h_kernel) 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

505 return self._occupancy 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf

506  

507 @property 

508 def handle(self): 

509 """Return the underlying kernel handle object. 

510  

511 .. caution:: 

512  

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

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

515 """ 

516 return as_py(self._h_kernel) 2b v tia efC u c w q

517  

518 @property 

519 def _handle(self): 

520 return self.handle 

521  

522 @staticmethod 

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

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

525  

526 Parameters 

527 ---------- 

528 handle : int 

529 Kernel handle representing the address of a foreign 

530 kernel object (CUkernel). 

531 mod : :obj:`ObjectCode`, optional 

532 The ObjectCode object associated with this kernel. Provides 

533 library lifetime for foreign kernels not created by 

534 cuda.core. 

535 """ 

536  

537 if not isinstance(handle, int): 2b s a efC gihiiijikiliminioipiu q

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

539  

540 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b s a efC u q

541 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b s a efC u q

542 if not h_kernel: 2b s a efC u q

543 HANDLE_RETURN(get_last_error()) 

544  

545 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b s a efC u q

546 cdef LibraryHandle h_caller_lib 

547  

548 if mod is not None: 2b s a efC u q

549 h_caller_lib = (<ObjectCode>mod)._h_library 2a efu

550 if h_existing_lib and h_caller_lib: 2a efu

551 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a efu

552 import warnings 1a

553 warnings.warn( 1a

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

555 "the library associated with this kernel.", 

556 stacklevel=2, 

557 ) 

558  

559 cdef Kernel k = Kernel._from_handle(h_kernel) 2b s a efC u q

560 if mod is not None and not h_existing_lib: 2b s a efC u q

561 k._keepalive = mod 

562 return k 2b s a efC u q

563  

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

565 if not isinstance(other, Kernel): 2biciw q D E F G H I J K L M N O P Q R S T U V W X Y y Z 0 z A

566 return NotImplemented 1wDEFGHIJKLMNOPQRSTUVWXYyZ

567 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2biciw q 0 z A

568  

569 def __hash__(self) -> int: 

570 return hash(as_intptr(self._h_kernel)) 1q23456789!#$%'()*+,-./:;x=?[]zA

571  

572 def __repr__(self) -> str: 

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

574  

575  

576CodeTypeT = bytes | bytearray | str 

577  

578cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values()) 

579  

580cdef class ObjectCode: 

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

582  

583 This object provides a unified interface for different types of 

584 compiled programs that will be loaded onto the device. 

585  

586 Note 

587 ---- 

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

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

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

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

592 """ 

593  

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

595 raise RuntimeError( 2ui

596 "ObjectCode objects cannot be instantiated directly. " 

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

598 ) 

599  

600 @classmethod 

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

602 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

603 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

604  

605 # _h_library is assigned during _lazy_load_module 

606 self._h_library = LibraryHandle() # Empty handle 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

607  

608 self._code_type = str(code_type) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

609 self._module = module 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

610 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

611 self._name = name if name else "" 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

612  

613 return self 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai

614  

615 @staticmethod 

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

617 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2ZfJgKg

618  

619 def __reduce__(self): 

620 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2ZfJgKg

621  

622 @staticmethod 

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

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

625  

626 Parameters 

627 ---------- 

628 module : Union[bytes, str] 

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

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

631 name : Optional[str] 

632 A human-readable identifier representing this code object. 

633 symbol_mapping : Optional[dict] 

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

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

636 them (default to no mappings). 

637 """ 

638 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2ebfb1g2g3g4g

639  

640 @staticmethod 

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

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

643  

644 Parameters 

645 ---------- 

646 module : Union[bytes, str] 

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

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

649 name : Optional[str] 

650 A human-readable identifier representing this code object. 

651 symbol_mapping : Optional[dict] 

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

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

654 them (default to no mappings). 

655 """ 

656 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 26f1 ib

657  

658 @staticmethod 

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

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

661  

662 Parameters 

663 ---------- 

664 module : Union[bytes, str] 

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

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

667 name : Optional[str] 

668 A human-readable identifier representing this code object. 

669 symbol_mapping : Optional[dict] 

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

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

672 them (default to no mappings). 

673 """ 

674 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 27f`e

675  

676 @staticmethod 

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

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

679  

680 Parameters 

681 ---------- 

682 module : Union[bytes, str] 

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

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

685 name : Optional[str] 

686 A human-readable identifier representing this code object. 

687 symbol_mapping : Optional[dict] 

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

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

690 them (default to no mappings). 

691 """ 

692 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 2gbhb

693  

694 @staticmethod 

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

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

697  

698 Parameters 

699 ---------- 

700 module : Union[bytes, str] 

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

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

703 name : Optional[str] 

704 A human-readable identifier representing this code object. 

705 symbol_mapping : Optional[dict] 

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

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

708 them (default to no mappings). 

709 """ 

710 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 

711  

712 @staticmethod 

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

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

715  

716 Parameters 

717 ---------- 

718 module : Union[bytes, str] 

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

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

721 name : Optional[str] 

722 A human-readable identifier representing this code object. 

723 symbol_mapping : Optional[dict] 

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

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

726 them (default to no mappings). 

727 """ 

728 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 

729  

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

731  

732 cdef int _lazy_load_module(self) except -1: 

733 if self._h_library: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m di+ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

734 return 0 2IbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-bv di{ebfx cfdf|e}e

735 module = self._module 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

736 assert_type_str_or_bytes_like(module) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

737 cdef bytes path_bytes 

738 if isinstance(module, str): 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

739 path_bytes = module.encode() 2ebgb1

740 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 2ebgb1

741 if not self._h_library: 2ebgb1

742 HANDLE_RETURN(get_last_error()) 

743 return 0 2ebgb1

744 if isinstance(module, (bytes, bytearray)): 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

745 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

746 if not self._h_library: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

747 HANDLE_RETURN(get_last_error()) 

748 return 0 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^

749 raise_code_path_meant_to_be_unreachable() 

750 return -1 

751  

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

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

754  

755 Parameters 

756 ---------- 

757 name : str | bytes 

758 Name of the kernel to retrieve. 

759  

760 Returns 

761 ------- 

762 :obj:`~_module.Kernel` 

763 Newly created kernel object. 

764  

765 """ 

766 self._lazy_load_module() 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

767 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

768 if self._code_type not in supported_code_types: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

769 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2`e

770 try: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

771 name = self._sym_map[name] 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

772 except KeyError: 2_ ` { | } ~ abbbcbr dbv c w q 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; x = ? D E F G H I J K L M N O P Q R S T U V W X Y y Z @ 0 [ ] z A jbkblbB ^

773 if isinstance(name, str): 2_ ` { | } ~ abbbcbr dbv c w q 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; x = ? D E F G H I J K L M N O P Q R S T U V W X Y y Z @ 0 [ ] z A jbkblbB ^

774 name = name.encode() 2_ ` { | } ~ abbbcbr dbv c w q 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; x = ? D E F G H I J K L M N O P Q R S T U V W X Y y Z @ 0 [ ] z A jbkblbB ^

775  

776 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

777 if not h_kernel: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

778 HANDLE_RETURN(get_last_error()) 

779 return Kernel._from_handle(h_kernel) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^

780  

781 @property 

782 def code(self) -> CodeTypeT: 

783 """Return the underlying code object.""" 

784 return self._module 28f9fei!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|ffi6f}f~fs Zfebfbgbmghbng7f`e1 8gib9gagLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0gB vibgcgdgegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfhlg5gghhh6g

785  

786 @property 

787 def name(self) -> str: 

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

789 return self._name 28f9fei!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|ffi6f}f~fagLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdgegfggghgigjgkglg5g

790  

791 @property 

792 def code_type(self) -> str: 

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

794 return self._code_type 28f9fei!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|ffi6f}f~fZfgbhb7f`e1 agB bgcgdgegfggghgigjgkglg6g

795  

796 @property 

797 def symbol_mapping(self) -> dict: 

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

799 return dict(self._sym_map) 2s Zfebfbmgng7f`e1 ib

800  

801 @property 

802 def handle(self): 

803 """Return the underlying handle object. 

804  

805 .. caution:: 

806  

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

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

809 """ 

810 self._lazy_load_module() 2v di{e

811 return as_py(self._h_library) 2v di{e

812  

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

814 if not isinstance(other, ObjectCode): 2{eogpgqgrgsgtgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgIg~e|e}e

815 return NotImplemented 2{eogpgqgrgsgtgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgIg

816 # Trigger lazy load for both objects to compare handles 

817 self._lazy_load_module() 2{e~e|e}e

818 (<ObjectCode>other)._lazy_load_module() 2{e~e|e}e

819 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2{e~e|e}e

820  

821 def __hash__(self) -> int: 

822 # Trigger lazy load to get the handle 

823 self._lazy_load_module() 2bfffgfhfifjfkfEblfmfnfofpfqfrfsftfx FbufvfwfxfyfzfAfcfdf|e}e

824 return hash(as_intptr(self._h_library)) 2bfffgfhfifjfkfEblfmfnfofpfqfrfsftfx FbufvfwfxfyfzfAfcfdf|e}e

825  

826 def __repr__(self) -> str: 

827 # Trigger lazy load to get the handle 

828 self._lazy_load_module() 2BfCfDf

829 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2BfCfDf