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

282 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-07-29 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  

7cimport cython 

8from libc.stddef cimport size_t 

9from libc.stdint cimport intptr_t 

10  

11from collections import namedtuple 

12from os import fsencode, fspath, PathLike 

13  

14from cuda.core._device import Device 

15from cuda.core._launch_config cimport LaunchConfig 

16from cuda.core._launch_config import LaunchConfig 

17from cuda.core._stream cimport Stream, Stream_accept 

18from cuda.core._program import ObjectCodeFormatType 

19from cuda.core._resource_handles cimport ( 

20 LibraryHandle, 

21 KernelHandle, 

22 create_library_handle_from_file, 

23 create_library_handle_from_data, 

24 create_kernel_handle, 

25 create_kernel_handle_ref, 

26 get_kernel_library, 

27 get_last_error, 

28 as_cu, 

29 as_py, 

30 as_intptr, 

31) 

32from cuda.core._stream import Stream 

33from cuda.core._utils.clear_error_support import ( 

34 assert_type_str_or_bytes_like, 

35 raise_code_path_meant_to_be_unreachable, 

36) 

37from cuda.core._utils.cuda_utils cimport HANDLE_RETURN 

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

39from cuda.core._utils.cuda_utils import driver 

40from cuda.bindings cimport cydriver 

41  

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

43  

44  

45cdef class KernelAttributes: 

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

47  

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

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

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

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

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

53 is visible through the others. 

54 """ 

55  

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

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

58  

59 @staticmethod 

60 cdef KernelAttributes _init(KernelHandle h_kernel): 

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

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

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

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

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

66  

67 cdef KernelAttributes _view_for_device(self, int device_id): 

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

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

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

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

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

73  

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

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

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

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

78  

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

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

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

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

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

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

85 cdef int result 

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

87 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

88 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

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

90  

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

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

93  

94 Parameters 

95 ---------- 

96 device : Device or int 

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

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

99  

100 Returns 

101 ------- 

102 KernelAttributes 

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

104 with this view. 

105 """ 

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

107  

108 @property 

109 def max_threads_per_block(self) -> int: 

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

111 This attribute is read-only.""" 

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

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

114 ) 

115  

116 @property 

117 def shared_size_bytes(self) -> int: 

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

119 This attribute is read-only.""" 

120 return self._get_cached_attribute( 2if

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

122 ) 

123  

124 @property 

125 def const_size_bytes(self) -> int: 

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

127 This attribute is read-only.""" 

128 return self._get_cached_attribute( 2}e

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

130 ) 

131  

132 @property 

133 def local_size_bytes(self) -> int: 

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

135 This attribute is read-only.""" 

136 return self._get_cached_attribute( 2~e

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

138 ) 

139  

140 @property 

141 def num_regs(self) -> int: 

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

143 This attribute is read-only.""" 

144 return self._get_cached_attribute( 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf

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

146 ) 

147  

148 @property 

149 def ptx_version(self) -> int: 

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

151 This attribute is read-only.""" 

152 return self._get_cached_attribute( 2ef

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

154 ) 

155  

156 @property 

157 def binary_version(self) -> int: 

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

159 This attribute is read-only.""" 

160 return self._get_cached_attribute( 2{e

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

162 ) 

163  

164 @property 

165 def cache_mode_ca(self) -> bool: 

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

167 This attribute is read-only.""" 

168 return bool( 2^e

169 self._get_cached_attribute( 2^e

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

171 ) 

172 ) 

173  

174 @property 

175 def max_dynamic_shared_size_bytes(self) -> int: 

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

177 by this function.""" 

178 return self._get_cached_attribute( 2af

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

180 ) 

181  

182 @property 

183 def preferred_shared_memory_carveout(self) -> int: 

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

185 return self._get_cached_attribute( 2df

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

187 ) 

188  

189 @property 

190 def cluster_size_must_be_set(self) -> bool: 

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

192 This attribute is read-only.""" 

193 return bool( 2_e

194 self._get_cached_attribute( 2_e

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

196 ) 

197 ) 

198  

