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

288 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-03 02:41 +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 libcpp.mutex cimport py_safe_call_once 

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.") 2dk

58  

59 @staticmethod 

60 cdef KernelAttributes _init(KernelHandle h_kernel): 

61 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

62 self._h_kernel = h_kernel 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

63 self._device_id = -1 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

64 self._cache = {} 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

65 return self 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

66  

67 cdef KernelAttributes _view_for_device(self, int device_id): 

68 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

69 view._h_kernel = self._h_kernel 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

70 view._device_id = device_id 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

71 view._cache = self._cache 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

72 return view 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

73  

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

75 if self._device_id >= 0: 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

76 return self._device_id 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

77 return Device().device_id 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

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 c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

82 cached = self._cache.get(cache_key, cache_key) 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

83 if cached is not cache_key: 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

84 return cached 2ObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

85 cdef int result 

86 with nogil: 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

87 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

88 self._cache[cache_key] = result # setdefault not needed for ints 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

89 return result 2b c d Obr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

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) 2WgObHfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

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 c d Obr a w t Mf

113 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b c d Obr a w t Mf

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( 2Tf

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

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( 2Jf

129 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2Jf

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( 2Kf

137 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2Kf

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( 2Obx y z A B C D E F G H I J K L M N O Nf

145 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2Obx y z A B C D E F G H I J K L M N O Nf

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( 2Pf

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

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( 2Hf

161 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2Hf

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( 2Ef

169 self._get_cached_attribute( 2Ef

170 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2Ef

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( 2Lf

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

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( 2Of

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

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( 2Ff

194 self._get_cached_attribute( 2Ff

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

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( 2Sf

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

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( 2Rf

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

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( 2Qf

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

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( 2Gf

224 self._get_cached_attribute( 2Gf

225 self._effective_device_id(), 2Gf

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( 2If

234 self._effective_device_id(), 2If

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.") 2ek

251  

252 @staticmethod 

253 cdef KernelOccupancy _init(KernelHandle h_kernel): 

254 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

255 self._h_kernel = h_kernel 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

256 return self 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'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 1oxyzABCDEFGHIJKLMNO

285 cdef size_t c_shmem_size = dynamic_shared_memory_size 1oxyzABCDEFGHIJKLMNO

286 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 1oxyzABCDEFGHIJKLMNO

287 with nogil: 1oxyzABCDEFGHIJKLMNO

288 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 1oxyzABCDEFGHIJKLMNO

289 &num_blocks, func, c_block_size, c_shmem_size 

290 )) 

291 return num_blocks 1oxyzABCDEFGHIJKLMNO

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: 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) 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'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 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

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

331 c_shmem_size = dynamic_shared_memory_needed 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

332 with nogil: 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

333 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'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): 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'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( 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

344 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

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

346 ) 

347 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'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.") 2fk

449  

450 @staticmethod 

451 cdef Kernel _from_handle(KernelHandle h_kernel): 

452 cdef Kernel ker = Kernel.__new__(Kernel) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdceczjfcgcAjhcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudr vda -fwdw xdt yde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he.f8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfR

453 ker._h_kernel = h_kernel 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdceczjfcgcAjhcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudr vda -fwdw xdt yde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he.f8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfR

454 ker._attributes = None 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdceczjfcgcAjhcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudr vda -fwdw xdt yde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he.f8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfR

455 ker._occupancy = None 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdceczjfcgcAjhcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudr vda -fwdw xdt yde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he.f8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfR

456 return ker 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdceczjfcgcAjhcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudr vda -fwdw xdt yde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he.f8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfR

457  

458 @property 

459 @cython.critical_section 

460 def attributes(self) -> KernelAttributes: 

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

462 cdef KernelAttributes attributes 

463 if self._attributes is None: 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

464 attributes = KernelAttributes._init(self._h_kernel) 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

465 if self._attributes is None: 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

466 self._attributes = attributes 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

467 return self._attributes 2b c d WgObr a w t x y z A B C D E F G H I J K L M N O HfEfIfFfJfKfLfMfGfNfOfPfQfRfSfTf

468  

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

470 if cy_driver_version() < (12, 4, 0): 2e s p f g h i q j k l m ,f

471 raise NotImplementedError( 

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

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

474 ) 

475 if cy_binding_version() < (12, 4, 0): 2e s p f g h i q j k l m ,f

476 raise NotImplementedError( 

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

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

479 ) 

480 cdef size_t arg_pos = 0 2e s p f g h i q j k l m ,f

481 cdef list param_info_data = [] 2e s p f g h i q j k l m ,f

482 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2e s p f g h i q j k l m ,f

483 cdef size_t param_offset, param_size 

484 cdef cydriver.CUresult err 

485 while True: 2e s p f g h i q j k l m ,f

486 with nogil: 2e s p f g h i q j k l m ,f

487 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, &param_offset, &param_size) 2e s p f g h i q j k l m ,f

488 if err != cydriver.CUDA_SUCCESS: 2e s p f g h i q j k l m ,f

489 break 2e s p f g h i q j k l m ,f

490 if param_info: 2e f g h i j k l m ,f

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

492 arg_pos = arg_pos + 1 2e f g h i j k l m ,f

493 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2e s p f g h i q j k l m ,f

494 HANDLE_RETURN(err) 1s

495 return arg_pos, param_info_data 2e p f g h i q j k l m ,f

496  

497 @property 

498 def num_arguments(self) -> int: 

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

500 num_args, _ = self._get_arguments_info() 2e s p f g h i q j k l m ,f

501 return num_args 2e p f g h i q j k l m ,f

502  

503 @property 

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

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

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

507 return param_info 2p f g h i q j k l m ,f

508  

509 @property 

510 @cython.critical_section 

511 def occupancy(self) -> KernelOccupancy: 

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

513 cdef KernelOccupancy occupancy 

514 if self._occupancy is None: 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

515 occupancy = KernelOccupancy._init(self._h_kernel) 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

516 if self._occupancy is None: 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

517 self._occupancy = occupancy 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

518 return self._occupancy 2o =f?f@f[f]f^fx y z A B C D E F G H I J K L M N O YfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f

519  

520 @property 

521 def handle(self) -> object: 

522 """Return the underlying kernel handle object. 

523  

524 .. caution:: 

525  

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

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

528 """ 

529 return as_py(self._h_kernel) 2b FbGbS HbIbJbKbLbMbgka -fw t e Cj.f

530  

531 @property 

532 def _handle(self) -> object: 

533 return self.handle 

534  

535 @staticmethod 

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

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

538  

539 Parameters 

540 ---------- 

541 handle : int 

542 Kernel handle representing the address of a foreign 

543 kernel object (CUkernel). 

544 mod : :obj:`ObjectCode`, optional 

545 The ObjectCode object associated with this kernel. Provides 

546 library lifetime for foreign kernels not created by 

547 cuda.core. 

548 """ 

549  

550 if not isinstance(handle, int): 2b r a -fw JjKjLjMjNjOjPjQjRjSjt .f

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

552  

553 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b r a -fw t .f

554 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a -fw t .f

555 if not h_kernel: 2b r a -fw t .f

556 HANDLE_RETURN(get_last_error()) 

557  

558 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a -fw t .f

559 cdef LibraryHandle h_caller_lib 

560  

561 if mod is not None: 2b r a -fw t .f

562 h_caller_lib = (<ObjectCode>mod)._h_library 2a -ft

563 if h_existing_lib and h_caller_lib: 2a -ft

564 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a -ft

565 import warnings 1a

566 warnings.warn( 1a

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

568 "the library associated with this kernel.", 

569 stacklevel=2, 

570 ) 

571  

572 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a -fw t .f

573 if mod is not None and not h_existing_lib: 2b r a -fw t .f

574 k._keepalive = mod 

575 return k 2b r a -fw t .f

576  

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

578 if not isinstance(other, Kernel): 2zjAjS Cj.fTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'jDj(j)jFjGj

579 return NotImplemented 2CjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'jDj(j

580 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2zjAjS Cj.f)jFjGj

581  

582 def __hash__(self) -> int: 

583 return hash(as_intptr(self._h_kernel)) 2.fhkikjkkklkmknkokpkqkrksktkukvkwkxkykzkAkBkCkDkBjEkFkGkHkFjGj

584  

585 def __repr__(self) -> str: 

586 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 2EbNbIk

587  

588  

589CodeTypeT = bytes | bytearray | str 

590  

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

592  

593  

594cdef void _lazy_load_module_once(void *self_v) except *: 

595 # Call-once helper for the lazy module loading, we want to avoid unloading 

596 # a module in case of threads racing, so use `call_once`. 

597 cdef ObjectCode self = <ObjectCode>self_v 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

598 cdef LibraryHandle h_library 

599 cdef bytes path_bytes 

600 module = self._module 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

601 if isinstance(module, str): 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

602 path_bytes = module.encode() 1P3Q5

603 h_library = create_library_handle_from_file(<const char*>path_bytes) 1P3Q5

604 elif isinstance(module, (bytes, bytearray)): 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdBdCd4 Dd6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

605 h_library = create_library_handle_from_data(<const void*><char*>module) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdBdCd4 Dd6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

606 elif isinstance(module, PathLike): 

607 path_bytes = fsencode(module) 

608 h_library = create_library_handle_from_file(<const char*>path_bytes) 

609 else: 

610 assert_type_str_or_bytes_like(module) 

611 raise_code_path_meant_to_be_unreachable() 

612 return 

613 if not h_library: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

614 HANDLE_RETURN(get_last_error()) 

615 self._h_library = h_library 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%g` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

616  

617  

618cdef class ObjectCode: 

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

620  

621 This object provides a unified interface for different types of 

622 compiled programs that will be loaded onto the device. 

623  

624 Note 

625 ---- 

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

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

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

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

630 """ 

631  

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

633 raise RuntimeError( 2Jk

634 "ObjectCode objects cannot be instantiated directly. " 

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

636 ) 

637  

638 @classmethod 

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

640 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

641 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

642  

643 # _h_library is assigned during _lazy_load_module 

644 self._h_library = LibraryHandle() # Empty handle 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

645  

646 self._code_type = str(code_type) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

647  

648 if isinstance(module, (str, bytes, bytearray)): 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

649 self._module = module 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdBd3 Cd4 Dd?g5 @g6 [ggi~fhiUfiiqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

650 elif isinstance(module, PathLike): 2P Q `f{f

651 self._module = fspath(module) 2P Q `f{f

652 else: 

653 self._module = module 

654 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

655 self._name = name if name else "" 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

656  

657 return self 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdbg8hcg9hdg!h#heg$hfg%hgg'hhg(hig)hjg*hkg+hlg,hmg-hng.hog/hpg:hqg;hrg=hsg?htg@hug[hvg]hwg^hxg_hyg`hzg{hAg|hBg}h~hCgaibi}fciDgdiEgeifitdudr vda wdxdyde _fzds p f g h i q j k l m XfAdP Bd3 Cd4 DdQ ?g5 @g6 [g`fgi~fhiUfii{fqhagrhFgshVfWfGgHgu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 heji8 ie9 jekikeleme! nelioepeqereseteuevewexe# yemize$ AeniBeCeDe% EeoiFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UepiVeWeqiXerisitiuiviwixiyizi` YeAiBiCiDiEiZe0e1e{ 2eFi3e| 4eGi5e6e7e} 8eHi9e!e#e$e%e'e(e)e*e+e~ ,eIi-eab.eJi/e:e;ebb=eKi?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefLiffgfMihfNiOiPiQiRiSiTiUiViubifWiXiYiZi0ijfkflfvbmf1i]g2i^g3infwbof4i5ipfxbqf6irfybsf7itfzbuf8ivfAbwf9ixfBbyf!izfCbAf#iBfDbCf$i_g`g%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjthuhsjtjvhwhDfxh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgujKgLgMgNgOgPgQgRgvjSgTgUgwjR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hxjVgoh6h7hphyj

658  

659 @staticmethod 

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

661 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2_f]g^g

662  

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

664 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2_f]g^g

665  

666 @staticmethod 

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

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

669  

670 Parameters 

671 ---------- 

672 module : bytes | str | os.PathLike 

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

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

675 on-disk cubin to load. 

676 name : str | None 

677 A human-readable identifier representing this code object. 

678 symbol_mapping : dict | None 

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

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

681 them (default to no mappings). 

682 """ 

683 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2P 3 4 khlhmhnh

684  

685 @staticmethod 

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

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

688  

689 Parameters 

690 ---------- 

691 module : bytes | str | os.PathLike 

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

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

694 on-disk ptx file to load. 

695 name : str | None 

696 A human-readable identifier representing this code object. 

697 symbol_mapping : dict | None 

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

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

700 them (default to no mappings). 

701 """ 

702 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2}f{fagFg

703  

704 @staticmethod 

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

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

707  

708 Parameters 

709 ---------- 

710 module : bytes | str | os.PathLike 

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

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

713 on-disk ltoir file to load. 

714 name : str | None 

715 A human-readable identifier representing this code object. 

716 symbol_mapping : dict | None 

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

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

719 them (default to no mappings). 

720 """ 

721 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2`f~fUf

722  

723 @staticmethod 

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

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

726  

727 Parameters 

728 ---------- 

729 module : bytes | str | os.PathLike 

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

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

732 on-disk fatbin to load. 

733 name : str | None 

734 A human-readable identifier representing this code object. 

735 symbol_mapping : dict | None 

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

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

738 them (default to no mappings). 

739 """ 

740 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 1Q56

741  

742 @staticmethod 

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

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

745  

746 Parameters 

747 ---------- 

748 module : bytes | str 

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

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

751 name : str | None 

752 A human-readable identifier representing this code object. 

753 symbol_mapping : dict | None 

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

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

756 them (default to no mappings). 

757 """ 

758 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2WfHgv

759  

760 @staticmethod 

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

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

763  

764 Parameters 

765 ---------- 

766 module : bytes | str 

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

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

769 name : str | None 

770 A human-readable identifier representing this code object. 

771 symbol_mapping : dict | None 

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

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

774 them (default to no mappings). 

775 """ 

776 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2VfGgu

777  

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

779  

780 cdef int _lazy_load_module(self) except -1: 

781 py_safe_call_once(self._load_once, _lazy_load_module_once, <void *>self) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfEjAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%gBj` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

782 return 0 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m XfEjAdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he/f8 ie9 jeXgkeleme! neYgoepeqereseteuevewexe# yeZgze$ Ae0gBeCeDe% Ee1gFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ Ue2gVeWe3g4gXe5g6g7g8g9g!g#g$g%gBj` 'gYe(g)g*g+g,gZe0e1e{ 2e-g3e| 4e.g5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbof/g:gpfxbqf|frfybsf;gtfzbuf=gvfAbwf:fxfBbyf;fzfCbAfBfDbCfDfR

783  

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

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

786  

787 Parameters 

788 ---------- 

789 name : str | bytes 

790 Name of the kernel to retrieve. 

791  

792 Returns 

793 ------- 

794 :obj:`~_module.Kernel` 

795 Newly created kernel object. 

796  

797 """ 

798 self._lazy_load_module() 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

799 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

800 if self._code_type not in supported_code_types: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 UfVfWfu v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

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

802 try: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

803 name = self._sym_map[name] 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

804 except KeyError: 2T U V W X Y Z 0 1 o 2 e u v 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbDfR

805 if isinstance(name, str): 2T U V W X Y Z 0 1 o 2 e u v 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbDfR

806 name = name.encode() 2T U V W X Y Z 0 1 o 2 e u v 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbDfR

807  

808 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

809 if not h_kernel: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfDfR

810 HANDLE_RETURN(get_last_error()) 2Df

811 return Kernel._from_handle(h_kernel) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcb c d yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcEbFbGbS ScTcUcVcWcXcYcHbIbJbZcKbLbMbNb0c1c2c3c4c5c6c7c8c9c!c#cT U V W X Y Z 0 1 o 2 $c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvda wdxdyde zds p f g h i q j k l m AdP Bd3 Cd4 DdQ 5 6 u v EdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege7 he8 ie9 jekeleme! neoepeqereseteuevewexe# yeze$ AeBeCeDe% EeFeGeHe' ( ) * + , - . / : ; = ? @ [ ] ^ IeJeKeLeMeNeOePeQeReSeTe_ UeVeWeXe` YeZe0e1e{ 2e3e| 4e5e6e7e} 8e9e!e#e$e%e'e(e)e*e+e~ ,e-eab.e/e:e;ebb=e?e@e[ecbdbebfbgbhbibjbkblbmbnbobpbqbrbsb]e^e_e`e{e|e}e~eafbfcfdftbefffgfhfubifjfkflfvbmfnfwbofpfxbqfrfybsftfzbufvfAbwfxfBbyfzfCbAfBfDbCfR

812  

813 def get_module(self) -> driver.CUmodule: 

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

815  

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

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

818 that only accept ``CUmodule``. 

819  

820 Returns 

821 ------- 

822 :obj:`~driver.CUmodule` 

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

824 driver APIs that accept ``CUmodule``. 

825 """ 

826 self._lazy_load_module() 2Xf

827 cdef cydriver.CUmodule mod 

828 with nogil: 2Xf

829 HANDLE_RETURN(cydriver.cuLibraryGetModule(&mod, as_cu(self._h_library))) 2Xf

830 return as_py(mod) 2Xf

831  

832 @property 

833 def code(self) -> CodeTypeT: 

834 """Return the underlying code object.""" 

835 return self._module 2bgcgdgHjegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgIj}fDgEgr _fP 3 4 Q ?g5 @g6 [g`f~fUf{fqhagrhFgshVfWfGgHgu v _g`gxh{g|g}g~gahbhchdhehfhghhhihjhKkIgJgKgLgMgNgOgPgQgRgSgTgUgR khBhChDhEhFhGhHhIhlhJhmhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZhnh0h1h2h3h4h5hVgoh6h7hph

836  

837 @property 

838 def name(self) -> str: 

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

840 return self._name 2bgcgdgHjegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgIj}fDgEgu v _g`gthuhvhwh{g|g}g~gahbhchdhehfhghhhihjhyhzhAhIgJgKgLgMgNgOgPgQgRgSgTgUgVgoh

841  

842 @property 

843 def code_type(self) -> str: 

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

845 return self._code_type 2bgcgdgHjegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgIj}fDgEg_fQ 5 6 `f~fUf{fagVfWfGgHgu v IgJgKgLgMgNgOgPgQgRgSgTgUgVgph

846  

847 @property 

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

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

850 return dict(self._sym_map) 2r _fP 3 4 ?g@g[g`f~fUf{fagFg

851  

852 @property 

853 def handle(self) -> object: 

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

855  

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

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

858  

859 .. caution:: 

860  

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

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

863 """ 

864 self._lazy_load_module() 2Ej/f

865 return as_py(self._h_library) 2Ej/f

866  

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

868 if not isinstance(other, ObjectCode): 2/f*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jDj{j|j}j~jakbkck|f:f;f

869 return NotImplemented 2/f*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`jDj{j|j}j~jakbkck

870 # Trigger lazy load for both objects to compare handles 

871 self._lazy_load_module() 2/f|f:f;f

872 (<ObjectCode>other)._lazy_load_module() 2/f|f:f;f

873 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2/f|f:f;f

874  

875 def __hash__(self) -> int: 

876 # Trigger lazy load to get the handle 

877 self._lazy_load_module() 2XgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%gBj'g(g)g*g+g,g-g.g;g=g:f;f

878 return hash(as_intptr(self._h_library)) 2XgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%gBj'g(g)g*g+g,g-g.g;g=g:f;f

879  

880 def __repr__(self) -> str: 

881 # Trigger lazy load to get the handle 

882 self._lazy_load_module() 2/g:gDf

883 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2/g:gDf