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

285 statements  

« prev     ^ index     » next       coverage.py v7.17.2, created at 2026-11-05 01:11 +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._rt 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_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.") 2ei

58  

59 @staticmethod 

60 cdef KernelAttributes _init(KernelHandle h_kernel): 

61 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

62 self._h_kernel = h_kernel 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

63 self._device_id = -1 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

64 self._cache = {} 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

65 return self 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

66  

67 cdef KernelAttributes _view_for_device(self, int device_id): 

68 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

69 view._h_kernel = self._h_kernel 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

70 view._device_id = device_id 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

71 view._cache = self._cache 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

72 return view 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

73  

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

75 if self._device_id >= 0: 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

76 return self._device_id 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

77 return Device().device_id 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

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 ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

82 cached = self._cache.get(cache_key, cache_key) 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

83 if cached is not cache_key: 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

84 return cached 2ib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

85 cdef int result 

86 with nogil: 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

87 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

88 self._cache[cache_key] = result # setdefault not needed for ints 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

89 return result 2b c d ibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

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) 20fib=d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

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 ibo a z s ^d

113 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b c d ibo a z s ^d

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

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

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@d

129 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2@d

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[d

137 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2[d

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( 2ibA B C D E F G H I J K L M N O P Q R _d

145 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2ibA B C D E F G H I J K L M N O P Q R _d

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( 2{d

153 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2{d

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=d

161 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2=d

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/d

169 self._get_cached_attribute( 2/d

170 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2/d

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( 2]d

179 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2]d

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( 2`d

186 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2`d

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:d

194 self._get_cached_attribute( 2:d

195 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2:d

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( 2~d

203 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2~d

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( 2}d

210 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2}d

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

217 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2|d

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;d

224 self._get_cached_attribute( 2;d

225 self._effective_device_id(), 2;d

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?d

234 self._effective_device_id(), 2?d

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

251  

252 @staticmethod 

253 cdef KernelOccupancy _init(KernelHandle h_kernel): 

254 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

255 self._h_kernel = h_kernel 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

256 return self 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

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 1nABCDEFGHIJKLMNOPQR

285 cdef size_t c_shmem_size = dynamic_shared_memory_size 1nABCDEFGHIJKLMNOPQR

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

287 with nogil: 1nABCDEFGHIJKLMNOPQR

288 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 1nABCDEFGHIJKLMNOPQR

289 &num_blocks, func, c_block_size, c_shmem_size 

290 )) 

291 return num_blocks 1nABCDEFGHIJKLMNOPQR

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

327 cdef cydriver.CUoccupancyB2DSize callback 

328 cdef size_t c_shmem_size 

329 cdef int c_block_size_limit = block_size_limit 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

330 if isinstance(dynamic_shared_memory_needed, int): 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

331 c_shmem_size = dynamic_shared_memory_needed 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

332 with nogil: 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

333 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

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): 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

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

344 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

345 f"got {type(dynamic_shared_memory_needed)}" 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

346 ) 

347 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2iejekelemeneoepeqereseteuevewexeyezeAeBeCe

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?e@e[e]e^e_e

368 cdef int c_block_size = block_size 2?e@e[e]e^e_e

369 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2?e@e[e]e^e_e

370 with nogil: 2?e@e[e]e^e_e

371 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2?e@e[e]e^e_e

372 &dynamic_smem_size, func, c_num_blocks, c_block_size 

373 )) 

374 return dynamic_smem_size 2?e@e[e]e^e_e

375  

376 def max_potential_cluster_size(self, LaunchConfig config not None: LaunchConfig, *, Stream stream not None: 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 = 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, LaunchConfig config not None: LaunchConfig, *, Stream stream not None: 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 = 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.") 2gi

449  

450 @staticmethod 

451 cdef Kernel _from_handle(KernelHandle h_kernel): 

452 cdef Kernel ker = Kernel.__new__(Kernel) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b+h$b%b,h'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $co %ca De'cz (cs )ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdEe/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| U }

453 ker._h_kernel = h_kernel 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b+h$b%b,h'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $co %ca De'cz (cs )ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdEe/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| U }

454 ker._attributes = None 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b+h$b%b,h'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $co %ca De'cz (cs )ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdEe/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| U }

455 ker._occupancy = None 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b+h$b%b,h'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $co %ca De'cz (cs )ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdEe/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| U }

