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

275 statements  

« prev     ^ index     » next       coverage.py v7.14.1, created at 2026-06-13 01:38 +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 

10from os import fsencode, fspath, PathLike 

11  

12from cuda.core._device import Device 

13from cuda.core._launch_config cimport LaunchConfig 

14from cuda.core._launch_config import LaunchConfig 

15from cuda.core._stream cimport Stream, Stream_accept 

16from cuda.core._program import ObjectCodeFormatType 

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.version cimport cy_binding_version, cy_driver_version 

37from cuda.core._utils.cuda_utils import driver 

38from cuda.bindings cimport cydriver 

39  

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

41  

42  

43cdef class KernelAttributes: 

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

45  

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

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

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

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

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

51 is visible through the others. 

52 """ 

53  

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

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

56  

57 @staticmethod 

58 cdef KernelAttributes _init(KernelHandle h_kernel): 

59 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

60 self._h_kernel = h_kernel 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

61 self._device_id = -1 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

62 self._cache = {} 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

63 return self 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

64  

65 cdef KernelAttributes _view_for_device(self, int device_id): 

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

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

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

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

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

71  

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

73 if self._device_id >= 0: 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

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

75 return Device().device_id 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

76  

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

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

79 cdef tuple cache_key = (device_id, <int>attribute) 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

80 cached = self._cache.get(cache_key, cache_key) 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

81 if cached is not cache_key: 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

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

83 cdef int result 

84 with nogil: 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

85 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

86 self._cache[cache_key] = result 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

87 return result 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

88  

89 def __getitem__(self, device: Device | int) -> KernelAttributes: 

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

91  

92 Parameters 

93 ---------- 

94 device : Device or int 

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

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

97  

98 Returns 

99 ------- 

100 KernelAttributes 

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

102 with this view. 

103 """ 

104 return self._view_for_device(Device(device).device_id) 2mh,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

105  

106 @property 

107 def max_threads_per_block(self) -> int: 

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

109 This attribute is read-only.""" 

110 return self._get_cached_attribute( 2b d e ,br a A u :e

111 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e ,br a A u :e

112 ) 

113  

114 @property 

115 def shared_size_bytes(self) -> int: 

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

117 This attribute is read-only.""" 

118 return self._get_cached_attribute( 2^e

119 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2^e

120 ) 

121  

122 @property 

123 def const_size_bytes(self) -> int: 

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

125 This attribute is read-only.""" 

126 return self._get_cached_attribute( 2-e

127 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2-e

128 ) 

129  

130 @property 

131 def local_size_bytes(self) -> int: 

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

133 This attribute is read-only.""" 

134 return self._get_cached_attribute( 2.e

135 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2.e

136 ) 

137  

138 @property 

139 def num_regs(self) -> int: 

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

141 This attribute is read-only.""" 

142 return self._get_cached_attribute( 2,bjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb;e

143 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2,bjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb;e

144 ) 

145  

146 @property 

147 def ptx_version(self) -> int: 

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

149 This attribute is read-only.""" 

150 return self._get_cached_attribute( 2?e

151 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2?e

152 ) 

153  

154 @property 

155 def binary_version(self) -> int: 

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

157 This attribute is read-only.""" 

158 return self._get_cached_attribute( 2+e

159 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2+e

160 ) 

161  

162 @property 

163 def cache_mode_ca(self) -> bool: 

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

165 This attribute is read-only.""" 

166 return bool( 2(e

167 self._get_cached_attribute( 2(e

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

169 ) 

170 ) 

171  

172 @property 

173 def max_dynamic_shared_size_bytes(self) -> int: 

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

175 by this function.""" 

176 return self._get_cached_attribute( 2/e

177 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2/e

178 ) 

179  

180 @property 

181 def preferred_shared_memory_carveout(self) -> int: 

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

183 return self._get_cached_attribute( 2=e

184 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2=e

185 ) 

186  

187 @property 

188 def cluster_size_must_be_set(self) -> bool: 

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

190 This attribute is read-only.""" 

191 return bool( 2)e

192 self._get_cached_attribute( 2)e

193 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2)e

194 ) 

195 ) 

196  

197 @property 

198 def required_cluster_width(self) -> int: 

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

200 return self._get_cached_attribute( 2]e

