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

277 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-07-19 01:12 +0000

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

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5from __future__ import annotations 

6  

7cimport cython 

8from libc.stddef cimport size_t 

9  

10from collections import namedtuple 

11from os import fsencode, fspath, PathLike 

12  

13from cuda.core._device import Device 

14from cuda.core._launch_config cimport LaunchConfig 

15from cuda.core._launch_config import LaunchConfig 

16from cuda.core._stream cimport Stream, Stream_accept 

17from cuda.core._program import ObjectCodeFormatType 

18from cuda.core._resource_handles cimport ( 

19 LibraryHandle, 

20 KernelHandle, 

21 create_library_handle_from_file, 

22 create_library_handle_from_data, 

23 create_kernel_handle, 

24 create_kernel_handle_ref, 

25 get_kernel_library, 

26 get_last_error, 

27 as_cu, 

28 as_py, 

29 as_intptr, 

30) 

31from cuda.core._stream import Stream 

32from cuda.core._utils.clear_error_support import ( 

33 assert_type_str_or_bytes_like, 

34 raise_code_path_meant_to_be_unreachable, 

35) 

36from cuda.core._utils.cuda_utils cimport HANDLE_RETURN 

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

38from cuda.core._utils.cuda_utils import driver 

39from cuda.bindings cimport cydriver 

40  

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

42  

43  

44cdef class KernelAttributes: 

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

46  

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

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

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

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

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

52 is visible through the others. 

53 """ 

54  

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

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

57  

58 @staticmethod 

59 cdef KernelAttributes _init(KernelHandle h_kernel): 

60 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

61 self._h_kernel = h_kernel 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

62 self._device_id = -1 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

63 self._cache = {} 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

64 return self 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

65  

66 cdef KernelAttributes _view_for_device(self, int device_id): 

67 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

68 view._h_kernel = self._h_kernel 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

69 view._device_id = device_id 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

70 view._cache = self._cache 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

71 return view 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

72  

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

74 if self._device_id >= 0: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

75 return self._device_id 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

76 return Device().device_id 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

77  

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

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

80 cdef tuple cache_key = (device_id, <int>attribute) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

81 cached = self._cache.get(cache_key, cache_key) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

82 if cached is not cache_key: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

83 return cached 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

84 cdef int result 

85 with nogil: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

86 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

87 self._cache[cache_key] = result # setdefault not needed for ints 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

88 return result 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

89  

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

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

92  

93 Parameters 

94 ---------- 

95 device : Device or int 

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

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

98  

99 Returns 

100 ------- 

101 KernelAttributes 

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

103 with this view. 

104 """ 

105 return self._view_for_device(Device(device).device_id) 2Fh=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif

106  

107 @property 

108 def max_threads_per_block(self) -> int: 

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

110 This attribute is read-only.""" 

111 return self._get_cached_attribute( 2b d e =br a C u bf

112 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e =br a C u bf

113 ) 

114  

115 @property 

116 def shared_size_bytes(self) -> int: 

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

118 This attribute is read-only.""" 

119 return self._get_cached_attribute( 2if

120 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2if

121 ) 

122  

123 @property 

124 def const_size_bytes(self) -> int: 

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

126 This attribute is read-only.""" 

127 return self._get_cached_attribute( 2}e

128 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2}e

129 ) 

130  

131 @property 

132 def local_size_bytes(self) -> int: 

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

134 This attribute is read-only.""" 

135 return self._get_cached_attribute( 2~e

136 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2~e

137 ) 

138  

139 @property 

140 def num_regs(self) -> int: 

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

142 This attribute is read-only.""" 

143 return self._get_cached_attribute( 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf

144 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf

145 ) 

146  

147 @property 

148 def ptx_version(self) -> int: 

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

150 This attribute is read-only.""" 

151 return self._get_cached_attribute( 2ef

152 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2ef

153 ) 

154  

155 @property 

156 def binary_version(self) -> int: 

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

158 This attribute is read-only.""" 

159 return self._get_cached_attribute( 2{e

160 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2{e

161 ) 

162  

163 @property 

164 def cache_mode_ca(self) -> bool: 

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

166 This attribute is read-only.""" 