456 return ker 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b+h$b%b,h'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $co %ca De'cz (cs )ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdEe/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| U }

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 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

464 attributes = KernelAttributes._init(self._h_kernel) 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

465 if self._attributes is None: 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

466 self._attributes = attributes 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

467 return self._attributes 2b c d 0fibo a z s A B C D E F G H I J K L M N O P Q R =d/d?d:d@d[d]d^d;d_d`d{d|d}d~dae

468  

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

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

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 cdef size_t arg_pos = 0 2e r p f g h i q j k l m Fe

476 cdef list param_info_data = [] 2e r p f g h i q j k l m Fe

477 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2e r p f g h i q j k l m Fe

478 cdef size_t param_offset, param_size 

479 cdef cydriver.CUresult err 

480 while True: 2e r p f g h i q j k l m Fe

481 with nogil: 2e r p f g h i q j k l m Fe

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

483 if err != cydriver.CUDA_SUCCESS: 2e r p f g h i q j k l m Fe

484 break 2e r p f g h i q j k l m Fe

485 if param_info: 2e f g h i j k l m Fe

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

487 arg_pos = arg_pos + 1 2e f g h i j k l m Fe

488 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2e r p f g h i q j k l m Fe

489 HANDLE_RETURN(err) 1r

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

491  

492 @property 

493 def num_arguments(self) -> int: 

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

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

496 return num_args 2e p f g h i q j k l m Fe

497  

498 @property 

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

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

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

502 return param_info 2p f g h i q j k l m Fe

503  

504 @property 

505 @cython.critical_section 

506 def occupancy(self) -> KernelOccupancy: 

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

508 cdef KernelOccupancy occupancy 

509 if self._occupancy is None: 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

510 occupancy = KernelOccupancy._init(self._h_kernel) 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

511 if self._occupancy is None: 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

512 self._occupancy = occupancy 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

513 return self._occupancy 2n ?e@e[e]e^e_eA B C D E F G H I J K L M N O P Q R iejekelemeneoepeqereseteuevewexeyezeAeBeCe

514  

515 @property 

516 def handle(self) -> object: 

517 """Return the underlying kernel handle object. 

518  

519 .. caution:: 

520  

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

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

523 """ 

524 return as_py(self._h_kernel) 2b abbbW cbdbebfbgbhb~ hia Dez s e -hEe

525  

526 @property 

527 def _handle(self) -> object: 

528 return self.handle 

529  

530 @staticmethod 

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

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

533  

534 Parameters 

535 ---------- 

536 handle : int 

537 Kernel handle representing the address of a foreign 

538 kernel object (CUkernel). 

539 mod : :obj:`ObjectCode`, optional 

540 The ObjectCode object associated with this kernel. Provides 

541 library lifetime for foreign kernels not created by 

542 cuda.core. 

543 """ 

544  

545 if not isinstance(handle, int): 2b ~ o a Dez ^h_h`h{h|h}h~haibicis Ee