199 @property 

200 def required_cluster_width(self) -> int: 

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

202 return self._get_cached_attribute( 2hf

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

204 ) 

205  

206 @property 

207 def required_cluster_height(self) -> int: 

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

209 return self._get_cached_attribute( 2gf

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

211 ) 

212  

213 @property 

214 def required_cluster_depth(self) -> int: 

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

216 return self._get_cached_attribute( 2ff

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

218 ) 

219  

220 @property 

221 def non_portable_cluster_size_allowed(self) -> bool: 

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

223 return bool( 2`e

224 self._get_cached_attribute( 2`e

225 self._effective_device_id(), 2`e

226 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED, 

227 ) 

228 ) 

229  

230 @property 

231 def cluster_scheduling_policy_preference(self) -> int: 

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

233 return self._get_cached_attribute( 2|e

234 self._effective_device_id(), 2|e

235 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE, 

236 ) 

237  

238  

239MaxPotentialBlockSizeOccupancyResult = namedtuple( 

240 "MaxPotentialBlockSizeOccupancyResult", ("min_grid_size", "max_block_size") 

241) 

242  

243  

244cdef class KernelOccupancy: 

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

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

247 """ 

248  

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

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

251  

252 @staticmethod 

253 cdef KernelOccupancy _init(KernelHandle h_kernel): 

254 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

255 self._h_kernel = h_kernel 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

256 return self 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

257  

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

259 """Occupancy of the kernel. 

260  

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

262  

263 Parameters 

264 ---------- 

265 block_size: int 

266 Block size parameter used to launch this kernel. 

267 dynamic_shared_memory_size: int 

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

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

270  

271 Returns 

272 ------- 

273 int 

274 The maximum number of active blocks per multiprocessor. 

275  

276 Note 

277 ---- 

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

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

280 theoretical multiprocessor utilization (occupancy). 

281  

282 """ 

283 cdef int num_blocks 

284 cdef int c_block_size = block_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

285 cdef size_t c_shmem_size = dynamic_shared_memory_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

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

287 with nogil: 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

288 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

289 &num_blocks, func, c_block_size, c_shmem_size 

290 )) 

291 return num_blocks 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb

292  

293 def max_potential_block_size( 

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

295 ) -> MaxPotentialBlockSizeOccupancyResult: 

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

297  

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

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

300  

301 Parameters 

302 ---------- 

303 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize] 

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

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

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

307 amount of needed dynamic shared memory which varies depending 

308 on tne block size. 

309 block_size_limit: int 

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

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

312  

313 Returns 

314 ------- 

315 :obj:`~MaxPotentialBlockSizeOccupancyResult` 

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

317 the suggested launch configuration. 

318  

319 Note 

320 ---- 

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

322 Interpreter Lock may lead to deadlocks. 

323  

324 """ 

325 cdef int min_grid_size, max_block_size 

326 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

327 cdef cydriver.CUoccupancyB2DSize callback 

328 cdef size_t c_shmem_size 

329 cdef int c_block_size_limit = block_size_limit 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

330 if isinstance(dynamic_shared_memory_needed, int): 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

331 c_shmem_size = dynamic_shared_memory_needed 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

332 with nogil: 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

333 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

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

335 )) 

336 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

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

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

339 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 

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

341 )) 

342 else: 

343 raise TypeError( 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

344 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

345 f"got {type(dynamic_shared_memory_needed)}" 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

346 ) 

347 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

348  

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

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

351  

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

353  

354 Parameters 

355 ---------- 

356 num_blocks_per_multiprocessor: int 

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

358 block_size: int 

359 Block size parameter used to launch this kernel. 

360  

361 Returns 

362 ------- 

363 int 

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

365 """ 

366 cdef size_t dynamic_smem_size 

367 cdef int c_num_blocks = num_blocks_per_multiprocessor 2.f/f:f;f=f?f

368 cdef int c_block_size = block_size 2.f/f:f;f=f?f

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

370 with nogil: 2.f/f:f;f=f?f

371 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2.f/f:f;f=f?f

372 &dynamic_smem_size, func, c_num_blocks, c_block_size 

373 )) 

374 return dynamic_smem_size 2.f/f:f;f=f?f

375  

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

377 """Maximum potential cluster size. 

378  

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

380  

381 Parameters 

382 ---------- 

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

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

385 stream: :obj:`~Stream` 

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

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

388 use the default stream. 

389  

390 Returns 

391 ------- 

392 int 

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

394 """ 

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

396 cdef Stream s = Stream_accept(stream) 

397 drv_cfg.hStream = as_cu(s._h_stream) 

398 cdef int cluster_size 

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

400 with nogil: 

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

402 return cluster_size 

403  

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

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

406  

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

408  

409 Parameters 

410 ---------- 

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

412 Kernel launch configuration. 

413 stream: :obj:`~Stream` 

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

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

416 use the default stream. 

417  

418 Returns 

419 ------- 

420 int 

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

422 """ 

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

424 cdef Stream s = Stream_accept(stream) 

425 drv_cfg.hStream = as_cu(s._h_stream) 

426 cdef int num_clusters 

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

428 with nogil: 

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

430 return num_clusters 

431  

432  

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

434  

435  

436cdef class Kernel: 

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

438  

439 Kernel instances can execution when passed directly into the 

440 :func:`~launch` function. 

441  

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

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

444  

445 """ 

446  

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

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

449  

450 @staticmethod 

451 cdef Kernel _from_handle(KernelHandle h_kernel): 

452 cdef Kernel ker = Kernel.__new__(Kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb 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 vf@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._h_kernel = h_kernel 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb 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 vf@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._attributes = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb 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 vf@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 ker._occupancy = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb 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 vf@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 return ker 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb 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 vf@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_

457  

458 @property 

459 @cython.critical_section 

460 def attributes(self) -> KernelAttributes: 

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

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

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

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

465  

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

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

468 raise NotImplementedError( 

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

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

471 ) 

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

473 raise NotImplementedError( 

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

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

476 ) 

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

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

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

480 cdef size_t param_offset, param_size 

481 cdef cydriver.CUresult err 

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

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

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

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

486 break 2c t o f g h i p j k l m rf

487 if param_info: 2c f g h i j k l m rf

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

489 arg_pos = arg_pos + 1 2c f g h i j k l m rf

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

491 HANDLE_RETURN(err) 1t

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

493  

494 @property 

495 def num_arguments(self) -> int: 

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

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

498 return num_args 2c o f g h i p j k l m rf

499  

500 @property 

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

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

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

504 return param_info 2o f g h i p j k l m rf

505  

506 @property 

507 @cython.critical_section 

508 def occupancy(self) -> KernelOccupancy: 

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

510 if self._occupancy is None: 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

511 self._occupancy = KernelOccupancy._init(self._h_kernel) 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

512 return self._occupancy 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f

513  

514 @property 

515 def handle(self) -> object: 

516 """Return the underlying kernel handle object. 

517  

518 .. caution:: 

519  

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

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

522 """ 

523 return as_py(self._h_kernel) 2b Uia vfC u c x q

524  

525 @property 

526 def _handle(self) -> object: 

527 return self.handle 

528  

529 @staticmethod 

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

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

532  

533 Parameters 

534 ---------- 

535 handle : int 

536 Kernel handle representing the address of a foreign 

537 kernel object (CUkernel). 

538 mod : :obj:`ObjectCode`, optional 

539 The ObjectCode object associated with this kernel. Provides 

540 library lifetime for foreign kernels not created by 

541 cuda.core. 

542 """ 

543  

544 if not isinstance(handle, int): 2b r a vfC HiIiJiKiLiMiNiOiPiQiu q

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

546  

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

548 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a vfC u q

549 if not h_kernel: 2b r a vfC u q

550 HANDLE_RETURN(get_last_error()) 

551  

552 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a vfC u q

553 cdef LibraryHandle h_caller_lib 

554  

555 if mod is not None: 2b r a vfC u q

556 h_caller_lib = (<ObjectCode>mod)._h_library 2a vfu

557 if h_existing_lib and h_caller_lib: 2a vfu

558 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a vfu

559 import warnings 1a

560 warnings.warn( 1a

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

562 "the library associated with this kernel.", 

563 stacklevel=2, 

564 ) 

565  

566 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a vfC u q

567 if mod is not None and not h_existing_lib: 2b r a vfC u q

568 k._keepalive = mod 

569 return k 2b r a vfC u q

570  

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

572 if not isinstance(other, Kernel): 2CiDix 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

573 return NotImplemented 1xDEFGHIJKLMNOPQRSTUVWXYzZ

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

575  

576 def __hash__(self) -> int: 

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

578  

579 def __repr__(self) -> str: 

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

581  

582  

583CodeTypeT = bytes | bytearray | str 

584  

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

586  

587cdef class ObjectCode: 

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

589  

590 This object provides a unified interface for different types of 

591 compiled programs that will be loaded onto the device. 

592  

593 Note 

594 ---- 

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

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

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

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

599 """ 

600  

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

602 raise RuntimeError( 2Vi

603 "ObjectCode objects cannot be instantiated directly. " 

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

605 ) 

606  

607 @classmethod 

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

609 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

610 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

611  

612 # _h_library is assigned during _lazy_load_module 

613 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

614  

615 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

616  

617 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

618 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c`cfb{cgb|cIghbJgibKg(h,f)hjf*h^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

619 elif isinstance(module, PathLike): 21 2 )f*f

620 self._module = fspath(module) 21 2 )f*f