167 return bool( 2^e

168 self._get_cached_attribute( 2^e

169 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2^e

170 ) 

171 ) 

172  

173 @property 

174 def max_dynamic_shared_size_bytes(self) -> int: 

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

176 by this function.""" 

177 return self._get_cached_attribute( 2af

178 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2af

179 ) 

180  

181 @property 

182 def preferred_shared_memory_carveout(self) -> int: 

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

184 return self._get_cached_attribute( 2df

185 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2df

186 ) 

187  

188 @property 

189 def cluster_size_must_be_set(self) -> bool: 

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

191 This attribute is read-only.""" 

192 return bool( 2_e

193 self._get_cached_attribute( 2_e

194 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2_e

195 ) 

196 ) 

197  

198 @property 

199 def required_cluster_width(self) -> int: 

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

201 return self._get_cached_attribute( 2hf

202 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2hf

203 ) 

204  

205 @property 

206 def required_cluster_height(self) -> int: 

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

208 return self._get_cached_attribute( 2gf

209 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2gf

210 ) 

211  

212 @property 

213 def required_cluster_depth(self) -> int: 

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

215 return self._get_cached_attribute( 2ff

216 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2ff

217 ) 

218  

219 @property 

220 def non_portable_cluster_size_allowed(self) -> bool: 

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