546 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2^h_h`h{h|h}h~haibici

547  

548 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b ~ o a Dez s Ee

549 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b ~ o a Dez s Ee

550 if not h_kernel: 2b ~ o a Dez s Ee

551 HANDLE_RETURN(get_last_error()) 

552  

553 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b ~ o a Dez s Ee

554 cdef LibraryHandle h_caller_lib 

555  

556 if mod is not None: 2b ~ o a Dez s Ee

557 h_caller_lib = mod._h_library 2~ a Des

558 if h_existing_lib and h_caller_lib: 2~ a Des

559 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2~ a Des

560 import warnings 1a

561 warnings.warn( 1a

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

563 "the library associated with this kernel.", 

564 stacklevel=2, 

565 ) 

566  

567 cdef Kernel k = Kernel._from_handle(h_kernel) 2b ~ o a Dez s Ee

568 if mod is not None and not h_existing_lib: 2b ~ o a Dez s Ee

569 k._keepalive = mod 

570 return k 2b ~ o a Dez s Ee

571  

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

573 if not isinstance(other, Kernel): 2+h,hW ~ -hEe.hdi:h;h

574 return NotImplemented 2~ -h.h

575 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2+h,hW ~ -hEedi:h;h

576  

577 def __hash__(self) -> int: 

578 return hash(as_intptr(self._h_kernel)) 2~ Eeiijikili:h;h

579  

580 def __repr__(self) -> str: 

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

582  

583  

584CodeTypeT = bytes | bytearray | str 

585  

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

587  

588  

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

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

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

592 cdef ObjectCode self = <ObjectCode>self_v 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+cS ,c* -c+ .cT , - becedet u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

593 cdef LibraryHandle h_library 

594 cdef bytes path_bytes 

595 module = self._module 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+cS ,c* -c+ .cT , - becedet u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

596 if isinstance(module, str): 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+cS ,c* -c+ .cT , - becedet u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

597 path_bytes = module.encode() 1S*T,

598 h_library = create_library_handle_from_file(<const char*>path_bytes) 1S*T,

599 elif isinstance(module, (bytes, bytearray)): 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+c,c-c+ .c- becedet u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

600 h_library = create_library_handle_from_data(<const void*><char*>module) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+c,c-c+ .c- becedet u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

601 elif isinstance(module, PathLike): 2he

602 path_bytes = fsencode(module) 

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

604 else: 

605 assert_type_str_or_bytes_like(module) 2he

606 raise_code_path_meant_to_be_unreachable() 

607 return 

608 if not h_library: 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+cS ,c* -c+ .cT , - becedet u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

609 HANDLE_RETURN(get_last_error()) 

610 self._h_library = h_library 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# ee$ % feYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c$c%ca 'c(c)ce *cr p f g h i q j k l m ge+cS ,c* -c+ .cT , - becedet u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

611  

612  

613cdef class ObjectCode: 

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

615  

616 This object provides a unified interface for different types of 

617 compiled programs that will be loaded onto the device. 

618  

619 Note 

620 ---- 

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

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

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

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

625 """ 

626  

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

628 raise RuntimeError( 2ni

629 "ObjectCode objects cannot be instantiated directly. " 

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

631 ) 

632  

633 @classmethod 

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

635 if code_type not in _supported_code_type: 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*c=hr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

636 raise ValueError(f"{code_type=} is not supported") 2=h

637 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

638  

639 # _h_library is assigned during _lazy_load_module 

640 self._h_library = LibraryHandle() # Empty handle 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

641  

642 self._code_type = str(code_type) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

643  

644 if isinstance(module, (str, bytes, bytearray)): 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

645 self._module = module 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+c,c* -c+ .c7f, 8f- 9fehaffhbegh}fbf~fJfagcedeKfLft u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

646 elif isinstance(module, PathLike): 2S T {e|ehe

647 self._module = fspath(module) 2S T {e|e

648 else: 

649 self._module = module 2he

650 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

651 self._name = name if name else "" 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

652  

653 return self 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# 0g$ % 1gYcZc0c1c2c3c4c5c6c7c8c9ccf2gv w 3g4gx y df5gef6g7gff8ggf9ghf!gif#gjf$gkf%glf'gmf(gnf)gof*gpf+gqf,grf-gsf.gtf/guf:gvf;gwf=gxf?gyf@gzf[gAf]gBf^gCf_g`gDf{g|g~e}gEf~gFfahGfbhHfIfch' ( ) dh!c#c$co %ca 'c(c)ce `e*cr p f g h i q j k l m ge+cS ,c* -c+ .cT 7f, 8f- 9f{eehaffhbegh|e}fbf~fJfagcedeKfLft u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zdhh/ 0d: 1dih2d; 3djh= !fkh#flh4d? 5dmhnh6d@ 7doh8d[ 9dph!d] #dqh$d^ %drh'd_ (dsh)d` *dth+d{ ,duh$f%fvhbgwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h| !h'fcgdgeg#h$hfggghgig.djg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmg%hMf'hNfOfPfQfRfSfTfUfVfWfXfYf(hU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXg)hZf{fYgZg|f*h}

654  

655 @staticmethod 

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

657 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2`e=h!f#f

658  

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

660 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2`e!f#f

661  

662 @staticmethod 

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

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

665  

666 Parameters 

667 ---------- 

668 module : bytes | str | os.PathLike 

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

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

671 on-disk cubin to load. 

672 name : str | None 

673 A human-readable identifier representing this code object. 

674 symbol_mapping : dict | None 

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

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

677 them (default to no mappings). 

678 """ 

679 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2S * + -dhe]f^f_f`f

680  

681 @staticmethod 

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

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

684  

685 Parameters 

686 ---------- 

687 module : bytes | str | os.PathLike 

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

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

690 on-disk ptx file to load. 

691 name : str | None 

692 A human-readable identifier representing this code object. 

693 symbol_mapping : dict | None 

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

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

696 them (default to no mappings). 

697 """ 

698 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2~e|ebfJf

699  

700 @staticmethod 

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

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

703  

704 Parameters 

705 ---------- 

706 module : bytes | str | os.PathLike 

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

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

709 on-disk ltoir file to load. 

710 name : str | None 

711 A human-readable identifier representing this code object. 

712 symbol_mapping : dict | None 

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

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

715 them (default to no mappings). 

716 """ 

717 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2{eafbe

718  

719 @staticmethod 

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

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

722  

723 Parameters 

724 ---------- 

725 module : bytes | str | os.PathLike 

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

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

728 on-disk fatbin to load. 

729 name : str | None 

730 A human-readable identifier representing this code object. 

731 symbol_mapping : dict | None 

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

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

734 them (default to no mappings). 

735 """ 

736 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 1T,-

737  

738 @staticmethod 

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

740 """Create an :class:`ObjectCode` instance from a host object containing device code. 

741  

742 Parameters 

743 ---------- 

744 module : bytes | str 

745 Either a bytes object containing the in-memory host object to load, or 

746 a file path string pointing to the on-disk host object to load. 

747 name : str | None 

748 A human-readable identifier representing this code object. 

749 symbol_mapping : dict | None 

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

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

752 them (default to no mappings). 

753 """ 

754 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2deLfu

755  

756 @staticmethod 

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

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

759  

760 Parameters 

761 ---------- 

762 module : bytes | str 

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

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

765 name : str | None 

766 A human-readable identifier representing this code object. 

767 symbol_mapping : dict | None 

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

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

770 them (default to no mappings). 

771 """ 

772 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2ceKft

773  

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

775  

776 cdef int _lazy_load_module(self) except -1: 

777 py_safe_call_once(self._load_once, _lazy_load_module_once, <void *>self) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m ge/h+cS ,c* -c+ .cT , - becedet u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

778 return 0 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m ge/h+cS ,c* -c+ .cT , - becedet u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. ZdGe/ 0d: 1d1f2d; 3d2f= 4d? 5d3f4f6d@ 7d}e8d[ 9d5f!d] #d6f$d^ %d;e'd_ (d=e)d` *d+d{ ,d| .dU }

779  

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

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

782  

783 Parameters 

784 ---------- 

785 name : str | bytes 

786 Name of the kernel to retrieve. 

787  

788 Returns 

789 ------- 

790 :obj:`~_module.Kernel` 

791 Newly created kernel object. 

792  

793 """ 

794 self._lazy_load_module() 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - becedet u -dhe/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

795 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - becedet u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

796 if self._code_type not in supported_code_types: 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - becedet u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

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

798 try: 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

799 name = self._sym_map[name] 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

800 except KeyError: 2V X Y Z 0 1 2 3 4 5 6 7 8 n 9 ! # $ % v w x y ' ( ) e t u -d. / : ; = ? @ [ ] ^ _ ` { | .dU }

801 if isinstance(name, str): 2V X Y Z 0 1 2 3 4 5 6 7 8 n 9 ! # $ % v w x y ' ( ) e t u -d. / : ; = ? @ [ ] ^ _ ` { | .dU }

802 name = name.encode() 2V X Y Z 0 1 2 3 4 5 6 7 8 n 9 ! # $ % v w x y ' ( ) e t u -d. / : ; = ? @ [ ] ^ _ ` { | .dU }

803  

804 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

805 if not h_kernel: 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u -d/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| .dU }