201 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2]e

202 ) 

203  

204 @property 

205 def required_cluster_height(self) -> int: 

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

207 return self._get_cached_attribute( 2[e

208 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2[e

209 ) 

210  

211 @property 

212 def required_cluster_depth(self) -> int: 

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

214 return self._get_cached_attribute( 2@e

215 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2@e

216 ) 

217  

218 @property 

219 def non_portable_cluster_size_allowed(self) -> bool: 

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

221 return bool( 2*e

222 self._get_cached_attribute( 2*e

223 self._effective_device_id(), 2*e

224 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 

225 ) 

226 ) 

227  

228 @property 

229 def cluster_scheduling_policy_preference(self) -> int: 

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

231 return self._get_cached_attribute( 2,e

232 self._effective_device_id(), 2,e

233 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE, 

234 ) 

235  

236  

237MaxPotentialBlockSizeOccupancyResult = namedtuple( 

238 "MaxPotentialBlockSizeOccupancyResult", ("min_grid_size", "max_block_size") 

239) 

240  

241  

242cdef class KernelOccupancy: 

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

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

245 """ 

246  

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

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

249  

250 @staticmethod 

251 cdef KernelOccupancy _init(KernelHandle h_kernel): 

252 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

253 self._h_kernel = h_kernel 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

254 return self 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

255  

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

257 """Occupancy of the kernel. 

258  

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

260  

261 Parameters 

262 ---------- 

263 block_size: int 

264 Block size parameter used to launch this kernel. 

265 dynamic_shared_memory_size: int 

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

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

268  

269 Returns 

270 ------- 

271 int 

272 The maximum number of active blocks per multiprocessor. 

273  

274 Note 

275 ---- 

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

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

278 theoretical multiprocessor utilization (occupancy). 

279  

280 """ 

281 cdef int num_blocks 

282 cdef int c_block_size = block_size 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb

283 cdef size_t c_shmem_size = dynamic_shared_memory_size 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb

284 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb

285 with nogil: 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb

286 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb

287 &num_blocks, func, c_block_size, c_shmem_size 

288 )) 

289 return num_blocks 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb

290  

291 def max_potential_block_size( 

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

293 ) -> MaxPotentialBlockSizeOccupancyResult: 

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

295  

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

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

298  

299 Parameters 

300 ---------- 

301 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize] 

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

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

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

305 amount of needed dynamic shared memory which varies depending 

306 on tne block size. 

307 block_size_limit: int 

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

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

310  

311 Returns 

312 ------- 

313 :obj:`~MaxPotentialBlockSizeOccupancyResult` 

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

315 the suggested launch configuration. 

316  

317 Note 

318 ---- 

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

320 Interpreter Lock may lead to deadlocks. 

321  

322 """ 

323 cdef int min_grid_size, max_block_size 

324 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

325 cdef cydriver.CUoccupancyB2DSize callback 

326 cdef size_t c_shmem_size 

327 cdef int c_block_size_limit = block_size_limit 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

328 if isinstance(dynamic_shared_memory_needed, int): 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

329 c_shmem_size = dynamic_shared_memory_needed 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

330 with nogil: 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

331 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

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

333 )) 

334 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

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

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

337 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 

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

339 )) 

340 else: 

341 raise TypeError( 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

342 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

343 f"got {type(dynamic_shared_memory_needed)}" 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

344 ) 

345 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

346  

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

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

349  

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

351  

352 Parameters 

353 ---------- 

354 num_blocks_per_multiprocessor: int 

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

356 block_size: int 

357 Block size parameter used to launch this kernel. 

358  

359 Returns 

360 ------- 

361 int 

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

363 """ 

364 cdef size_t dynamic_smem_size 

365 cdef int c_num_blocks = num_blocks_per_multiprocessor 23f4f5f6f7f8f

366 cdef int c_block_size = block_size 23f4f5f6f7f8f

367 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 23f4f5f6f7f8f

368 with nogil: 23f4f5f6f7f8f

369 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 23f4f5f6f7f8f

370 &dynamic_smem_size, func, c_num_blocks, c_block_size 

371 )) 

372 return dynamic_smem_size 23f4f5f6f7f8f

373  

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

375 """Maximum potential cluster size. 

376  

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

378  

379 Parameters 