222 return bool( 2`e

223 self._get_cached_attribute( 2`e

224 self._effective_device_id(), 2`e

225 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 

226 ) 

227 ) 

228  

229 @property 

230 def cluster_scheduling_policy_preference(self) -> int: 

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

232 return self._get_cached_attribute( 2|e

233 self._effective_device_id(), 2|e

234 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE, 

235 ) 

236  

237  

238MaxPotentialBlockSizeOccupancyResult = namedtuple( 

239 "MaxPotentialBlockSizeOccupancyResult", ("min_grid_size", "max_block_size") 

240) 

241  

242  

243cdef class KernelOccupancy: 

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

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

246 """ 

247  

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

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

250  

251 @staticmethod 

252 cdef KernelOccupancy _init(KernelHandle h_kernel): 

253 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

254 self._h_kernel = h_kernel 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

255 return self 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

256  

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

258 """Occupancy of the kernel. 

259  

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

261  

262 Parameters 

263 ---------- 

264 block_size: int 

265 Block size parameter used to launch this kernel. 

266 dynamic_shared_memory_size: int 

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

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

269  

270 Returns 

271 ------- 

272 int 

273 The maximum number of active blocks per multiprocessor. 

274  

275 Note 

276 ---- 

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

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

279 theoretical multiprocessor utilization (occupancy). 

280  

281 """ 

282 cdef int num_blocks 

283 cdef int c_block_size = block_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

284 cdef size_t c_shmem_size = dynamic_shared_memory_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

285 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

286 with nogil: 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

287 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

288 &num_blocks, func, c_block_size, c_shmem_size 

289 )) 

290 return num_blocks 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

291  

292 def max_potential_block_size( 

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

294 ) -> MaxPotentialBlockSizeOccupancyResult: 

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

296  

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

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

299  

300 Parameters 

301 ---------- 

302 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize] 

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

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

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

306 amount of needed dynamic shared memory which varies depending 

307 on tne block size. 

308 block_size_limit: int 

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

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

311  

312 Returns 

313 ------- 

314 :obj:`~MaxPotentialBlockSizeOccupancyResult` 

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

316 the suggested launch configuration. 

317  

318 Note 

319 ---- 

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

321 Interpreter Lock may lead to deadlocks. 

322  

323 """ 

324 cdef int min_grid_size, max_block_size 

325 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

326 cdef cydriver.CUoccupancyB2DSize callback 

327 cdef size_t c_shmem_size 

328 cdef int c_block_size_limit = block_size_limit 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

329 if isinstance(dynamic_shared_memory_needed, int): 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

330 c_shmem_size = dynamic_shared_memory_needed 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

331 with nogil: 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

332 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

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

334 )) 

335 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

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

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

338 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 

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

340 )) 

341 else: 

342 raise TypeError( 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

343 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

344 f"got {type(dynamic_shared_memory_needed)}" 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

345 ) 

346 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

347  

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

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

350  

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

352  

353 Parameters 

354 ---------- 

355 num_blocks_per_multiprocessor: int 

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

357 block_size: int 

358 Block size parameter used to launch this kernel. 

359  

360 Returns 

361 ------- 

362 int 

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

364 """ 

365 cdef size_t dynamic_smem_size 

366 cdef int c_num_blocks = num_blocks_per_multiprocessor 2-f.f/f:f;f=f

367 cdef int c_block_size = block_size 2-f.f/f:f;f=f

368 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2-f.f/f:f;f=f

369 with nogil: 2-f.f/f:f;f=f

370 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2-f.f/f:f;f=f

371 &dynamic_smem_size, func, c_num_blocks, c_block_size 

372 )) 

373 return dynamic_smem_size 2-f.f/f:f;f=f

374  

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

376 """Maximum potential cluster size. 

377  

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

379  

380 Parameters 

381 ---------- 

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

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

384 stream: :obj:`~Stream` 

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

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

387 use the default stream. 

388  

389 Returns 

390 ------- 

391 int 

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

393 """ 

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

395 cdef Stream s = Stream_accept(stream) 

396 drv_cfg.hStream = as_cu(s._h_stream) 

397 cdef int cluster_size 

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

399 with nogil: 

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

401 return cluster_size 

402  

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

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

405  

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

407  

408 Parameters 

409 ---------- 

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

411 Kernel launch configuration. 

412 stream: :obj:`~Stream` 

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

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

415 use the default stream. 

416  

417 Returns 

418 ------- 

419 int 

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

421 """ 

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

423 cdef Stream s = Stream_accept(stream) 

424 drv_cfg.hStream = as_cu(s._h_stream) 

425 cdef int num_clusters 

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

427 with nogil: 

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

429 return num_clusters 

430  

431  

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

433  

434  

435cdef class Kernel: 

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

437  

438 Kernel instances can execution when passed directly into the 

439 :func:`~launch` function. 

440  

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

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

443  

444 """ 

445  

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

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

448  

449 @staticmethod 

450 cdef Kernel _from_handle(KernelHandle h_kernel): 

451 cdef Kernel ker = Kernel.__new__(Kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_

452 ker._h_kernel = h_kernel 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_

453 ker._attributes = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_

454 ker._occupancy = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_

455 return ker 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_

456  

457 @property 

458 @cython.critical_section 

459 def attributes(self) -> KernelAttributes: 

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

461 if self._attributes is None: 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

462 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

463 return self._attributes 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif

464  

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

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

467 raise NotImplementedError( 

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

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

470 ) 

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

472 raise NotImplementedError( 

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

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

475 ) 

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

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

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

479 cdef size_t param_offset, param_size 

480 cdef cydriver.CUresult err 

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

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

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

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

485 break 2c t o f g h i p j k l m qf

486 if param_info: 2c f g h i j k l m qf

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

488 arg_pos = arg_pos + 1 2c f g h i j k l m qf

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

490 HANDLE_RETURN(err) 1t

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

492  

493 @property 

494 def num_arguments(self) -> int: 

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

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

497 return num_args 2c o f g h i p j k l m qf

498  

499 @property 

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

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

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

503 return param_info 2o f g h i p j k l m qf

504  

505 @property 

506 @cython.critical_section 

507 def occupancy(self) -> KernelOccupancy: 

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

509 if self._occupancy is None: 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

510 self._occupancy = KernelOccupancy._init(self._h_kernel) 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

511 return self._occupancy 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f

512  

513 @property 

514 def handle(self) -> object: 

515 """Return the underlying kernel handle object. 

516  

517 .. caution:: 

518  

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

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

521 """ 

522 return as_py(self._h_kernel) 2b Tia ufC u c x q

523  

524 @property 

525 def _handle(self) -> object: 

526 return self.handle 

527  

528 @staticmethod 

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

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

531  

532 Parameters 

533 ---------- 

534 handle : int 

535 Kernel handle representing the address of a foreign 

536 kernel object (CUkernel). 

537 mod : :obj:`ObjectCode`, optional 

538 The ObjectCode object associated with this kernel. Provides 

539 library lifetime for foreign kernels not created by 

540 cuda.core. 

541 """ 

542  

543 if not isinstance(handle, int): 2b r a ufC GiHiIiJiKiLiMiNiOiPiu q

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

545  

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

547 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a ufC u q

548 if not h_kernel: 2b r a ufC u q

549 HANDLE_RETURN(get_last_error()) 

550  

551 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a ufC u q

552 cdef LibraryHandle h_caller_lib 

553  

554 if mod is not None: 2b r a ufC u q

555 h_caller_lib = (<ObjectCode>mod)._h_library 2a ufu

556 if h_existing_lib and h_caller_lib: 2a ufu

557 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a ufu

558 import warnings 1a

559 warnings.warn( 1a

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

561 "the library associated with this kernel.", 

562 stacklevel=2, 

563 ) 

564  

565 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a ufC u q

566 if mod is not None and not h_existing_lib: 2b r a ufC u q

567 k._keepalive = mod 

568 return k 2b r a ufC u q

569  

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

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

572 return NotImplemented 1xDEFGHIJKLMNOPQRSTUVWXYzZ

573 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2BiCix q 0 A B

574  

575 def __hash__(self) -> int: 

576 return hash(as_intptr(self._h_kernel)) 1q3456789!#$%'()*+,-./:;=y?@]^AB

577  

578 def __repr__(self) -> str: 

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

580  

581  

582CodeTypeT = bytes | bytearray | str 

583  

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

585  

586cdef class ObjectCode: 

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

588  

589 This object provides a unified interface for different types of 

590 compiled programs that will be loaded onto the device. 

591  

592 Note 

593 ---- 

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

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

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

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

598 """ 

599  

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

601 raise RuntimeError( 2Ui

602 "ObjectCode objects cannot be instantiated directly. " 

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

604 ) 

605  

606 @classmethod 

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

608 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

609 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

610  

611 # _h_library is assigned during _lazy_load_module 

612 self._h_library = LibraryHandle() # Empty handle 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

613  

614 self._code_type = str(code_type) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

615  

616 if isinstance(module, (str, bytes, bytearray)): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

617 self._module = module 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c`cfb{cgb|cHghbIgibJg'h+f(hjf)h]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

618 elif isinstance(module, PathLike): 21 2 (f)f

619 self._module = fspath(module) 21 2 (f)f

620 else: 

621 self._module = module 

622 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

623 self._name = name if name else "" 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

624  

625 return self 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi

626  

627 @staticmethod 

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

629 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2'f5g6g

630  

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

632 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2'f5g6g

633  

634 @staticmethod 

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

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

637  

638 Parameters 

639 ---------- 

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

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

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

643 on-disk cubin to load. 

644 name : Optional[str] 

645 A human-readable identifier representing this code object. 

646 symbol_mapping : Optional[dict] 

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

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

649 them (default to no mappings). 

650 """ 

651 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 21 fbgb:g;g=g?g

652  

653 @staticmethod 

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

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

656  

657 Parameters 

658 ---------- 

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

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

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

662 on-disk ptx file to load. 

663 name : Optional[str] 

664 A human-readable identifier representing this code object. 

665 symbol_mapping : Optional[dict] 

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

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

668 them (default to no mappings). 

669 """ 

670 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2*f)f,fsg

671  

672 @staticmethod 

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

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

675  

676 Parameters 

677 ---------- 

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

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

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

681 on-disk ltoir file to load. 

682 name : Optional[str] 

683 A human-readable identifier representing this code object. 

684 symbol_mapping : Optional[dict] 

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

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

687 them (default to no mappings). 

688 """ 

689 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2(f+fjf

690  

691 @staticmethod 

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

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

694  

695 Parameters 

696 ---------- 

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

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

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

700 on-disk fatbin to load. 

701 name : Optional[str] 

702 A human-readable identifier representing this code object. 

703 symbol_mapping : Optional[dict] 

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

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

706 them (default to no mappings). 

707 """ 

708 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 22 hbib

709  

710 @staticmethod 

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

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

713  

714 Parameters 

715 ---------- 

716 module : Union[bytes, str] 

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

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

719 name : Optional[str] 

720 A human-readable identifier representing this code object. 

721 symbol_mapping : Optional[dict] 

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

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

724 them (default to no mappings). 

725 """ 

726 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2mfugw

727  

728 @staticmethod 

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

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

731  

732 Parameters 

733 ---------- 

734 module : Union[bytes, str] 

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

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

737 name : Optional[str] 

738 A human-readable identifier representing this code object. 

739 symbol_mapping : Optional[dict] 

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

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

742 them (default to no mappings). 

743 """ 

744 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2lftgv

745  

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

747  

748 @cython.critical_section 

749 cdef int _lazy_load_module(self) except -1: 

750 if self._h_library: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m Di_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

751 return 0 2HbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bDikfrfy sftfnfof;b

752 module = self._module 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

753 cdef bytes path_bytes 

754 if isinstance(module, str): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

755 path_bytes = module.encode() 21 fb2 hb

756 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 21 fb2 hb

757 elif isinstance(module, (bytes, bytearray)): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

758 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

759 elif isinstance(module, PathLike): 

760 path_bytes = fsencode(module) 

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

762 else: 

763 assert_type_str_or_bytes_like(module) 

764 raise_code_path_meant_to_be_unreachable() 

765 return -1 

766 if not self._h_library: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

767 HANDLE_RETURN(get_last_error()) 

768 return 0 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_

769  

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

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

772  

773 Parameters 

774 ---------- 

775 name : str | bytes 

776 Name of the kernel to retrieve. 

777  

778 Returns 

779 ------- 

780 :obj:`~_module.Kernel` 

781 Newly created kernel object. 

782  

783 """ 

784 self._lazy_load_module() 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

785 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

786 if self._code_type not in supported_code_types: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

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

788 try: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

789 name = self._sym_map[name] 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

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

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

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

793  

794 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

795 if not h_kernel: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_

796 HANDLE_RETURN(get_last_error()) 2;b

797 return Kernel._from_handle(h_kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_

798  

799 @property 

800 def code(self) -> CodeTypeT: 

801 """Return the underlying code object.""" 

802 return self._module 2?f@fEi[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgFi*fqgrgr 'f1 fbgb2 HghbIgibJg(f+fjf)f]g,f^gsg_glfmftgugv w 7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/gVivgwgxgygzgAgBgCgDgEgFg_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChGg@gDhEh[g

803  

804 @property 

805 def name(self) -> str: 

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

807 return self._name 2?f@fEi[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgFi*fqgrgv w 7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgGg@g

808  

809 @property 

810 def code_type(self) -> str: 

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

812 return self._code_type 2?f@fEi[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgFi*fqgrg'f2 hbib(f+fjf)f,flfmftgugv w vgwgxgygzgAgBgCgDgEgFgGg[g

813  

814 @property 

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

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

817 return dict(self._sym_map) 2r 'f1 fbgbHgIgJg(f+fjf)f,fsg

818  

819 @property 

820 def handle(self) -> object: 

821 """Return the underlying handle object. 

822  

823 .. caution:: 

824  

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

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

827 """ 

828 self._lazy_load_module() 2Dikf

829 return as_py(self._h_library) 2Dikf

830  

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

832 if not isinstance(other, ObjectCode): 2kfKgLgMgNgOgPgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g4gpfnfof

833 return NotImplemented 2kfKgLgMgNgOgPgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g4g

834 # Trigger lazy load for both objects to compare handles 

835 self._lazy_load_module() 2kfpfnfof

836 (<ObjectCode>other)._lazy_load_module() 2kfpfnfof

837 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2kfpfnfof

838  

839 def __hash__(self) -> int: 

840 # Trigger lazy load to get the handle 

841 self._lazy_load_module() 2rfvfwfxfyfzfAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfPfQfsftfnfof

842 return hash(as_intptr(self._h_library)) 2rfvfwfxfyfzfAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfPfQfsftfnfof

843  

844 def __repr__(self) -> str: 

845 # Trigger lazy load to get the handle 

846 self._lazy_load_module() 2RfSf;b

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