621 else: 

622 self._module = module 

623 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

624 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

625  

626 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@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi

627  

628 @staticmethod 

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

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

631  

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

633 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2(f6g7g

634  

635 @staticmethod 

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

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

638  

639 Parameters 

640 ---------- 

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

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

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

644 on-disk cubin to load. 

645 name : Optional[str] 

646 A human-readable identifier representing this code object. 

647 symbol_mapping : Optional[dict] 

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

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

650 them (default to no mappings). 

651 """ 

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

653  

654 @staticmethod 

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

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

657  

658 Parameters 

659 ---------- 

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

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

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

663 on-disk ptx file to load. 

664 name : Optional[str] 

665 A human-readable identifier representing this code object. 

666 symbol_mapping : Optional[dict] 

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

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

669 them (default to no mappings). 

670 """ 

671 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2+f*f-ftg

672  

673 @staticmethod 

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

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

676  

677 Parameters 

678 ---------- 

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

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

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

682 on-disk ltoir file to load. 

683 name : Optional[str] 

684 A human-readable identifier representing this code object. 

685 symbol_mapping : Optional[dict] 

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

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

688 them (default to no mappings). 

689 """ 

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

691  

692 @staticmethod 

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

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

695  

696 Parameters 

697 ---------- 

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

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

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

701 on-disk fatbin to load. 

702 name : Optional[str] 

703 A human-readable identifier representing this code object. 

704 symbol_mapping : Optional[dict] 

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

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

707 them (default to no mappings). 

708 """ 

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

710  

711 @staticmethod 

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

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

714  

715 Parameters 

716 ---------- 

717 module : Union[bytes, str] 

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

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

720 name : Optional[str] 

721 A human-readable identifier representing this code object. 

722 symbol_mapping : Optional[dict] 

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

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

725 them (default to no mappings). 

726 """ 

727 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2mfvgw

728  

729 @staticmethod 

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

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

732  

733 Parameters 

734 ---------- 

735 module : Union[bytes, str] 

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

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

738 name : Optional[str] 

739 A human-readable identifier representing this code object. 

740 symbol_mapping : Optional[dict] 

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

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

743 them (default to no mappings). 

744 """ 

745 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2lfugv

746  

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

748  

749 @cython.critical_section 

750 cdef int _lazy_load_module(self) except -1: 

751 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 pfEi_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

752 return 0 2HbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bEikfsfy tfufnfof;b

753 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 pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

754 cdef bytes path_bytes 

755 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 pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

756 path_bytes = module.encode() 21 fb2 hb

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

758 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 pf_c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

759 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 pf_c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

760 elif isinstance(module, PathLike): 

761 path_bytes = fsencode(module) 

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

763 else: 

764 assert_type_str_or_bytes_like(module) 

765 raise_code_path_meant_to_be_unreachable() 

766 return -1 

767 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 pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

768 HANDLE_RETURN(get_last_error()) 

769 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 pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD 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[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_

770  

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

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

773  

774 Parameters 

775 ---------- 

776 name : str | bytes 

777 Name of the kernel to retrieve. 

778  

779 Returns 

780 ------- 

781 :obj:`~_module.Kernel` 

782 Newly created kernel object. 

783  

784 """ 

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

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

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

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

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

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

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

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

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

794  

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

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

797 HANDLE_RETURN(get_last_error()) 2;b

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

799  

800 def get_module(self) -> object: 

801 """Return a context-dependent :obj:`~driver.CUmodule` for legacy interop. 

802  

803 Bridges the native :obj:`~driver.CUlibrary` (see :attr:`handle`) to a 

804 ``CUmodule`` via ``cuLibraryGetModule``, for use with legacy driver APIs 

805 that only accept ``CUmodule``. 

806  

807 Returns 

808 ------- 

809 :obj:`~driver.CUmodule` 

810 Module handle for the current CUDA context, suitable for legacy 

811 driver APIs that accept ``CUmodule``. 

812 """ 

813 self._lazy_load_module() 2pf

814 cdef cydriver.CUmodule mod 

815 with nogil: 2pf

816 HANDLE_RETURN(cydriver.cuLibraryGetModule(&mod, as_cu(self._h_library))) 2pf

817 return driver.CUmodule(<intptr_t>mod) 2pf

818  

819 @property 

820 def code(self) -> CodeTypeT: 

821 """Return the underlying code object.""" 

822 return self._module 2@f[fFi]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgGi+frgsgr (f1 fbgb2 IghbJgibKg)f,fjf*f^g-f_gtg`glfmfugvgv w 8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:gWiwgxgygzgAgBgCgDgEgFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhHg[gEhFh]g

823  

824 @property 

825 def name(self) -> str: 

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

827 return self._name 2@f[fFi]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgGi+frgsgv w 8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgFgGgHg[g

828  

829 @property 

830 def code_type(self) -> str: 

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

832 return self._code_type 2@f[fFi]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgGi+frgsg(f2 hbib)f,fjf*f-flfmfugvgv w wgxgygzgAgBgCgDgEgFgGgHg]g

833  

834 @property 

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

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

837 return dict(self._sym_map) 2r (f1 fbgbIgJgKg)f,fjf*f-ftg

838  

839 @property 

840 def handle(self) -> object: 

841 """Return the native, context-independent :obj:`~driver.CUlibrary` handle. 

842  

843 Used by ``cuda.core`` and newer driver library APIs. For legacy APIs 

844 that only accept a ``CUmodule``, use :meth:`get_module` instead. 

845  

846 .. caution:: 

847  

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

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

850 """ 

851 self._lazy_load_module() 2Eikf

852 return as_py(self._h_library) 2Eikf

853  

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

855 if not isinstance(other, ObjectCode): 2kfLgMgNgOgPgQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g5gqfnfof

856 return NotImplemented 2kfLgMgNgOgPgQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g5g

857 # Trigger lazy load for both objects to compare handles 

858 self._lazy_load_module() 2kfqfnfof

859 (<ObjectCode>other)._lazy_load_module() 2kfqfnfof

860 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2kfqfnfof

861  

862 def __hash__(self) -> int: 

863 # Trigger lazy load to get the handle 

864 self._lazy_load_module() 2sfwfxfyfzfAfBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfQfRftfufnfof

865 return hash(as_intptr(self._h_library)) 2sfwfxfyfzfAfBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfQfRftfufnfof

866  

867 def __repr__(self) -> str: 

868 # Trigger lazy load to get the handle 

869 self._lazy_load_module() 2SfTf;b

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