380 ---------- 

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

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

383 stream: :obj:`~Stream` 

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

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

386 use the default stream. 

387  

388 Returns 

389 ------- 

390 int 

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

392 """ 

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

394 cdef Stream s = Stream_accept(stream) 

395 drv_cfg.hStream = as_cu(s._h_stream) 

396 cdef int cluster_size 

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

398 with nogil: 

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

400 return cluster_size 

401  

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

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

404  

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

406  

407 Parameters 

408 ---------- 

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

410 Kernel launch configuration. 

411 stream: :obj:`~Stream` 

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

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

414 use the default stream. 

415  

416 Returns 

417 ------- 

418 int 

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

420 """ 

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

422 cdef Stream s = Stream_accept(stream) 

423 drv_cfg.hStream = as_cu(s._h_stream) 

424 cdef int num_clusters 

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

426 with nogil: 

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

428 return num_clusters 

429  

430  

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

432  

433  

434cdef class Kernel: 

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

436  

437 Kernel instances can execution when passed directly into the 

438 :func:`~launch` function. 

439  

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

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

442  

443 """ 

444  

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

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

447  

448 @staticmethod 

449 cdef Kernel _from_handle(KernelHandle h_kernel): 

450 cdef Kernel ker = Kernel.__new__(Kernel) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]

451 ker._h_kernel = h_kernel 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]

452 ker._attributes = None 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]

453 ker._occupancy = None 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]

454 return ker 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]

455  

456 @property 

457 def attributes(self) -> KernelAttributes: 

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

459 if self._attributes is None: 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

460 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

461 return self._attributes 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e

462  

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

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

465 raise NotImplementedError( 

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

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

468 ) 

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

470 raise NotImplementedError( 

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

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

473 ) 

474 cdef size_t arg_pos = 0 2c t o f g h i p j k l m ~e

475 cdef list param_info_data = [] 2c t o f g h i p j k l m ~e

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

477 cdef size_t param_offset, param_size 

478 cdef cydriver.CUresult err 

479 while True: 2c t o f g h i p j k l m ~e

480 with nogil: 2c t o f g h i p j k l m ~e

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

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

483 break 2c t o f g h i p j k l m ~e

484 if param_info: 2c f g h i j k l m ~e

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

486 arg_pos = arg_pos + 1 2c f g h i j k l m ~e

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

488 HANDLE_RETURN(err) 1t

489 return arg_pos, param_info_data 2c o f g h i p j k l m ~e

490  

491 @property 

492 def num_arguments(self) -> int: 

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

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

495 return num_args 2c o f g h i p j k l m ~e

496  

497 @property 

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

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

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

501 return param_info 2o f g h i p j k l m ~e

502  

503 @property 

504 def occupancy(self) -> KernelOccupancy: 

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

506 if self._occupancy is None: 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

507 self._occupancy = KernelOccupancy._init(self._h_kernel) 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

508 return self._occupancy 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf

509  

510 @property 

511 def handle(self) -> object: 

512 """Return the underlying kernel handle object. 

513  

514 .. caution:: 

515  

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

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

518 """ 

519 return as_py(self._h_kernel) 2b Aia dfA u c v q

520  

521 @property 

522 def _handle(self) -> object: 

523 return self.handle 

524  

525 @staticmethod 

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

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

528  

529 Parameters 

530 ---------- 

531 handle : int 

532 Kernel handle representing the address of a foreign 

533 kernel object (CUkernel). 

534 mod : :obj:`ObjectCode`, optional 

535 The ObjectCode object associated with this kernel. Provides 

536 library lifetime for foreign kernels not created by 

537 cuda.core. 

538 """ 

539  

540 if not isinstance(handle, int): 2b r a dfA nioipiqirisitiuiviwiu q

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

542  

543 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b r a dfA u q

544 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a dfA u q

545 if not h_kernel: 2b r a dfA u q

546 HANDLE_RETURN(get_last_error()) 

547  

548 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a dfA u q

549 cdef LibraryHandle h_caller_lib 

550  

551 if mod is not None: 2b r a dfA u q

552 h_caller_lib = (<ObjectCode>mod)._h_library 2a dfu

553 if h_existing_lib and h_caller_lib: 2a dfu

554 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a dfu

555 import warnings 1a

