Coverage for cuda / core / _module.pyx: 85.62%
320 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 01:07 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 01:07 +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
9import functools
10import threading
11from collections import namedtuple
13from cuda.core._device import Device
14from cuda.core._launch_config cimport LaunchConfig
15from cuda.core._launch_config import LaunchConfig
16from cuda.core._stream cimport Stream
17from cuda.core._resource_handles cimport (
18 LibraryHandle,
19 KernelHandle,
20 create_library_handle_from_file,
21 create_library_handle_from_data,
22 create_kernel_handle,
23 create_kernel_handle_ref,
24 get_kernel_library,
25 get_last_error,
26 as_cu,
27 as_py,
28 as_intptr,
29)
30from cuda.core._stream import Stream
31from cuda.core._utils.clear_error_support import (
32 assert_type_str_or_bytes_like,
33 raise_code_path_meant_to_be_unreachable,
34)
35from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
36from cuda.core._utils.cuda_utils import driver, get_binding_version
37from cuda.bindings cimport cydriver
39__all__ = ["Kernel", "ObjectCode"]
41# Lazy initialization state and synchronization
42# For Python 3.13t (free-threaded builds), we use a lock to ensure thread-safe initialization.
43# For regular Python builds with GIL, the lock overhead is minimal and the code remains safe.
44cdef object _init_lock = threading.Lock()
45cdef bint _inited = False
46cdef int _py_major_ver = 0
47cdef int _py_minor_ver = 0
48cdef int _driver_ver = 0
49cdef tuple _kernel_ctypes = None
50cdef bint _paraminfo_supported = False
53cdef int _lazy_init() except -1:
54 """
55 Initialize module-level state in a thread-safe manner.
57 This function is thread-safe and suitable for both:
58 - Regular Python builds (with GIL)
59 - Python 3.13t free-threaded builds (without GIL)
61 Uses double-checked locking pattern for performance:
62 - Fast path: check without lock if already initialized
63 - Slow path: acquire lock and initialize if needed
64 """
65 global _inited
66 # Fast path: already initialized (no lock needed for read)
67 if _inited: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tc{ ucy vcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdZeddSeed0efdTegd1ehd2eid3ejd4ekdUeld5emd6end7eod8epd9eqd!erd#esdVetdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
68 return 0 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tc{ ucy vcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdZeddSeed0efdTegd1ehd2eid3ejd4ekdUeld5emd6end7eod8epd9eqd!erd#esdVetdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
70 cdef int drv_ver
71 # Slow path: acquire lock and initialize
72 with _init_lock: 1t
73 # Double-check: another thread might have initialized while we waited
74 if _inited: 1t
75 return 0
77 global _py_major_ver, _py_minor_ver, _driver_ver, _kernel_ctypes, _paraminfo_supported
78 # binding availability depends on cuda-python version
79 _py_major_ver, _py_minor_ver = get_binding_version() 1t
80 _kernel_ctypes = (driver.CUkernel,) 1t
81 with nogil: 1t
82 HANDLE_RETURN(cydriver.cuDriverGetVersion(&drv_ver)) 1t
83 _driver_ver = drv_ver 1t
84 _paraminfo_supported = _driver_ver >= 12040 1t
86 # Mark as initialized (must be last to ensure all state is set)
87 _inited = True 1t
89 return 0 1t
92# Auto-initializing accessors (cdef for internal use)
93cdef inline int _get_py_major_ver() except -1:
94 """Get the Python binding major version, initializing if needed."""
95 _lazy_init()
96 return _py_major_ver
99cdef inline int _get_py_minor_ver() except -1:
100 """Get the Python binding minor version, initializing if needed."""
101 _lazy_init()
102 return _py_minor_ver
105cdef inline int _get_driver_ver() except -1:
106 """Get the CUDA driver version, initializing if needed."""
107 _lazy_init()
108 return _driver_ver
111cdef inline tuple _get_kernel_ctypes():
112 """Get the kernel ctypes tuple, initializing if needed."""
113 _lazy_init()
114 return _kernel_ctypes
117cdef inline bint _is_paraminfo_supported() except -1:
118 """Return True if cuKernelGetParamInfo is available (driver >= 12.4)."""
119 _lazy_init() 2d s o e f g h p i j k l Ve
120 return _paraminfo_supported 2d s o e f g h p i j k l Ve
123@functools.cache
124def _is_cukernel_get_library_supported() -> bool:
125 """Return True when cuKernelGetLibrary is available for inverse kernel-to-library lookup.
127 Requires cuda-python bindings >= 12.5 and driver >= 12.5.
128 """
129 return (
130 (_get_py_major_ver(), _get_py_minor_ver()) >= (12, 5)
131 and _get_driver_ver() >= 12050
132 and hasattr(driver, "cuKernelGetLibrary")
133 )
136cdef inline LibraryHandle _make_empty_library_handle():
137 """Create an empty LibraryHandle to indicate no library loaded."""
138 return LibraryHandle() # Empty shared_ptr
141cdef class KernelAttributes:
142 """Provides access to kernel attributes."""
144 def __init__(self, *args, **kwargs):
145 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2Dh
147 @staticmethod
148 cdef KernelAttributes _init(KernelHandle h_kernel):
149 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
150 self._h_kernel = h_kernel 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
151 self._cache = {} 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
152 _lazy_init() 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
153 return self 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
155 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1:
156 """Helper function to get a cached attribute or fetch and cache it if not present."""
157 cdef tuple cache_key = (device_id, <int>attribute) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
158 cached = self._cache.get(cache_key, cache_key) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
159 if cached is not cache_key: 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
160 return cached 2ZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
161 cdef int result
162 with nogil: 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
163 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
164 self._cache[cache_key] = result 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
165 return result 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
167 cdef inline int _resolve_device_id(self, device_id) except? -1:
168 """Convert Device or int to device_id int."""
169 return Device(device_id).device_id 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
171 def max_threads_per_block(self, device_id: Device | int = None) -> int:
172 """int : The maximum number of threads per block.
173 This attribute is read-only."""
174 return self._get_cached_attribute( 2c m n u b { y 4e
175 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2c m n u b { y 4e
176 )
178 def shared_size_bytes(self, device_id: Device | int = None) -> int:
179 """int : The size in bytes of statically-allocated shared memory required by this function.
180 This attribute is read-only."""
181 return self._get_cached_attribute( 2#e
182 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2#e
183 )
185 def const_size_bytes(self, device_id: Device | int = None) -> int:
186 """int : The size in bytes of user-allocated constant memory required by this function.
187 This attribute is read-only."""
188 return self._get_cached_attribute( 21e
189 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 21e
190 )
192 def local_size_bytes(self, device_id: Device | int = None) -> int:
193 """int : The size in bytes of local memory used by each thread of this function.
194 This attribute is read-only."""
195 return self._get_cached_attribute( 22e
196 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 22e
197 )
199 def num_regs(self, device_id: Device | int = None) -> int:
200 """int : The number of registers used by each thread of this function.
201 This attribute is read-only."""
202 return self._get_cached_attribute( 2GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c5e
203 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c5e
204 )
206 def ptx_version(self, device_id: Device | int = None) -> int:
207 """int : The PTX virtual architecture version for which the function was compiled.
208 This attribute is read-only."""
209 return self._get_cached_attribute( 27e
210 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 27e
211 )
213 def binary_version(self, device_id: Device | int = None) -> int:
214 """int : The binary architecture version for which the function was compiled.
215 This attribute is read-only."""
216 return self._get_cached_attribute( 2Ze
217 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2Ze
218 )
220 def cache_mode_ca(self, device_id: Device | int = None) -> bool:
221 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set.
222 This attribute is read-only."""
223 return bool( 2Se
224 self._get_cached_attribute( 2Se
225 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2Se
226 )
227 )
229 def max_dynamic_shared_size_bytes(self, device_id: Device | int = None) -> int:
230 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used
231 by this function."""
232 return self._get_cached_attribute( 23e
233 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 23e
234 )
236 def preferred_shared_memory_carveout(self, device_id: Device | int = None) -> int:
237 """int : The shared memory carveout preference, in percent of the total shared memory."""
238 return self._get_cached_attribute( 26e
239 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 26e
240 )
242 def cluster_size_must_be_set(self, device_id: Device | int = None) -> bool:
243 """bool : The kernel must launch with a valid cluster size specified.
244 This attribute is read-only."""
245 return bool( 2Te
246 self._get_cached_attribute( 2Te
247 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2Te
248 )
249 )
251 def required_cluster_width(self, device_id: Device | int = None) -> int:
252 """int : The required cluster width in blocks."""
253 return self._get_cached_attribute( 2!e
254 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2!e
255 )
257 def required_cluster_height(self, device_id: Device | int = None) -> int:
258 """int : The required cluster height in blocks."""
259 return self._get_cached_attribute( 29e
260 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 29e
261 )
263 def required_cluster_depth(self, device_id: Device | int = None) -> int:
264 """int : The required cluster depth in blocks."""
265 return self._get_cached_attribute( 28e
266 self._resolve_device_id(device_id), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 28e
267 )
269 def non_portable_cluster_size_allowed(self, device_id: Device | int = None) -> bool:
270 """bool : Whether the function can be launched with non-portable cluster size."""
271 return bool( 2Ue
272 self._get_cached_attribute( 2Ue
273 self._resolve_device_id(device_id), 2Ue
274 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED,
275 )
276 )
278 def cluster_scheduling_policy_preference(self, device_id: Device | int = None) -> int:
279 """int : The block scheduling policy of a function."""
280 return self._get_cached_attribute( 20e
281 self._resolve_device_id(device_id), 20e
282 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE,
283 )
286MaxPotentialBlockSizeOccupancyResult = namedtuple("MaxPotential", ("min_grid_size", "max_block_size"))
289cdef class KernelOccupancy:
290 """This class offers methods to query occupancy metrics that help determine optimal
291 launch parameters such as block size, grid size, and shared memory usage.
292 """
294 def __init__(self, *args, **kwargs):
295 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 2Eh
297 @staticmethod
298 cdef KernelOccupancy _init(KernelHandle h_kernel):
299 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
300 self._h_kernel = h_kernel 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
301 return self 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
303 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int:
304 """Occupancy of the kernel.
306 Returns the maximum number of active blocks per multiprocessor for this kernel.
308 Parameters
309 ----------
310 block_size: int
311 Block size parameter used to launch this kernel.
312 dynamic_shared_memory_size: int
313 The amount of dynamic shared memory in bytes needed by block.
314 Use `0` if block does not need shared memory.
316 Returns
317 -------
318 int
319 The maximum number of active blocks per multiprocessor.
321 Note
322 ----
323 The fraction of the product of maximum number of active blocks per multiprocessor
324 and the block size to the maximum number of threads per multiprocessor is known as
325 theoretical multiprocessor utilization (occupancy).
327 """
328 cdef int num_blocks
329 cdef int c_block_size = block_size 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c
330 cdef size_t c_shmem_size = dynamic_shared_memory_size 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c
331 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c
332 with nogil: 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c
333 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c
334 &num_blocks, func, c_block_size, c_shmem_size
335 ))
336 return num_blocks 2r GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'c
338 def max_potential_block_size(
339 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int
340 ) -> MaxPotentialBlockSizeOccupancyResult:
341 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy.
343 Returns the minimum grid size needed to achieve the maximum occupancy and
344 the maximum block size that can achieve the maximum occupancy.
346 Parameters
347 ----------
348 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize]
349 The amount of dynamic shared memory in bytes needed by block.
350 Use `0` if block does not need shared memory. Use C-callable
351 represented by :obj:`~driver.CUoccupancyB2DSize` to encode
352 amount of needed dynamic shared memory which varies depending
353 on tne block size.
354 block_size_limit: int
355 Known upper limit on the kernel block size. Use `0` to indicate
356 the maximum block size permitted by the device / kernel instead
358 Returns
359 -------
360 :obj:`~MaxPotentialBlockSizeOccupancyResult`
361 An object with `min_grid_size` amd `max_block_size` attributes encoding
362 the suggested launch configuration.
364 Note
365 ----
366 Please be advised that use of C-callable that requires Python Global
367 Interpreter Lock may lead to deadlocks.
369 """
370 cdef int min_grid_size, max_block_size
371 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
372 cdef cydriver.CUoccupancyB2DSize callback
373 cdef size_t c_shmem_size
374 cdef int c_block_size_limit = block_size_limit 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
375 if isinstance(dynamic_shared_memory_needed, int): 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
376 c_shmem_size = dynamic_shared_memory_needed 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
377 with nogil: 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
378 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
379 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit
380 ))
381 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
382 # Callback may require GIL, so don't use nogil here
383 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr()
384 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize(
385 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit
386 ))
387 else:
388 raise TypeError( 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
389 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
390 f"got {type(dynamic_shared_memory_needed)}" 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
391 )
392 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2afbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
394 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int:
395 """Dynamic shared memory available per block for given launch configuration.
397 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration.
399 Parameters
400 ----------
401 num_blocks_per_multiprocessor: int
402 Number of blocks to be concurrently executing on a multiprocessor.
403 block_size: int
404 Block size parameter used to launch this kernel.
406 Returns
407 -------
408 int
409 Dynamic shared memory available per block for given launch configuration.
410 """
411 cdef size_t dynamic_smem_size
412 cdef int c_num_blocks = num_blocks_per_multiprocessor 2tgugvgwgxgyg
413 cdef int c_block_size = block_size 2tgugvgwgxgyg
414 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2tgugvgwgxgyg
415 with nogil: 2tgugvgwgxgyg
416 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2tgugvgwgxgyg
417 &dynamic_smem_size, func, c_num_blocks, c_block_size
418 ))
419 return dynamic_smem_size 2tgugvgwgxgyg
421 def max_potential_cluster_size(self, config: LaunchConfig, stream: Stream | None = None) -> int:
422 """Maximum potential cluster size.
424 The maximum potential cluster size for this kernel and given launch configuration.
426 Parameters
427 ----------
428 config: :obj:`~_launch_config.LaunchConfig`
429 Kernel launch configuration. Cluster dimensions in the configuration are ignored.
430 stream: :obj:`~Stream`, optional
431 The stream on which this kernel is to be launched.
433 Returns
434 -------
435 int
436 The maximum cluster size that can be launched for this kernel and launch configuration.
437 """
438 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
439 cdef Stream s
440 if stream is not None:
441 s = <Stream>stream
442 drv_cfg.hStream = as_cu(s._h_stream)
443 cdef int cluster_size
444 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
445 with nogil:
446 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg))
447 return cluster_size
449 def max_active_clusters(self, config: LaunchConfig, stream: Stream | None = None) -> int:
450 """Maximum number of active clusters on the target device.
452 The maximum number of clusters that could concurrently execute on the target device.
454 Parameters
455 ----------
456 config: :obj:`~_launch_config.LaunchConfig`
457 Kernel launch configuration.
458 stream: :obj:`~Stream`, optional
459 The stream on which this kernel is to be launched.
461 Returns
462 -------
463 int
464 The maximum number of clusters that could co-exist on the target device.
465 """
466 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
467 cdef Stream s
468 if stream is not None:
469 s = <Stream>stream
470 drv_cfg.hStream = as_cu(s._h_stream)
471 cdef int num_clusters
472 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
473 with nogil:
474 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg))
475 return num_clusters
478ParamInfo = namedtuple("ParamInfo", ["offset", "size"])
481cdef class Kernel:
482 """Represent a compiled kernel that had been loaded onto the device.
484 Kernel instances can execution when passed directly into the
485 :func:`~launch` function.
487 Directly creating a :obj:`~_module.Kernel` is not supported, and they
488 should instead be created through a :obj:`~_module.ObjectCode` object.
490 """
492 def __init__(self, *args, **kwargs):
493 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 2Fh
495 @staticmethod
496 cdef Kernel _from_handle(KernelHandle h_kernel):
497 cdef Kernel ker = Kernel.__new__(Kernel) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe
498 ker._h_kernel = h_kernel 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe
499 ker._attributes = None 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe
500 ker._occupancy = None 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe
501 return ker 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5bph6b7bqh8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcu scb ~etc{ ucy vcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe
503 @property
504 def attributes(self) -> KernelAttributes:
505 """Get the read-only attributes of this kernel."""
506 if self._attributes is None: 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
507 self._attributes = KernelAttributes._init(self._h_kernel) 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
508 return self._attributes 2c m n u b { y GcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cZeSe0eTe1e2e3e4eUe5e6e7e8e9e!e#e
510 cdef tuple _get_arguments_info(self, bint param_info=False):
511 if not _is_paraminfo_supported(): 2d s o e f g h p i j k l Ve
512 driver_ver = _get_driver_ver()
513 raise NotImplementedError(
514 "Driver version 12.4 or newer is required for this function. "
515 f"Using driver version {driver_ver // 1000}.{(driver_ver % 1000) // 10}"
516 )
517 cdef size_t arg_pos = 0 2d s o e f g h p i j k l Ve
518 cdef list param_info_data = [] 2d s o e f g h p i j k l Ve
519 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2d s o e f g h p i j k l Ve
520 cdef size_t param_offset, param_size
521 cdef cydriver.CUresult err
522 while True: 2d s o e f g h p i j k l Ve
523 with nogil: 2d s o e f g h p i j k l Ve
524 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2d s o e f g h p i j k l Ve
525 if err != cydriver.CUDA_SUCCESS: 2d s o e f g h p i j k l Ve
526 break 2d s o e f g h p i j k l Ve
527 if param_info: 2d e f g h i j k l Ve
528 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2e f g h i j k l Ve
529 arg_pos = arg_pos + 1 2d e f g h i j k l Ve
530 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2d s o e f g h p i j k l Ve
531 HANDLE_RETURN(err) 1s
532 return arg_pos, param_info_data 2d o e f g h p i j k l Ve
534 @property
535 def num_arguments(self) -> int:
536 """int : The number of arguments of this function"""
537 num_args, _ = self._get_arguments_info() 2d s o e f g h p i j k l Ve
538 return num_args 2d o e f g h p i j k l Ve
540 @property
541 def arguments_info(self) -> list[ParamInfo]:
542 """list[ParamInfo]: (offset, size) for each argument of this function"""
543 _, param_info = self._get_arguments_info(param_info=True) 2o e f g h p i j k l Ve
544 return param_info 2o e f g h p i j k l Ve
546 @property
547 def occupancy(self) -> KernelOccupancy:
548 """Get the occupancy information for launching this kernel."""
549 if self._occupancy is None: 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
550 self._occupancy = KernelOccupancy._init(self._h_kernel) 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
551 return self._occupancy 2r tgugvgwgxgygGcIcKcMcOcQcScUcWcYc0c2c4c6c8c!c$c'cafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfuf
553 @property
554 def handle(self):
555 """Return the underlying kernel handle object.
557 .. caution::
559 This handle is a Python object. To get the memory address of the underlying C
560 handle, call ``int(Kernel.handle)``.
561 """
562 return as_py(self._h_kernel) 2c Ghb ~e{ y d v q
564 @property
565 def _handle(self):
566 return self.handle
568 @staticmethod
569 def from_handle(handle, mod: ObjectCode = None) -> Kernel:
570 """Creates a new :obj:`Kernel` object from a kernel handle.
572 Parameters
573 ----------
574 handle : int
575 Kernel handle representing the address of a foreign
576 kernel object (CUkernel).
577 mod : :obj:`ObjectCode`, optional
578 The ObjectCode object associated with this kernel. Provides
579 library lifetime for foreign kernels not created by
580 cuda.core.
581 """
583 if not isinstance(handle, int): 2c u b ~e{ thuhvhwhxhyhzhAhBhChy q
584 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2thuhvhwhxhyhzhAhBhCh
586 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2c u b ~e{ y q
587 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2c u b ~e{ y q
588 if not h_kernel: 2c u b ~e{ y q
589 HANDLE_RETURN(get_last_error())
591 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2c u b ~e{ y q
592 cdef LibraryHandle h_caller_lib
594 if mod is not None: 2c u b ~e{ y q
595 h_caller_lib = (<ObjectCode>mod)._h_library 2b ~ey
596 if h_existing_lib and h_caller_lib: 2b ~ey
597 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2b ~ey
598 import warnings 1b
599 warnings.warn( 1b
600 "The library from the provided ObjectCode does not match "
601 "the library associated with this kernel.",
602 stacklevel=2,
603 )
605 cdef Kernel k = Kernel._from_handle(h_kernel) 2c u b ~e{ y q
606 if mod is not None and not h_existing_lib: 2c u b ~e{ y q
607 k._keepalive = mod
608 return k 2c u b ~e{ y q
610 def __eq__(self, other) -> bool:
611 if not isinstance(other, Kernel): 2phqhv q B C D E F G H I J K L M N O P Q R S T U V W x X Y z A
612 return NotImplemented 1vBCDEFGHIJKLMNOPQRSTUVWxX
613 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2phqhv q Y z A
615 def __hash__(self) -> int:
616 return hash(as_intptr(self._h_kernel)) 1qZ0123456789!#$%'()*+,-.w/:=?zA
618 def __repr__(self) -> str:
619 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1t;
622CodeTypeT = bytes | bytearray | str
624cdef tuple _supported_code_type = ("cubin", "ptx", "ltoir", "fatbin", "object", "library")
626cdef class ObjectCode:
627 """Represent a compiled program to be loaded onto the device.
629 This object provides a unified interface for different types of
630 compiled programs that will be loaded onto the device.
632 Note
633 ----
634 This class has no default constructor. If you already have a cubin that you would
635 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
636 from all other possible code types should be avoided in favor of compilation through
637 :class:`~cuda.core.Program`
638 """
640 def __init__(self, *args, **kwargs):
641 raise RuntimeError( 2Hh
642 "ObjectCode objects cannot be instantiated directly. "
643 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
644 )
646 @classmethod
647 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict | None = None):
648 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
649 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
651 # _h_library is assigned during _lazy_load_module
652 self._h_library = LibraryHandle() # Empty handle 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
653 _lazy_init() 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
655 self._code_type = code_type 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
656 self._module = module 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
657 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
658 self._name = name if name else "" 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
660 return self 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrczfzgAfAgBfBgCfCgDfDgEfEgFfFgGfGgHfHgIfIgJfJgKfKgLfLgMfMgNfNgOfOgPfPgQfQgRfRgSfSgTfTgUfUgVfVgWfWgXfXgYfYgZgZf0g1gwf2g0f3g1f4g5gu scb tcucvcd vfwcs o e f g h p i j k l xc| yc} zcxf6gNe7gyfog2fpgAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d$f.d/d:d;d=d?d@d[d]d^dC _d%f`dD {d'f|d}d~dE ae(fbecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qe)frese*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_fteueveX we`f{f|fxe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ Ke8gLeabMe9g}f~f!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhMbagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!foh#f
662 @staticmethod
663 def _reduce_helper(module, code_type, name, symbol_mapping):
664 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2vf{f|f
666 def __reduce__(self):
667 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2vf{f|f
669 @staticmethod
670 def from_cubin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
671 """Create an :class:`ObjectCode` instance from an existing cubin.
673 Parameters
674 ----------
675 module : Union[bytes, str]
676 Either a bytes object containing the in-memory cubin to load, or
677 a file path string pointing to the on-disk cubin to load.
678 name : Optional[str]
679 A human-readable identifier representing this code object.
680 symbol_mapping : Optional[dict]
681 A dictionary specifying how the unmangled symbol names (as keys)
682 should be mapped to the mangled names before trying to retrieve
683 them (default to no mappings).
684 """
685 return ObjectCode._init(module, "cubin", name=name, symbol_mapping=symbol_mapping) 1|}
687 @staticmethod
688 def from_ptx(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
689 """Create an :class:`ObjectCode` instance from an existing PTX.
691 Parameters
692 ----------
693 module : Union[bytes, str]
694 Either a bytes object containing the in-memory ptx code to load, or
695 a file path string pointing to the on-disk ptx file to load.
696 name : Optional[str]
697 A human-readable identifier representing this code object.
698 symbol_mapping : Optional[dict]
699 A dictionary specifying how the unmangled symbol names (as keys)
700 should be mapped to the mangled names before trying to retrieve
701 them (default to no mappings).
702 """
703 return ObjectCode._init(module, "ptx", name=name, symbol_mapping=symbol_mapping) 2wfyf2f
705 @staticmethod
706 def from_ltoir(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
707 """Create an :class:`ObjectCode` instance from an existing LTOIR.
709 Parameters
710 ----------
711 module : Union[bytes, str]
712 Either a bytes object containing the in-memory ltoir code to load, or
713 a file path string pointing to the on-disk ltoir file to load.
714 name : Optional[str]
715 A human-readable identifier representing this code object.
716 symbol_mapping : Optional[dict]
717 A dictionary specifying how the unmangled symbol names (as keys)
718 should be mapped to the mangled names before trying to retrieve
719 them (default to no mappings).
720 """
721 return ObjectCode._init(module, "ltoir", name=name, symbol_mapping=symbol_mapping) 2xfNe
723 @staticmethod
724 def from_fatbin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
725 """Create an :class:`ObjectCode` instance from an existing fatbin.
727 Parameters
728 ----------
729 module : Union[bytes, str]
730 Either a bytes object containing the in-memory fatbin to load, or
731 a file path string pointing to the on-disk fatbin to load.
732 name : Optional[str]
733 A human-readable identifier representing this code object.
734 symbol_mapping : Optional[dict]
735 A dictionary specifying how the unmangled symbol names (as keys)
736 should be mapped to the mangled names before trying to retrieve
737 them (default to no mappings).
738 """
739 return ObjectCode._init(module, "fatbin", name=name, symbol_mapping=symbol_mapping)
741 @staticmethod
742 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
743 """Create an :class:`ObjectCode` instance from an existing object code.
745 Parameters
746 ----------
747 module : Union[bytes, str]
748 Either a bytes object containing the in-memory object code to load, or
749 a file path string pointing to the on-disk object code to load.
750 name : Optional[str]
751 A human-readable identifier representing this code object.
752 symbol_mapping : Optional[dict]
753 A dictionary specifying how the unmangled symbol names (as keys)
754 should be mapped to the mangled names before trying to retrieve
755 them (default to no mappings).
756 """
757 return ObjectCode._init(module, "object", name=name, symbol_mapping=symbol_mapping)
759 @staticmethod
760 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
761 """Create an :class:`ObjectCode` instance from an existing library.
763 Parameters
764 ----------
765 module : Union[bytes, str]
766 Either a bytes object containing the in-memory library to load, or
767 a file path string pointing to the on-disk library to load.
768 name : Optional[str]
769 A human-readable identifier representing this code object.
770 symbol_mapping : Optional[dict]
771 A dictionary specifying how the unmangled symbol names (as keys)
772 should be mapped to the mangled names before trying to retrieve
773 them (default to no mappings).
774 """
775 return ObjectCode._init(module, "library", name=name, symbol_mapping=symbol_mapping)
777 # TODO: do we want to unload in a finalizer? Probably not..
779 cdef int _lazy_load_module(self) except -1:
780 if self._h_library: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l rhxc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
781 return 0 2fbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbt LbrhOeWew XeYePeQeMb
782 module = self._module 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
783 assert_type_str_or_bytes_like(module) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
784 cdef bytes path_bytes
785 if isinstance(module, str): 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
786 path_bytes = module.encode() 1|
787 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 1|
788 if not self._h_library: 1|
789 HANDLE_RETURN(get_last_error())
790 return 0 1|
791 if isinstance(module, (bytes, bytearray)): 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
792 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
793 if not self._h_library: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
794 HANDLE_RETURN(get_last_error())
795 return 0 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xcyc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdOeq wdZ xdWeydzdAd0 Bd$eCdDdEdFdGdHdIdJdKdLd1 Md%eNd2 Od'ePdQdRd3 Sd(eTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d)e9d!d*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e#d$d%d/ 'd`e(d: )d{e*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; ye|e}ezeY AeReBe= CeXeDe? EeYeFez GePeHeA IeQeJe~ KeLeabMeMb
796 raise_code_path_meant_to_be_unreachable()
797 return -1
799 def get_kernel(self, name) -> Kernel:
800 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
802 Parameters
803 ----------
804 name : str | bytes
805 Name of the kernel to retrieve.
807 Returns
808 -------
809 :obj:`~_module.Kernel`
810 Newly created kernel object.
812 """
813 self._lazy_load_module() 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
814 supported_code_types = ("cubin", "ptx", "fatbin") 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
815 if self._code_type not in supported_code_types: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcNeAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
816 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2Ne
817 try: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
818 name = self._sym_map[name] 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
819 except KeyError: 2@ [ ] ^ _ r ` d v q Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . w / : B C D E F G H I J K L M N O P Q R S T U V W x X ; Y = ? z A ~ abMb
820 if isinstance(name, str): 2@ [ ] ^ _ r ` d v q Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . w / : B C D E F G H I J K L M N O P Q R S T U V W x X ; Y = ? z A ~ abMb
821 name = name.encode() 2@ [ ] ^ _ r ` d v q Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . w / : B C D E F G H I J K L M N O P Q R S T U V W x X ; Y = ? z A ~ abMb
823 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
824 if not h_kernel: 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMeMb
825 HANDLE_RETURN(get_last_error()) 2Mb
826 return Kernel._from_handle(h_kernel) 2NbObPbQbRbSbTbfbgbhbibjbkblbmbUbVbWbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)bt *b+b,b-b.bc m n /b:b;b=b?bLb@ [ ] ^ _ r ` @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb tcucvcd wcs o e f g h p i j k l xc| yc} zcAcBcCcDcEcFcHcJcLcNcPcRcTcVcXcZc1c3c5c7c9c#c%c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudv vdq wdZ xdydzdAd0 BdCdDdEdFdGdHdIdJdKdLd1 MdNd2 OdPdQdRd3 SdTdUdVd4 5 6 7 8 9 ! # $ % ' ( ) * + , - WdXdYdZd0d1d2d3d4d5d6d7d. 8d9d!dbbw cb#d$d%d/ 'd(d: )d*d+d,dB -d.d/d:d;d=d?d@d[d]d^dC _d`dD {d|d}d~dE aebecedeF G H I J K L M N O P Q R S T U V eefegeheiejekelemeneoepeW qeresedbx ebteueveX wexe; yezeY AeBe= CeDe? EeFez GeHeA IeJe~ KeLeabMe
828 @property
829 def code(self) -> CodeTypeT:
830 """Return the underlying code object."""
831 return self._module 2zfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZfshwf0f1fu vf| } xfNeyfog2fpg}f~fagbgcgdgegfggghgigjgkglgmgng3f4f5f6f7f8f9f!f#f
833 @property
834 def name(self) -> str:
835 """Return a human-readable name of this code object."""
836 return self._name 2zfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZfshwf0f1f}f~fagbgcgdgegfggghgigjgkglgmgngqgrgsg3f4f5f6f7f8f9f!f#f
838 @property
839 def code_type(self) -> str:
840 """Return the type of the underlying code object."""
841 return self._code_type 2zfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZfshwf0f1fvfxfNeyf3f4f5f6f7f8f9f!f#f
843 @property
844 def symbol_mapping(self) -> dict:
845 """Return a copy of the symbol mapping dictionary."""
846 return dict(self._sym_map) 2u vf| } xfNeyf2f
848 @property
849 def handle(self):
850 """Return the underlying handle object.
852 .. caution::
854 This handle is a Python object. To get the memory address of the underlying C
855 handle, call ``int(ObjectCode.handle)``.
856 """
857 self._lazy_load_module() 2rhOe
858 return as_py(self._h_library) 2rhOe
860 def __eq__(self, other) -> bool:
861 if not isinstance(other, ObjectCode): 2Oe$f%f'f(f)f*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_f`fRePeQe
862 return NotImplemented 2Oe$f%f'f(f)f*fdb+f,f-f.f/f:f;f=f?fx eb@f[f]f^f_f`f
863 # Trigger lazy load for both objects to compare handles
864 self._lazy_load_module() 2OeRePeQe
865 (<ObjectCode>other)._lazy_load_module() 2OeRePeQe
866 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2OeRePeQe
868 def __hash__(self) -> int:
869 # Trigger lazy load to get the handle
870 self._lazy_load_module() 2We$e%e'e(e)e*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e`e{eXeYePeQe
871 return hash(as_intptr(self._h_library)) 2We$e%e'e(e)e*ebb+e,e-e.e/e:e;e=e?ew cb@e[e]e^e_e`e{eXeYePeQe
873 def __repr__(self) -> str:
874 # Trigger lazy load to get the handle
875 self._lazy_load_module() 2t |e}eMb
876 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2t |e}eMb