806 HANDLE_RETURN(get_last_error()) 2-d.d

807 return Kernel._from_handle(h_kernel) 2jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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}bb c d ~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcV abbbW ucvcwcxcyczcAcBcCcDcEcFcGcX cbdbebHcY fbgbhbIcJcKcLcMcNcOcPcQcRcScTcUcVcZ 0 1 2 3 4 5 6 7 8 n 9 ! WcXc# HeIeJeKeLeMeNeOePeQeeeReSe$ % TeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,efe-e.e/e:eYcZc0c1c2c3c4c5c6c7c8c9cv w x y ' ( ) !c#c~ $c%ca 'c(c)ce *cr p f g h i q j k l m +cS ,c* -c+ .cT , - t u /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd. Zd/ 0d: 1d2d; 3d= 4d? 5d6d@ 7d8d[ 9d!d] #d$d^ %d'd_ (d)d` *d+d{ ,d| U }

808  

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

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

811  

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

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

814 that only accept ``CUmodule``. 

815  

816 Returns 

817 ------- 

818 :obj:`~driver.CUmodule` 

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

820 driver APIs that accept ``CUmodule``. 

821 """ 

822 self._lazy_load_module() 2ge

823 cdef cydriver.CUmodule mod 

824 with nogil: 2ge

825 HANDLE_RETURN(cydriver.cuLibraryGetModule(&mod, as_cu(self._h_library))) 2ge

826 return as_py(mod) 2ge

827  

828 @property 

829 def code(self) -> CodeTypeT: 

830 """Return the underlying code object.""" 

831 return self._module 2cfv w ?hx y dfef@hffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDf[h~eEfFfGfHfIf]ho `eS * + T 7f, 8f- 9f{eafbe|e}fbf~fJfagcedeKfLft u -dhe$f%fbg'fhgigjg(f)f*f+f,f-f.f/f:f;f=f?f@f[foiMfNfOfPfQfRfSfTfUfVfWfXfYfU ]fngogpgqgrgsgtgug^fvg_fwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRg`fSgTgUgVgWgXgZf{fYgZg|f

832  

833 @property 

834 def name(self) -> str: 

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

836 return self._name 2cfv w ?hx y dfef@hffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDf[h~eEfFfGfHfIf]ht u $f%f'fcgdgegfggg(f)f*f+f,f-f.f/f:f;f=f?f@f[fkglgmgMfNfOfPfQfRfSfTfUfVfWfXfYfZf{f

837  

838 @property 

839 def code_type(self) -> str: 

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

841 return self._code_type 2cfv w ?hx y dfef@hffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDf[h~eEfFfGfHfIf]h`eT , - {eafbe|ebfcedeKfLft u MfNfOfPfQfRfSfTfUfVfWfXfYfZf|f

842  

843 @property 

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

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

846 return dict(self._sym_map) 2o `eS * + 7f8f9f{eafbe|ebfJf

847  

848 @property 

849 def handle(self) -> object: 

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

851  

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

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

854  

855 .. caution:: 

856  

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

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

859 """ 

860 self._lazy_load_module() 2/hGe

861 return as_py(self._h_library) 2/hGe

862  

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

864 if not isinstance(other, ObjectCode): 2Ge.h}e;e=e

865 return NotImplemented 2Ge.h

866 # Trigger lazy load for both objects to compare handles 

867 self._lazy_load_module() 2Ge}e;e=e

868 (<ObjectCode>other)._lazy_load_module() 2Ge}e;e=e

869 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2Ge}e;e=e

870  

871 def __hash__(self) -> int: 

872 # Trigger lazy load to get the handle 

873 self._lazy_load_module() 21f2f5f6f;e=e

874 return hash(as_intptr(self._h_library)) 21f2f5f6f;e=e

875  

876 def __repr__(self) -> str: 

877 # Trigger lazy load to get the handle 

878 self._lazy_load_module() 23f4f.d

879 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 23f4f.d