Coverage for cuda / core / _module.pyx: 88.97%
272 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5from __future__ import annotations
7from libc.stddef cimport size_t
9from collections import namedtuple
11from cuda.core._device import Device
12from cuda.core._launch_config cimport LaunchConfig
13from cuda.core._launch_config import LaunchConfig
14from cuda.core._stream cimport Stream
15from cuda.core._resource_handles cimport (
16 LibraryHandle,
17 KernelHandle,
18 create_library_handle_from_file,
19 create_library_handle_from_data,
20 create_kernel_handle,
21 create_kernel_handle_ref,
22 get_kernel_library,
23 get_last_error,
24 as_cu,
25 as_py,
26 as_intptr,
27)
28from cuda.core._stream import Stream
29from cuda.core._utils.clear_error_support import (
30 assert_type_str_or_bytes_like,
31 raise_code_path_meant_to_be_unreachable,
32)
33from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
34from cuda.core._utils.version cimport cy_driver_version
35from cuda.core._utils.cuda_utils import driver
36from cuda.bindings cimport cydriver
38__all__ = ["Kernel", "ObjectCode"]
41cdef class KernelAttributes:
42 """Provides access to kernel attributes."""
44 def __init__(self, *args, **kwargs):
45 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2Zh
47 @staticmethod
48 cdef KernelAttributes _init(KernelHandle h_kernel):
49 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
50 self._h_kernel = h_kernel 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
51 self._cache = {} 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
52 return self 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
54 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1:
55 """Helper function to get a cached attribute or fetch and cache it if not present."""
56 cdef tuple cache_key = (device_id, <int>attribute) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
57 cached = self._cache.get(cache_key, cache_key) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
58 if cached is not cache_key: 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
59 return cached 2'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
60 cdef int result
61 with nogil: 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
62 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
63 self._cache[cache_key] = result 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
64 return result 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
66 cdef inline int _resolve_device_id(self, device_id) except? -1:
67 """Convert Device or int to device_id int."""
68 return Device(device_id).device_id 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
70 def max_threads_per_block(self, device_id: Device | int = None) -> int:
71 """int : The maximum number of threads per block.
72 This attribute is read-only."""
73 return self._get_cached_attribute( 2c m n s a ? x ,e
74 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2c m n s a ? x ,e
75 )
77 def shared_size_bytes(self, device_id: Device | int = None) -> int:
78 """int : The size in bytes of statically-allocated shared memory required by this function.
79 This attribute is read-only."""
80 return self._get_cached_attribute( 2?e
81 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2?e
82 )
84 def const_size_bytes(self, device_id: Device | int = None) -> int:
85 """int : The size in bytes of user-allocated constant memory required by this function.
86 This attribute is read-only."""
87 return self._get_cached_attribute( 2)e
88 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2)e
89 )
91 def local_size_bytes(self, device_id: Device | int = None) -> int:
92 """int : The size in bytes of local memory used by each thread of this function.
93 This attribute is read-only."""
94 return self._get_cached_attribute( 2*e
95 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2*e
96 )
98 def num_regs(self, device_id: Device | int = None) -> int:
99 """int : The number of registers used by each thread of this function.
100 This attribute is read-only."""
101 return self._get_cached_attribute( 2VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b-e
102 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b-e
103 )
105 def ptx_version(self, device_id: Device | int = None) -> int:
106 """int : The PTX virtual architecture version for which the function was compiled.
107 This attribute is read-only."""
108 return self._get_cached_attribute( 2/e
109 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2/e
110 )
112 def binary_version(self, device_id: Device | int = None) -> int:
113 """int : The binary architecture version for which the function was compiled.
114 This attribute is read-only."""
115 return self._get_cached_attribute( 2b 'e
116 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2'e
117 )
119 def cache_mode_ca(self, device_id: Device | int = None) -> bool:
120 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set.
121 This attribute is read-only."""
122 return bool( 28e
123 self._get_cached_attribute( 28e
124 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 28e
125 )
126 )
128 def max_dynamic_shared_size_bytes(self, device_id: Device | int = None) -> int:
129 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used
130 by this function."""
131 return self._get_cached_attribute( 2+e
132 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2+e
133 )
135 def preferred_shared_memory_carveout(self, device_id: Device | int = None) -> int:
136 """int : The shared memory carveout preference, in percent of the total shared memory."""
137 return self._get_cached_attribute( 2.e
138 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2.e
139 )
141 def cluster_size_must_be_set(self, device_id: Device | int = None) -> bool:
142 """bool : The kernel must launch with a valid cluster size specified.
143 This attribute is read-only."""
144 return bool( 29e
145 self._get_cached_attribute( 29e
146 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 29e
147 )
148 )
150 def required_cluster_width(self, device_id: Device | int = None) -> int:
151 """int : The required cluster width in blocks."""
152 return self._get_cached_attribute( 2=e
153 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2=e
154 )
156 def required_cluster_height(self, device_id: Device | int = None) -> int:
157 """int : The required cluster height in blocks."""
158 return self._get_cached_attribute( 2;e
159 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2;e
160 )
162 def required_cluster_depth(self, device_id: Device | int = None) -> int:
163 """int : The required cluster depth in blocks."""
164 return self._get_cached_attribute( 2:e
165 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2:e
166 )
168 def non_portable_cluster_size_allowed(self, device_id: Device | int = None) -> bool:
169 """bool : Whether the function can be launched with non-portable cluster size."""
170 return bool( 2!e
171 self._get_cached_attribute( 2!e
172 self._resolve_device_id(device_id), 2!e
173 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED,
174 )
175 )
177 def cluster_scheduling_policy_preference(self, device_id: Device | int = None) -> int:
178 """int : The block scheduling policy of a function."""
179 return self._get_cached_attribute( 2(e
180 self._resolve_device_id(device_id), 2(e
181 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE,
182 )
185MaxPotentialBlockSizeOccupancyResult = namedtuple("MaxPotential", ("min_grid_size", "max_block_size"))
188cdef class KernelOccupancy:
189 """This class offers methods to query occupancy metrics that help determine optimal
190 launch parameters such as block size, grid size, and shared memory usage.
191 """
193 def __init__(self, *args, **kwargs):
194 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 20h
196 @staticmethod
197 cdef KernelOccupancy _init(KernelHandle h_kernel):
198 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
199 self._h_kernel = h_kernel 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
200 return self 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
202 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int:
203 """Occupancy of the kernel.
205 Returns the maximum number of active blocks per multiprocessor for this kernel.
207 Parameters
208 ----------
209 block_size: int
210 Block size parameter used to launch this kernel.
211 dynamic_shared_memory_size: int
212 The amount of dynamic shared memory in bytes needed by block.
213 Use `0` if block does not need shared memory.
215 Returns
216 -------
217 int
218 The maximum number of active blocks per multiprocessor.
220 Note
221 ----
222 The fraction of the product of maximum number of active blocks per multiprocessor
223 and the block size to the maximum number of threads per multiprocessor is known as
224 theoretical multiprocessor utilization (occupancy).
226 """
227 cdef int num_blocks
228 cdef int c_block_size = block_size 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b
229 cdef size_t c_shmem_size = dynamic_shared_memory_size 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b
230 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b
231 with nogil: 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b
232 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b
233 &num_blocks, func, c_block_size, c_shmem_size
234 ))
235 return num_blocks 2p VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b
237 def max_potential_block_size(
238 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int
239 ) -> MaxPotentialBlockSizeOccupancyResult:
240 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy.
242 Returns the minimum grid size needed to achieve the maximum occupancy and
243 the maximum block size that can achieve the maximum occupancy.
245 Parameters
246 ----------
247 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize]
248 The amount of dynamic shared memory in bytes needed by block.
249 Use `0` if block does not need shared memory. Use C-callable
250 represented by :obj:`~driver.CUoccupancyB2DSize` to encode
251 amount of needed dynamic shared memory which varies depending
252 on tne block size.
253 block_size_limit: int
254 Known upper limit on the kernel block size. Use `0` to indicate
255 the maximum block size permitted by the device / kernel instead
257 Returns
258 -------
259 :obj:`~MaxPotentialBlockSizeOccupancyResult`
260 An object with `min_grid_size` amd `max_block_size` attributes encoding
261 the suggested launch configuration.
263 Note
264 ----
265 Please be advised that use of C-callable that requires Python Global
266 Interpreter Lock may lead to deadlocks.
268 """
269 cdef int min_grid_size, max_block_size
270 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
271 cdef cydriver.CUoccupancyB2DSize callback
272 cdef size_t c_shmem_size
273 cdef int c_block_size_limit = block_size_limit 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
274 if isinstance(dynamic_shared_memory_needed, int): 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
275 c_shmem_size = dynamic_shared_memory_needed 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
276 with nogil: 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
277 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
278 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit
279 ))
280 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
281 # Callback may require GIL, so don't use nogil here
282 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr()
283 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize(
284 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit
285 ))
286 else:
287 raise TypeError( 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
288 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
289 f"got {type(dynamic_shared_memory_needed)}" 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
290 )
291 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2qfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
293 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int:
294 """Dynamic shared memory available per block for given launch configuration.
296 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration.
298 Parameters
299 ----------
300 num_blocks_per_multiprocessor: int
301 Number of blocks to be concurrently executing on a multiprocessor.
302 block_size: int
303 Block size parameter used to launch this kernel.
305 Returns
306 -------
307 int
308 Dynamic shared memory available per block for given launch configuration.
309 """
310 cdef size_t dynamic_smem_size
311 cdef int c_num_blocks = num_blocks_per_multiprocessor 2MfNfOfPfQfRf
312 cdef int c_block_size = block_size 2MfNfOfPfQfRf
313 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2MfNfOfPfQfRf
314 with nogil: 2MfNfOfPfQfRf
315 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2MfNfOfPfQfRf
316 &dynamic_smem_size, func, c_num_blocks, c_block_size
317 ))
318 return dynamic_smem_size 2MfNfOfPfQfRf
320 def max_potential_cluster_size(self, config: LaunchConfig, stream: Stream | None = None) -> int:
321 """Maximum potential cluster size.
323 The maximum potential cluster size for this kernel and given launch configuration.
325 Parameters
326 ----------
327 config: :obj:`~_launch_config.LaunchConfig`
328 Kernel launch configuration. Cluster dimensions in the configuration are ignored.
329 stream: :obj:`~Stream`, optional
330 The stream on which this kernel is to be launched.
332 Returns
333 -------
334 int
335 The maximum cluster size that can be launched for this kernel and launch configuration.
336 """
337 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
338 cdef Stream s
339 if stream is not None:
340 s = <Stream>stream
341 drv_cfg.hStream = as_cu(s._h_stream)
342 cdef int cluster_size
343 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
344 with nogil:
345 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg))
346 return cluster_size
348 def max_active_clusters(self, config: LaunchConfig, stream: Stream | None = None) -> int:
349 """Maximum number of active clusters on the target device.
351 The maximum number of clusters that could concurrently execute on the target device.
353 Parameters
354 ----------
355 config: :obj:`~_launch_config.LaunchConfig`
356 Kernel launch configuration.
357 stream: :obj:`~Stream`, optional
358 The stream on which this kernel is to be launched.
360 Returns
361 -------
362 int
363 The maximum number of clusters that could co-exist on the target device.
364 """
365 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
366 cdef Stream s
367 if stream is not None:
368 s = <Stream>stream
369 drv_cfg.hStream = as_cu(s._h_stream)
370 cdef int num_clusters
371 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
372 with nogil:
373 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg))
374 return num_clusters
377ParamInfo = namedtuple("ParamInfo", ["offset", "size"])
380cdef class Kernel:
381 """Represent a compiled kernel that had been loaded onto the device.
383 Kernel instances can execution when passed directly into the
384 :func:`~launch` function.
386 Directly creating a :obj:`~_module.Kernel` is not supported, and they
387 should instead be created through a :obj:`~_module.ObjectCode` object.
389 """
391 def __init__(self, *args, **kwargs):
392 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 21h
394 @staticmethod
395 cdef Kernel _from_handle(KernelHandle h_kernel):
396 cdef Kernel ker = Kernel.__new__(Kernel) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e
397 ker._h_kernel = h_kernel 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e
398 ker._attributes = None 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e
399 ker._occupancy = None 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e
400 return ker 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@bKh[b]bLh^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcs 0ca @e1c? 2cx 3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e
402 @property
403 def attributes(self) -> KernelAttributes:
404 """Get the read-only attributes of this kernel."""
405 if self._attributes is None: 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
406 self._attributes = KernelAttributes._init(self._h_kernel) 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
407 return self._attributes 2c m n s a ? x VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b'e8e(e9e)e*e+e,e!e-e.e/e:e;e=e?e
409 cdef tuple _get_arguments_info(self, bint param_info=False):
410 if cy_driver_version() < (12, 4, 0): 2d t q e f g h r i j k l [e
411 raise NotImplementedError(
412 "Driver version 12.4 or newer is required for this function. "
413 f"Using driver version {'.'.join(map(str, cy_driver_version()))}"
414 )
415 cdef size_t arg_pos = 0 2d t q e f g h r i j k l [e
416 cdef list param_info_data = [] 2d t q e f g h r i j k l [e
417 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2d t q e f g h r i j k l [e
418 cdef size_t param_offset, param_size
419 cdef cydriver.CUresult err
420 while True: 2d t q e f g h r i j k l [e
421 with nogil: 2d t q e f g h r i j k l [e
422 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2d t q e f g h r i j k l [e
423 if err != cydriver.CUDA_SUCCESS: 2d t q e f g h r i j k l [e
424 break 2d t q e f g h r i j k l [e
425 if param_info: 2d e f g h i j k l [e
426 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2e f g h i j k l [e
427 arg_pos = arg_pos + 1 2d e f g h i j k l [e
428 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2d t q e f g h r i j k l [e
429 HANDLE_RETURN(err) 1t
430 return arg_pos, param_info_data 2d q e f g h r i j k l [e
432 @property
433 def num_arguments(self) -> int:
434 """int : The number of arguments of this function"""
435 num_args, _ = self._get_arguments_info() 2d t q e f g h r i j k l [e
436 return num_args 2d q e f g h r i j k l [e
438 @property
439 def arguments_info(self) -> list[ParamInfo]:
440 """list[ParamInfo]: (offset, size) for each argument of this function"""
441 _, param_info = self._get_arguments_info(param_info=True) 2q e f g h r i j k l [e
442 return param_info 2q e f g h r i j k l [e
444 @property
445 def occupancy(self) -> KernelOccupancy:
446 """Get the occupancy information for launching this kernel."""
447 if self._occupancy is None: 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
448 self._occupancy = KernelOccupancy._init(self._h_kernel) 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
449 return self._occupancy 2p MfNfOfPfQfRfVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKf
451 @property
452 def handle(self):
453 """Return the underlying kernel handle object.
455 .. caution::
457 This handle is a Python object. To get the memory address of the underlying C
458 handle, call ``int(Kernel.handle)``.
459 """
460 return as_py(self._h_kernel) 2c 2ha @e? x d u o
462 @property
463 def _handle(self):
464 return self.handle
466 @staticmethod
467 def from_handle(handle, mod: ObjectCode = None) -> Kernel:
468 """Creates a new :obj:`Kernel` object from a kernel handle.
470 Parameters
471 ----------
472 handle : int
473 Kernel handle representing the address of a foreign
474 kernel object (CUkernel).
475 mod : :obj:`ObjectCode`, optional
476 The ObjectCode object associated with this kernel. Provides
477 library lifetime for foreign kernels not created by
478 cuda.core.
479 """
481 if not isinstance(handle, int): 2c s a @e? PhQhRhShThUhVhWhXhYhx o
482 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2PhQhRhShThUhVhWhXhYh
484 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2c s a @e? x o
485 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2c s a @e? x o
486 if not h_kernel: 2c s a @e? x o
487 HANDLE_RETURN(get_last_error())
489 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2c s a @e? x o
490 cdef LibraryHandle h_caller_lib
492 if mod is not None: 2c s a @e? x o
493 h_caller_lib = (<ObjectCode>mod)._h_library 2a @ex
494 if h_existing_lib and h_caller_lib: 2a @ex
495 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a @ex
496 import warnings 1a
497 warnings.warn( 1a
498 "The library from the provided ObjectCode does not match "
499 "the library associated with this kernel.",
500 stacklevel=2,
501 )
503 cdef Kernel k = Kernel._from_handle(h_kernel) 2c s a @e? x o
504 if mod is not None and not h_existing_lib: 2c s a @e? x o
505 k._keepalive = mod
506 return k 2c s a @e? x o
508 def __eq__(self, other) -> bool:
509 if not isinstance(other, Kernel): 2KhLhu o A B C D E F G H I J K L M N O P Q R S T U V w W X y z
510 return NotImplemented 1uABCDEFGHIJKLMNOPQRSTUVwW
511 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2KhLhu o X y z
513 def __hash__(self) -> int:
514 return hash(as_intptr(self._h_kernel)) 1oYZ0123456789!#$%'()*+,-v./;=yz
516 def __repr__(self) -> str:
517 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1:
520CodeTypeT = bytes | bytearray | str
522cdef tuple _supported_code_type = ("cubin", "ptx", "ltoir", "fatbin", "object", "library")
524cdef class ObjectCode:
525 """Represent a compiled program to be loaded onto the device.
527 This object provides a unified interface for different types of
528 compiled programs that will be loaded onto the device.
530 Note
531 ----
532 This class has no default constructor. If you already have a cubin that you would
533 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
534 from all other possible code types should be avoided in favor of compilation through
535 :class:`~cuda.core.Program`
536 """
538 def __init__(self, *args, **kwargs):
539 raise RuntimeError( 23h
540 "ObjectCode objects cannot be instantiated directly. "
541 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
542 )
544 @classmethod
545 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict | None = None):
546 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
547 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
549 # _h_library is assigned during _lazy_load_module
550 self._h_library = LibraryHandle() # Empty handle 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
552 self._code_type = code_type 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
553 self._module = module 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
554 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
555 self._name = name if name else "" 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
557 return self 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcVfSgWfTgUgXfVgYfWgZfXg0fYg1fZg2f0g3f1g4f2g5f3g6f4g7f5g8f6g9f7g!f8g#f9g$f!g%f#g'f$g(f%g)f'g*f(g+f)g,f*g-f+g,g.f-g.gSf/g/f:g:f;g=gs 0ca 1c2c3cd Lf4ct q e f g h r i j k l 5c| 6c} 7c~ }fab~fTf?g3e@gUfNg;fOg8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~dagaebecedeeefegeheiejeB kebgleC mecgneoepeD qedgreseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeegHeIefgfbgghgigjgkglgmgngogw gbpgqgrgsgtgJeKeLeW MeugvgwgNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e[g1ecb2e]gxgyg^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhUbzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|fJh
559 @staticmethod
560 def _reduce_helper(module, code_type, name, symbol_mapping):
561 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2Lfvgwg
563 def __reduce__(self):
564 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2Lfvgwg
566 @staticmethod
567 def from_cubin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
568 """Create an :class:`ObjectCode` instance from an existing cubin.
570 Parameters
571 ----------
572 module : Union[bytes, str]
573 Either a bytes object containing the in-memory cubin to load, or
574 a file path string pointing to the on-disk cubin to load.
575 name : Optional[str]
576 A human-readable identifier representing this code object.
577 symbol_mapping : Optional[dict]
578 A dictionary specifying how the unmangled symbol names (as keys)
579 should be mapped to the mangled names before trying to retrieve
580 them (default to no mappings).
581 """
582 return ObjectCode._init(module, "cubin", name=name, symbol_mapping=symbol_mapping) 1|}
584 @staticmethod
585 def from_ptx(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
586 """Create an :class:`ObjectCode` instance from an existing PTX.
588 Parameters
589 ----------
590 module : Union[bytes, str]
591 Either a bytes object containing the in-memory ptx code to load, or
592 a file path string pointing to the on-disk ptx file to load.
593 name : Optional[str]
594 A human-readable identifier representing this code object.
595 symbol_mapping : Optional[dict]
596 A dictionary specifying how the unmangled symbol names (as keys)
597 should be mapped to the mangled names before trying to retrieve
598 them (default to no mappings).
599 """
600 return ObjectCode._init(module, "ptx", name=name, symbol_mapping=symbol_mapping) 2SfUf;f
602 @staticmethod
603 def from_ltoir(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
604 """Create an :class:`ObjectCode` instance from an existing LTOIR.
606 Parameters
607 ----------
608 module : Union[bytes, str]
609 Either a bytes object containing the in-memory ltoir code to load, or
610 a file path string pointing to the on-disk ltoir file to load.
611 name : Optional[str]
612 A human-readable identifier representing this code object.
613 symbol_mapping : Optional[dict]
614 A dictionary specifying how the unmangled symbol names (as keys)
615 should be mapped to the mangled names before trying to retrieve
616 them (default to no mappings).
617 """
618 return ObjectCode._init(module, "ltoir", name=name, symbol_mapping=symbol_mapping) 2Tf3e
620 @staticmethod
621 def from_fatbin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
622 """Create an :class:`ObjectCode` instance from an existing fatbin.
624 Parameters
625 ----------
626 module : Union[bytes, str]
627 Either a bytes object containing the in-memory fatbin to load, or
628 a file path string pointing to the on-disk fatbin to load.
629 name : Optional[str]
630 A human-readable identifier representing this code object.
631 symbol_mapping : Optional[dict]
632 A dictionary specifying how the unmangled symbol names (as keys)
633 should be mapped to the mangled names before trying to retrieve
634 them (default to no mappings).
635 """
636 return ObjectCode._init(module, "fatbin", name=name, symbol_mapping=symbol_mapping) 2~ ab
638 @staticmethod
639 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
640 """Create an :class:`ObjectCode` instance from an existing object code.
642 Parameters
643 ----------
644 module : Union[bytes, str]
645 Either a bytes object containing the in-memory object code to load, or
646 a file path string pointing to the on-disk object code to load.
647 name : Optional[str]
648 A human-readable identifier representing this code object.
649 symbol_mapping : Optional[dict]
650 A dictionary specifying how the unmangled symbol names (as keys)
651 should be mapped to the mangled names before trying to retrieve
652 them (default to no mappings).
653 """
654 return ObjectCode._init(module, "object", name=name, symbol_mapping=symbol_mapping)
656 @staticmethod
657 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
658 """Create an :class:`ObjectCode` instance from an existing library.
660 Parameters
661 ----------
662 module : Union[bytes, str]
663 Either a bytes object containing the in-memory library to load, or
664 a file path string pointing to the on-disk library to load.
665 name : Optional[str]
666 A human-readable identifier representing this code object.
667 symbol_mapping : Optional[dict]
668 A dictionary specifying how the unmangled symbol names (as keys)
669 should be mapped to the mangled names before trying to retrieve
670 them (default to no mappings).
671 """
672 return ObjectCode._init(module, "library", name=name, symbol_mapping=symbol_mapping)
674 # TODO: do we want to unload in a finalizer? Probably not..
676 cdef int _lazy_load_module(self) except -1:
677 if self._h_library: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l Mh5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
678 return 0 2hbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbMh4e#ev $e%e5e6eUb
679 module = self._module 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
680 assert_type_str_or_bytes_like(module) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
681 cdef bytes path_bytes
682 if isinstance(module, str): 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
683 path_bytes = module.encode() 1|~
684 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 1|~
685 if not self._h_library: 1|~
686 HANDLE_RETURN(get_last_error())
687 return 0 1|~
688 if isinstance(module, (bytes, bytearray)): 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
689 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
690 if not self._h_library: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
691 HANDLE_RETURN(get_last_error())
692 return 0 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c6c} 7cab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ld4eo MdY Nd#eOdPdQdZ Rd]eSdTdUdVdWdXdYdZd0d1d0 2d^e3d1 4d_e5d6d7d2 8d`e9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d{e=d?d|edb}e~eafbfcfdfefffgfv ebhfifjfkflf@d[d]d. ^dmf_d/ `dnf{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OeofpfPeX Qe7eRe; Se$eTe= Ue%eVey We5eXez Ye6eZebb0e1ecb2eUb
693 raise_code_path_meant_to_be_unreachable()
694 return -1
696 def get_kernel(self, name) -> Kernel:
697 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
699 Parameters
700 ----------
701 name : str | bytes
702 Name of the kernel to retrieve.
704 Returns
705 -------
706 :obj:`~_module.Kernel`
707 Newly created kernel object.
709 """
710 self._lazy_load_module() 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
711 supported_code_types = ("cubin", "ptx", "fatbin") 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
712 if self._code_type not in supported_code_types: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab3e8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
713 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 23e
714 try: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
715 name = self._sym_map[name] 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
716 except KeyError: 2@ [ ] ^ _ ` p { d u o Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - v . / A B C D E F G H I J K L M N O P Q R S T U V w W : X ; = y z bbcbUb
717 if isinstance(name, str): 2@ [ ] ^ _ ` p { d u o Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - v . / A B C D E F G H I J K L M N O P Q R S T U V w W : X ; = y z bbcbUb
718 name = name.encode() 2@ [ ] ^ _ ` p { d u o Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - v . / A B C D E F G H I J K L M N O P Q R S T U V w W : X ; = y z bbcbUb
720 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
721 if not h_kernel: 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2eUb
722 HANDLE_RETURN(get_last_error()) 2Ub
723 return Kernel._from_handle(h_kernel) 2%b'b(b)b*b+bhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEb,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcc m n icjckcFbGbHbIbJbKbLbMbNbObPbQbRbSblcmcncocpcqcrcsctcucvcTb@ [ ] ^ _ ` p { wcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0ca 1c2c3cd 4ct q e f g h r i j k l 5c| 6c} 7c~ ab8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdu Ldo MdY NdOdPdQdZ RdSdTdUdVdWdXdYdZd0d1d0 2d3d1 4d5d6d7d2 8d9d!d#d3 4 5 6 7 8 9 ! # $ % ' ( ) * + , $d%d'd(d)d*d+d,d-d.d/d:d- ;d=d?ddbv eb@d[d]d. ^d_d/ `d{d|d}dA ~daebecedeeefegeheiejeB keleC meneoepeD qereseteE F G H I J K L M N O P Q R S T U uevewexeyezeAeBeCeDeEeFeV GeHeIefbw gbJeKeLeW MeNe: OePeX QeRe; SeTe= UeVey WeXez YeZebb0e1ecb2e
725 @property
726 def code(self) -> CodeTypeT:
727 """Return the underlying code object."""
728 return self._module 2VfWfNhXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.fOhSf/f:fs Lf| } ~ }fab~fTf3eUfNg;fOgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMg4h=f?f@f[f]f^f_f`f{f|f
730 @property
731 def name(self) -> str:
732 """Return a human-readable name of this code object."""
733 return self._name 2VfWfNhXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.fOhSf/f:fxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgPgQgRg=f?f@f[f]f^f_f`f{f|f
735 @property
736 def code_type(self) -> str:
737 """Return the type of the underlying code object."""
738 return self._code_type 2VfWfNhXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.fOhSf/f:fLf~ abTf3eUf=f?f@f[f]f^f_f`f{f|f
740 @property
741 def symbol_mapping(self) -> dict:
742 """Return a copy of the symbol mapping dictionary."""
743 return dict(self._sym_map) 2s Lf| } }f~fTf3eUf;f
745 @property
746 def handle(self):
747 """Return the underlying handle object.
749 .. caution::
751 This handle is a Python object. To get the memory address of the underlying C
752 handle, call ``int(ObjectCode.handle)``.
753 """
754 self._lazy_load_module() 2Mh4e
755 return as_py(self._h_library) 2Mh4e
757 def __eq__(self, other) -> bool:
758 if not isinstance(other, ObjectCode): 24eagbgcgdgegfgfbgghgigjgkglgmgngogw gbpgqgrgsgtgug7e5e6e
759 return NotImplemented 24eagbgcgdgegfgfbgghgigjgkglgmgngogw gbpgqgrgsgtgug
760 # Trigger lazy load for both objects to compare handles
761 self._lazy_load_module() 24e7e5e6e
762 (<ObjectCode>other)._lazy_load_module() 24e7e5e6e
763 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 24e7e5e6e
765 def __hash__(self) -> int:
766 # Trigger lazy load to get the handle
767 self._lazy_load_module() 2#e]e^e_e`e{e|edb}e~eafbfcfdfefffgfv ebhfifjfkflfmfnf$e%e5e6e
768 return hash(as_intptr(self._h_library)) 2#e]e^e_e`e{e|edb}e~eafbfcfdfefffgfv ebhfifjfkflfmfnf$e%e5e6e
770 def __repr__(self) -> str:
771 # Trigger lazy load to get the handle
772 self._lazy_load_module() 2ofpfUb
773 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2ofpfUb