556 warnings.warn( 1a

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

558 "the library associated with this kernel.", 

559 stacklevel=2, 

560 ) 

561  

562 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a dfA u q

563 if mod is not None and not h_existing_lib: 2b r a dfA u q

564 k._keepalive = mod 

565 return k 2b r a dfA u q

566  

567 def __eq__(self, other: object) -> bool: 

568 if not isinstance(other, Kernel): 2iijiv 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 y z

569 return NotImplemented 1vBCDEFGHIJKLMNOPQRSTUVWxX

570 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2iijiv q Y y z

571  

572 def __hash__(self) -> int: 

573 return hash(as_intptr(self._h_kernel)) 1q123456789!#$%'()*+,-./:w;=@[yz

574  

575 def __repr__(self) -> str: 

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

577  

578  

579CodeTypeT = bytes | bytearray | str 

580  

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

582  

583cdef class ObjectCode: 

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

585  

586 This object provides a unified interface for different types of 

587 compiled programs that will be loaded onto the device. 

588  

589 Note 

590 ---- 

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

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

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

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

595 """ 

596  

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

598 raise RuntimeError( 2Bi

599 "ObjectCode objects cannot be instantiated directly. " 

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

601 ) 

602  

603 @classmethod 

604 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode: 

605 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

606 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

607  

608 # _h_library is assigned during _lazy_load_module 

609 self._h_library = LibraryHandle() # Empty handle 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

610  

611 self._code_type = str(code_type) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

612  

613 if isinstance(module, (str, bytes, bytearray)): 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

614 self._module = module 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )c*cdb+ceb,cogfbpggbqgVh1fWh_eXh!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

615 elif isinstance(module, PathLike): 2Z 0 YfZf

616 self._module = fspath(module) 2Z 0 YfZf

617 else: 

618 self._module = module 

619 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

620 self._name = name if name else "" 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

621  

622 return self 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi

623  

624 @staticmethod 

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

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

627  

628 def __reduce__(self) -> tuple[object, ...]: 

629 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2XfMgNg

630  

631 @staticmethod 

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

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

634  

635 Parameters 

636 ---------- 

637 module : Union[bytes, str, os.PathLike] 

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

639 a file path object (or its string representation) pointing to the 

640 on-disk cubin to load. 

641 name : Optional[str] 

642 A human-readable identifier representing this code object. 

643 symbol_mapping : Optional[dict] 

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

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

646 them (default to no mappings). 

647 """ 

648 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2Z dbeb4g5g6g7g

649  

650 @staticmethod 

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

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

653  

654 Parameters 

655 ---------- 

656 module : Union[bytes, str, os.PathLike] 

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

658 a file path object (or its string representation) pointing to the 

659 on-disk ptx file to load. 

660 name : Optional[str] 

661 A human-readable identifier representing this code object. 

662 symbol_mapping : Optional[dict] 

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

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

665 them (default to no mappings). 

666 """ 

667 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 20fZf2fbg

668  

669 @staticmethod 

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

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

672  

673 Parameters 

674 ---------- 

675 module : Union[bytes, str, os.PathLike] 

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

677 or a file path object (or its string representation) pointing to the 

678 on-disk ltoir file to load. 

679 name : Optional[str] 

680 A human-readable identifier representing this code object. 

681 symbol_mapping : Optional[dict] 

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

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

684 them (default to no mappings). 

685 """ 

686 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2Yf1f_e

687  

688 @staticmethod 

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

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

691  

692 Parameters 

693 ---------- 

694 module : Union[bytes, str, os.PathLike] 

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

696 or a file path object (or its string representation) pointing to the 

697 on-disk fatbin to load. 

698 name : Optional[str] 

699 A human-readable identifier representing this code object. 

700 symbol_mapping : Optional[dict] 

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

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

703 them (default to no mappings). 

704 """ 

705 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 20 fbgb

706  

707 @staticmethod 

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

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

710  

711 Parameters 

712 ---------- 

713 module : Union[bytes, str] 

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

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

716 name : Optional[str] 

717 A human-readable identifier representing this code object. 

718 symbol_mapping : Optional[dict] 

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

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

721 them (default to no mappings). 

722 """ 

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

724  

725 @staticmethod 

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

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

728  

729 Parameters 

730 ---------- 

731 module : Union[bytes, str] 

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

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

734 name : Optional[str] 

735 A human-readable identifier representing this code object. 

736 symbol_mapping : Optional[dict] 

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

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

739 them (default to no mappings). 

740 """ 

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

742  

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

744  

745 cdef int _lazy_load_module(self) except -1: 

746 if self._h_library: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m ki)cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

747 return 0 2FbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*bki`eafw bfcf{e|e+b

748 module = self._module 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

749 cdef bytes path_bytes 

750 if isinstance(module, str): 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

751 path_bytes = module.encode() 2Z db0 fb

752 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 2Z db0 fb

753 elif isinstance(module, (bytes, bytearray)): 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )c*c+ceb,cgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

754 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )c*c+ceb,cgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

755 elif isinstance(module, PathLike): 

756 path_bytes = fsencode(module) 

757 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 

758 else: 

759 assert_type_str_or_bytes_like(module) 

760 raise_code_path_meant_to_be_unreachable() 

761 return -1 

762 if not self._h_library: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

763 HANDLE_RETURN(get_last_error()) 

764 return 0 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]

765  

766 def get_kernel(self, name: str | bytes) -> Kernel: 

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

768  

769 Parameters 

770 ---------- 

771 name : str | bytes 

772 Name of the kernel to retrieve. 

773  

774 Returns 

775 ------- 

776 :obj:`~_module.Kernel` 

777 Newly created kernel object. 

778  

779 """ 

780 self._lazy_load_module() 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

781 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

782 if self._code_type not in supported_code_types: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

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

784 try: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

785 name = self._sym_map[name] 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

786 except KeyError: 2^ _ ` { | } ~ abbbs cbc v q 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 @ [ y z hbib+b]

787 if isinstance(name, str): 2^ _ ` { | } ~ abbbs cbc v q 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 @ [ y z hbib+b]

788 name = name.encode() 2^ _ ` { | } ~ abbbs cbc v q 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 @ [ y z hbib+b]

789  

790 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

791 if not h_kernel: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]

792 HANDLE_RETURN(get_last_error()) 2+b

793 return Kernel._from_handle(h_kernel) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]

794  

795 @property 

796 def code(self) -> CodeTypeT: 

797 """Return the underlying code object.""" 

798 return self._module 29f!fli#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}fmi0f~fagr XfZ dbeb0 ogfbpggbqgYf1f_eZf!g2f#gbg$gOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3gCicgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhng8gkhlh9g

799  

800 @property 

801 def name(self) -> str: 

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

803 return self._name 29f!fli#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}fmi0f~fagOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gcgdgegfggghgigjgkglgmgng8g

804  

805 @property 

806 def code_type(self) -> str: 

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

808 return self._code_type 29f!fli#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}fmi0f~fagXf0 fbgbYf1f_eZf2fcgdgegfggghgigjgkglgmgng9g

809  

810 @property 

811 def symbol_mapping(self) -> dict[str, str]: 

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

813 return dict(self._sym_map) 2r XfZ dbebogpgqgYf1f_eZf2fbg

814  

815 @property 

816 def handle(self) -> object: 

817 """Return the underlying handle object. 

818  

819 .. caution:: 

820  

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

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

823 """ 

824 self._lazy_load_module() 2ki`e

825 return as_py(self._h_library) 2ki`e

826  

827 def __eq__(self, other: object) -> bool: 

828 if not isinstance(other, ObjectCode): 2`ergsgtgugvgwgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgLg}e{e|e

829 return NotImplemented 2`ergsgtgugvgwgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgLg

830 # Trigger lazy load for both objects to compare handles 

831 self._lazy_load_module() 2`e}e{e|e

832 (<ObjectCode>other)._lazy_load_module() 2`e}e{e|e

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

834  

835 def __hash__(self) -> int: 

836 # Trigger lazy load to get the handle 

837 self._lazy_load_module() 2afefffgfhfifjfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfyfzfbfcf{e|e

838 return hash(as_intptr(self._h_library)) 2afefffgfhfifjfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfyfzfbfcf{e|e

839  

840 def __repr__(self) -> str: 

841 # Trigger lazy load to get the handle 

842 self._lazy_load_module() 2AfBf+b

843 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2AfBf+b