Coverage for cuda/core/_module.pyx: 87.36%
277 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-19 01:12 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-19 01:12 +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
7cimport cython
8from libc.stddef cimport size_t
10from collections import namedtuple
11from os import fsencode, fspath, PathLike
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, Stream_accept
17from cuda.core._program import ObjectCodeFormatType
18from cuda.core._resource_handles cimport (
19 LibraryHandle,
20 KernelHandle,
21 create_library_handle_from_file,
22 create_library_handle_from_data,
23 create_kernel_handle,
24 create_kernel_handle_ref,
25 get_kernel_library,
26 get_last_error,
27 as_cu,
28 as_py,
29 as_intptr,
30)
31from cuda.core._stream import Stream
32from cuda.core._utils.clear_error_support import (
33 assert_type_str_or_bytes_like,
34 raise_code_path_meant_to_be_unreachable,
35)
36from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
37from cuda.core._utils.version cimport cy_binding_version, cy_driver_version
38from cuda.core._utils.cuda_utils import driver
39from cuda.bindings cimport cydriver
41__all__ = ["Kernel", "ObjectCode"]
44cdef class KernelAttributes:
45 """Read-only view of a kernel's per-device attributes.
47 The default view returned by :attr:`Kernel.attributes` is bound to
48 the current device, resolved at attribute-access time. Use
49 ``kernel.attributes[device]`` to obtain a view bound to a specific
50 device (an :class:`int` device ordinal or :class:`Device`). Per-device
51 views share the underlying cache so a value queried through one view
52 is visible through the others.
53 """
55 def __init__(self, *args, **kwargs) -> None:
56 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2Qi
58 @staticmethod
59 cdef KernelAttributes _init(KernelHandle h_kernel):
60 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
61 self._h_kernel = h_kernel 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
62 self._device_id = -1 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
63 self._cache = {} 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
64 return self 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
66 cdef KernelAttributes _view_for_device(self, int device_id):
67 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
68 view._h_kernel = self._h_kernel 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
69 view._device_id = device_id 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
70 view._cache = self._cache 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
71 return view 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
73 cdef inline int _effective_device_id(self) except? -1:
74 if self._device_id >= 0: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
75 return self._device_id 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
76 return Device().device_id 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
78 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1:
79 """Helper function to get a cached attribute or fetch and cache it if not present."""
80 cdef tuple cache_key = (device_id, <int>attribute) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
81 cached = self._cache.get(cache_key, cache_key) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
82 if cached is not cache_key: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
83 return cached 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
84 cdef int result
85 with nogil: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
86 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
87 self._cache[cache_key] = result # setdefault not needed for ints 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
88 return result 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
90 def __getitem__(self, device: Device | int) -> KernelAttributes:
91 """Return a view of these attributes bound to a specific device.
93 Parameters
94 ----------
95 device : Device or int
96 The device whose attributes to query. Accepts a :class:`Device`
97 or a device ordinal (:class:`int`).
99 Returns
100 -------
101 KernelAttributes
102 A view bound to ``device`` that shares the underlying cache
103 with this view.
104 """
105 return self._view_for_device(Device(device).device_id) 2Fh=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
107 @property
108 def max_threads_per_block(self) -> int:
109 """int : The maximum number of threads per block.
110 This attribute is read-only."""
111 return self._get_cached_attribute( 2b d e =br a C u bf
112 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e =br a C u bf
113 )
115 @property
116 def shared_size_bytes(self) -> int:
117 """int : The size in bytes of statically-allocated shared memory required by this function.
118 This attribute is read-only."""
119 return self._get_cached_attribute( 2if
120 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2if
121 )
123 @property
124 def const_size_bytes(self) -> int:
125 """int : The size in bytes of user-allocated constant memory required by this function.
126 This attribute is read-only."""
127 return self._get_cached_attribute( 2}e
128 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2}e
129 )
131 @property
132 def local_size_bytes(self) -> int:
133 """int : The size in bytes of local memory used by each thread of this function.
134 This attribute is read-only."""
135 return self._get_cached_attribute( 2~e
136 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2~e
137 )
139 @property
140 def num_regs(self) -> int:
141 """int : The number of registers used by each thread of this function.
142 This attribute is read-only."""
143 return self._get_cached_attribute( 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf
144 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf
145 )
147 @property
148 def ptx_version(self) -> int:
149 """int : The PTX virtual architecture version for which the function was compiled.
150 This attribute is read-only."""
151 return self._get_cached_attribute( 2ef
152 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2ef
153 )
155 @property
156 def binary_version(self) -> int:
157 """int : The binary architecture version for which the function was compiled.
158 This attribute is read-only."""
159 return self._get_cached_attribute( 2{e
160 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2{e
161 )
163 @property
164 def cache_mode_ca(self) -> bool:
165 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set.
166 This attribute is read-only."""
167 return bool( 2^e
168 self._get_cached_attribute( 2^e
169 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2^e
170 )
171 )
173 @property
174 def max_dynamic_shared_size_bytes(self) -> int:
175 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used
176 by this function."""
177 return self._get_cached_attribute( 2af
178 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2af
179 )
181 @property
182 def preferred_shared_memory_carveout(self) -> int:
183 """int : The shared memory carveout preference, in percent of the total shared memory."""
184 return self._get_cached_attribute( 2df
185 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2df
186 )
188 @property
189 def cluster_size_must_be_set(self) -> bool:
190 """bool : The kernel must launch with a valid cluster size specified.
191 This attribute is read-only."""
192 return bool( 2_e
193 self._get_cached_attribute( 2_e
194 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2_e
195 )
196 )
198 @property
199 def required_cluster_width(self) -> int:
200 """int : The required cluster width in blocks."""
201 return self._get_cached_attribute( 2hf
202 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2hf
203 )
205 @property
206 def required_cluster_height(self) -> int:
207 """int : The required cluster height in blocks."""
208 return self._get_cached_attribute( 2gf
209 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2gf
210 )
212 @property
213 def required_cluster_depth(self) -> int:
214 """int : The required cluster depth in blocks."""
215 return self._get_cached_attribute( 2ff
216 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2ff
217 )
219 @property
220 def non_portable_cluster_size_allowed(self) -> bool:
221 """bool : Whether the function can be launched with non-portable cluster size."""
222 return bool( 2`e
223 self._get_cached_attribute( 2`e
224 self._effective_device_id(), 2`e
225 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED,
226 )
227 )
229 @property
230 def cluster_scheduling_policy_preference(self) -> int:
231 """int : The block scheduling policy of a function."""
232 return self._get_cached_attribute( 2|e
233 self._effective_device_id(), 2|e
234 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE,
235 )
238MaxPotentialBlockSizeOccupancyResult = namedtuple(
239 "MaxPotentialBlockSizeOccupancyResult", ("min_grid_size", "max_block_size")
240)
243cdef class KernelOccupancy:
244 """This class offers methods to query occupancy metrics that help determine optimal
245 launch parameters such as block size, grid size, and shared memory usage.
246 """
248 def __init__(self, *args, **kwargs) -> None:
249 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 2Ri
251 @staticmethod
252 cdef KernelOccupancy _init(KernelHandle h_kernel):
253 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
254 self._h_kernel = h_kernel 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
255 return self 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
257 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int:
258 """Occupancy of the kernel.
260 Returns the maximum number of active blocks per multiprocessor for this kernel.
262 Parameters
263 ----------
264 block_size: int
265 Block size parameter used to launch this kernel.
266 dynamic_shared_memory_size: int
267 The amount of dynamic shared memory in bytes needed by block.
268 Use `0` if block does not need shared memory.
270 Returns
271 -------
272 int
273 The maximum number of active blocks per multiprocessor.
275 Note
276 ----
277 The fraction of the product of maximum number of active blocks per multiprocessor
278 and the block size to the maximum number of threads per multiprocessor is known as
279 theoretical multiprocessor utilization (occupancy).
281 """
282 cdef int num_blocks
283 cdef int c_block_size = block_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
284 cdef size_t c_shmem_size = dynamic_shared_memory_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
285 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
286 with nogil: 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
287 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
288 &num_blocks, func, c_block_size, c_shmem_size
289 ))
290 return num_blocks 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
292 def max_potential_block_size(
293 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int
294 ) -> MaxPotentialBlockSizeOccupancyResult:
295 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy.
297 Returns the minimum grid size needed to achieve the maximum occupancy and
298 the maximum block size that can achieve the maximum occupancy.
300 Parameters
301 ----------
302 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize]
303 The amount of dynamic shared memory in bytes needed by block.
304 Use `0` if block does not need shared memory. Use C-callable
305 represented by :obj:`~driver.CUoccupancyB2DSize` to encode
306 amount of needed dynamic shared memory which varies depending
307 on tne block size.
308 block_size_limit: int
309 Known upper limit on the kernel block size. Use `0` to indicate
310 the maximum block size permitted by the device / kernel instead
312 Returns
313 -------
314 :obj:`~MaxPotentialBlockSizeOccupancyResult`
315 An object with `min_grid_size` and `max_block_size` attributes encoding
316 the suggested launch configuration.
318 Note
319 ----
320 Please be advised that use of C-callable that requires Python Global
321 Interpreter Lock may lead to deadlocks.
323 """
324 cdef int min_grid_size, max_block_size
325 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
326 cdef cydriver.CUoccupancyB2DSize callback
327 cdef size_t c_shmem_size
328 cdef int c_block_size_limit = block_size_limit 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
329 if isinstance(dynamic_shared_memory_needed, int): 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
330 c_shmem_size = dynamic_shared_memory_needed 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
331 with nogil: 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
332 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
333 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit
334 ))
335 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
336 # Callback may require GIL, so don't use nogil here
337 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr()
338 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize(
339 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit
340 ))
341 else:
342 raise TypeError( 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
343 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
344 f"got {type(dynamic_shared_memory_needed)}" 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
345 )
346 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2TfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
348 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int:
349 """Dynamic shared memory available per block for given launch configuration.
351 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration.
353 Parameters
354 ----------
355 num_blocks_per_multiprocessor: int
356 Number of blocks to be concurrently executing on a multiprocessor.
357 block_size: int
358 Block size parameter used to launch this kernel.
360 Returns
361 -------
362 int
363 Dynamic shared memory available per block for given launch configuration.
364 """
365 cdef size_t dynamic_smem_size
366 cdef int c_num_blocks = num_blocks_per_multiprocessor 2-f.f/f:f;f=f
367 cdef int c_block_size = block_size 2-f.f/f:f;f=f
368 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2-f.f/f:f;f=f
369 with nogil: 2-f.f/f:f;f=f
370 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2-f.f/f:f;f=f
371 &dynamic_smem_size, func, c_num_blocks, c_block_size
372 ))
373 return dynamic_smem_size 2-f.f/f:f;f=f
375 def max_potential_cluster_size(self, config: LaunchConfig, *, stream: Stream) -> int:
376 """Maximum potential cluster size.
378 The maximum potential cluster size for this kernel and given launch configuration.
380 Parameters
381 ----------
382 config: :obj:`~_launch_config.LaunchConfig`
383 Kernel launch configuration. Cluster dimensions in the configuration are ignored.
384 stream: :obj:`~Stream`
385 Keyword-only. The stream on which this kernel is to be launched.
386 Must be passed explicitly; pass ``device.default_stream`` to
387 use the default stream.
389 Returns
390 -------
391 int
392 The maximum cluster size that can be launched for this kernel and launch configuration.
393 """
394 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
395 cdef Stream s = Stream_accept(stream)
396 drv_cfg.hStream = as_cu(s._h_stream)
397 cdef int cluster_size
398 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
399 with nogil:
400 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg))
401 return cluster_size
403 def max_active_clusters(self, config: LaunchConfig, *, stream: Stream) -> int:
404 """Maximum number of active clusters on the target device.
406 The maximum number of clusters that could concurrently execute on the target device.
408 Parameters
409 ----------
410 config: :obj:`~_launch_config.LaunchConfig`
411 Kernel launch configuration.
412 stream: :obj:`~Stream`
413 Keyword-only. The stream on which this kernel is to be launched.
414 Must be passed explicitly; pass ``device.default_stream`` to
415 use the default stream.
417 Returns
418 -------
419 int
420 The maximum number of clusters that could co-exist on the target device.
421 """
422 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
423 cdef Stream s = Stream_accept(stream)
424 drv_cfg.hStream = as_cu(s._h_stream)
425 cdef int num_clusters
426 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
427 with nogil:
428 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg))
429 return num_clusters
432ParamInfo = namedtuple("ParamInfo", ["offset", "size"])
435cdef class Kernel:
436 """Represent a compiled kernel that had been loaded onto the device.
438 Kernel instances can execution when passed directly into the
439 :func:`~launch` function.
441 Directly creating a :obj:`~_module.Kernel` is not supported, and they
442 should instead be created through a :obj:`~_module.ObjectCode` object.
444 """
446 def __init__(self, *args, **kwargs) -> None:
447 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 2Si
449 @staticmethod
450 cdef Kernel _from_handle(KernelHandle h_kernel):
451 cdef Kernel ker = Kernel.__new__(Kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
452 ker._h_kernel = h_kernel 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
453 ker._attributes = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
454 ker._occupancy = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
455 return ker 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcBincocCipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca uf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
457 @property
458 @cython.critical_section
459 def attributes(self) -> KernelAttributes:
460 """Get the read-only attributes of this kernel."""
461 if self._attributes is None: 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
462 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
463 return self._attributes 2b d e Fh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
465 cdef tuple _get_arguments_info(self, bint param_info=False):
466 if cy_driver_version() < (12, 4, 0): 2c t o f g h i p j k l m qf
467 raise NotImplementedError(
468 "Driver version 12.4 or newer is required for this function. "
469 f"Using driver version {'.'.join(map(str, cy_driver_version()))}"
470 )
471 if cy_binding_version() < (12, 4, 0): 2c t o f g h i p j k l m qf
472 raise NotImplementedError(
473 "cuda.bindings 12.4 or newer is required for this function. "
474 f"Using binding version {'.'.join(map(str, cy_binding_version()))}"
475 )
476 cdef size_t arg_pos = 0 2c t o f g h i p j k l m qf
477 cdef list param_info_data = [] 2c t o f g h i p j k l m qf
478 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2c t o f g h i p j k l m qf
479 cdef size_t param_offset, param_size
480 cdef cydriver.CUresult err
481 while True: 2c t o f g h i p j k l m qf
482 with nogil: 2c t o f g h i p j k l m qf
483 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2c t o f g h i p j k l m qf
484 if err != cydriver.CUDA_SUCCESS: 2c t o f g h i p j k l m qf
485 break 2c t o f g h i p j k l m qf
486 if param_info: 2c f g h i j k l m qf
487 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2f g h i j k l m qf
488 arg_pos = arg_pos + 1 2c f g h i j k l m qf
489 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2c t o f g h i p j k l m qf
490 HANDLE_RETURN(err) 1t
491 return arg_pos, param_info_data 2c o f g h i p j k l m qf
493 @property
494 def num_arguments(self) -> int:
495 """int : The number of arguments of this function"""
496 num_args, _ = self._get_arguments_info() 2c t o f g h i p j k l m qf
497 return num_args 2c o f g h i p j k l m qf
499 @property
500 def arguments_info(self) -> list[ParamInfo]:
501 """list[ParamInfo]: (offset, size) for each argument of this function"""
502 _, param_info = self._get_arguments_info(param_info=True) 2o f g h i p j k l m qf
503 return param_info 2o f g h i p j k l m qf
505 @property
506 @cython.critical_section
507 def occupancy(self) -> KernelOccupancy:
508 """Get the occupancy information for launching this kernel."""
509 if self._occupancy is None: 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
510 self._occupancy = KernelOccupancy._init(self._h_kernel) 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
511 return self._occupancy 2s -f.f/f:f;f=flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f
513 @property
514 def handle(self) -> object:
515 """Return the underlying kernel handle object.
517 .. caution::
519 This handle is a Python object. To get the memory address of the underlying C
520 handle, call ``int(Kernel.handle)``.
521 """
522 return as_py(self._h_kernel) 2b Tia ufC u c x q
524 @property
525 def _handle(self) -> object:
526 return self.handle
528 @staticmethod
529 def from_handle(handle, mod: ObjectCode | None = None) -> Kernel:
530 """Creates a new :obj:`Kernel` object from a kernel handle.
532 Parameters
533 ----------
534 handle : int
535 Kernel handle representing the address of a foreign
536 kernel object (CUkernel).
537 mod : :obj:`ObjectCode`, optional
538 The ObjectCode object associated with this kernel. Provides
539 library lifetime for foreign kernels not created by
540 cuda.core.
541 """
543 if not isinstance(handle, int): 2b r a ufC GiHiIiJiKiLiMiNiOiPiu q
544 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2GiHiIiJiKiLiMiNiOiPi
546 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b r a ufC u q
547 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a ufC u q
548 if not h_kernel: 2b r a ufC u q
549 HANDLE_RETURN(get_last_error())
551 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a ufC u q
552 cdef LibraryHandle h_caller_lib
554 if mod is not None: 2b r a ufC u q
555 h_caller_lib = (<ObjectCode>mod)._h_library 2a ufu
556 if h_existing_lib and h_caller_lib: 2a ufu
557 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a ufu
558 import warnings 1a
559 warnings.warn( 1a
560 "The library from the provided ObjectCode does not match "
561 "the library associated with this kernel.",
562 stacklevel=2,
563 )
565 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a ufC u q
566 if mod is not None and not h_existing_lib: 2b r a ufC u q
567 k._keepalive = mod
568 return k 2b r a ufC u q
570 def __eq__(self, other: object) -> bool:
571 if not isinstance(other, Kernel): 2BiCix q D E F G H I J K L M N O P Q R S T U V W X Y z Z 0 A B
572 return NotImplemented 1xDEFGHIJKLMNOPQRSTUVWXYzZ
573 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2BiCix q 0 A B
575 def __hash__(self) -> int:
576 return hash(as_intptr(self._h_kernel)) 1q3456789!#$%'()*+,-./:;=y?@]^AB
578 def __repr__(self) -> str:
579 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1[
582CodeTypeT = bytes | bytearray | str
584cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values())
586cdef class ObjectCode:
587 """Represent a compiled program to be loaded onto the device.
589 This object provides a unified interface for different types of
590 compiled programs that will be loaded onto the device.
592 Note
593 ----
594 This class has no default constructor. If you already have a cubin that you would
595 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
596 from all other possible code types should be avoided in favor of compilation through
597 :class:`~cuda.core.Program`
598 """
600 def __init__(self, *args, **kwargs) -> None:
601 raise RuntimeError( 2Ui
602 "ObjectCode objects cannot be instantiated directly. "
603 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
604 )
606 @classmethod
607 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
608 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
609 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
611 # _h_library is assigned during _lazy_load_module
612 self._h_library = LibraryHandle() # Empty handle 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
614 self._code_type = str(code_type) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
616 if isinstance(module, (str, bytes, bytearray)): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
617 self._module = module 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c`cfb{cgb|cHghbIgibJg'h+f(hjf)h]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
618 elif isinstance(module, PathLike): 21 2 (f)f
619 self._module = fspath(module) 21 2 (f)f
620 else:
621 self._module = module
622 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
623 self._name = name if name else "" 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
625 return self 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c?fGh@fHhIh[fJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6h7hpg8h9h*f!hqg#hrg$h%h;c=cr ?ca @c[c]cc 'f^ct o f g h i p j k l m _c1 `cfb{cgb|c2 HghbIgibJg(f'h+f(hjf)h)f]g,f^gsg_glfmftgugv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeKgBeCeDeEeFeGeHeIeJeKeE LeLgMeF NeMgOePeQeG ReNgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7eOg8e9ePgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g!e#e$eZ %e4g5g6g'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e*h[ekb]e+h7g8g,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixi;b9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgyi_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChziGg@gDhEh[gAi
627 @staticmethod
628 def _reduce_helper(module, code_type, name, symbol_mapping):
629 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2'f5g6g
631 def __reduce__(self) -> tuple[object, ...]:
632 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2'f5g6g
634 @staticmethod
635 def from_cubin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
636 """Create an :class:`ObjectCode` instance from an existing cubin.
638 Parameters
639 ----------
640 module : Union[bytes, str, os.PathLike]
641 Either a bytes object containing the in-memory cubin to load, or
642 a file path object (or its string representation) pointing to the
643 on-disk cubin to load.
644 name : Optional[str]
645 A human-readable identifier representing this code object.
646 symbol_mapping : Optional[dict]
647 A dictionary specifying how the unmangled symbol names (as keys)
648 should be mapped to the mangled names before trying to retrieve
649 them (default to no mappings).
650 """
651 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 21 fbgb:g;g=g?g
653 @staticmethod
654 def from_ptx(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
655 """Create an :class:`ObjectCode` instance from an existing PTX.
657 Parameters
658 ----------
659 module : Union[bytes, str, os.PathLike]
660 Either a bytes object containing the in-memory ptx code to load, or
661 a file path object (or its string representation) pointing to the
662 on-disk ptx file to load.
663 name : Optional[str]
664 A human-readable identifier representing this code object.
665 symbol_mapping : Optional[dict]
666 A dictionary specifying how the unmangled symbol names (as keys)
667 should be mapped to the mangled names before trying to retrieve
668 them (default to no mappings).
669 """
670 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2*f)f,fsg
672 @staticmethod
673 def from_ltoir(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
674 """Create an :class:`ObjectCode` instance from an existing LTOIR.
676 Parameters
677 ----------
678 module : Union[bytes, str, os.PathLike]
679 Either a bytes object containing the in-memory ltoir code to load,
680 or a file path object (or its string representation) pointing to the
681 on-disk ltoir file to load.
682 name : Optional[str]
683 A human-readable identifier representing this code object.
684 symbol_mapping : Optional[dict]
685 A dictionary specifying how the unmangled symbol names (as keys)
686 should be mapped to the mangled names before trying to retrieve
687 them (default to no mappings).
688 """
689 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2(f+fjf
691 @staticmethod
692 def from_fatbin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
693 """Create an :class:`ObjectCode` instance from an existing fatbin.
695 Parameters
696 ----------
697 module : Union[bytes, str, os.PathLike]
698 Either a bytes object containing the in-memory fatbin to load, or
699 or a file path object (or its string representation) pointing to the
700 on-disk fatbin to load.
701 name : Optional[str]
702 A human-readable identifier representing this code object.
703 symbol_mapping : Optional[dict]
704 A dictionary specifying how the unmangled symbol names (as keys)
705 should be mapped to the mangled names before trying to retrieve
706 them (default to no mappings).
707 """
708 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 22 hbib
710 @staticmethod
711 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
712 """Create an :class:`ObjectCode` instance from an existing object code.
714 Parameters
715 ----------
716 module : Union[bytes, str]
717 Either a bytes object containing the in-memory object code to load, or
718 a file path string pointing to the on-disk object code to load.
719 name : Optional[str]
720 A human-readable identifier representing this code object.
721 symbol_mapping : Optional[dict]
722 A dictionary specifying how the unmangled symbol names (as keys)
723 should be mapped to the mangled names before trying to retrieve
724 them (default to no mappings).
725 """
726 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2mfugw
728 @staticmethod
729 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
730 """Create an :class:`ObjectCode` instance from an existing library.
732 Parameters
733 ----------
734 module : Union[bytes, str]
735 Either a bytes object containing the in-memory library to load, or
736 a file path string pointing to the on-disk library to load.
737 name : Optional[str]
738 A human-readable identifier representing this code object.
739 symbol_mapping : Optional[dict]
740 A dictionary specifying how the unmangled symbol names (as keys)
741 should be mapped to the mangled names before trying to retrieve
742 them (default to no mappings).
743 """
744 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2lftgv
746 # TODO: do we want to unload in a finalizer? Probably not..
748 @cython.critical_section
749 cdef int _lazy_load_module(self) except -1:
750 if self._h_library: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m Di_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
751 return 0 2HbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bDikfrfy sftfnfof;b
752 module = self._module 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
753 cdef bytes path_bytes
754 if isinstance(module, str): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
755 path_bytes = module.encode() 21 fb2 hb
756 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 21 fb2 hb
757 elif isinstance(module, (bytes, bytearray)): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
758 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
759 elif isinstance(module, PathLike):
760 path_bytes = fsencode(module)
761 self._h_library = create_library_handle_from_file(<const char*>path_bytes)
762 else:
763 assert_type_str_or_bytes_like(module)
764 raise_code_path_meant_to_be_unreachable()
765 return -1
766 if not self._h_library: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
767 HANDLE_RETURN(get_last_error())
768 return 0 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'drf(d)d*d4 +dvf,d-d.d/d:d;d=d?d@d[d5 ]dwf^d6 _dxf`d{d|d7 }dyf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oezfpeqeAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfresete? uePfve@ weQfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eRfSf)e0 *epf+e] ,esf-e^ .etf/eA :enf;eB =eof?ejb@e[ekb]e;b_
770 def get_kernel(self, name: str | bytes) -> Kernel:
771 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
773 Parameters
774 ----------
775 name : str | bytes
776 Name of the kernel to retrieve.
778 Returns
779 -------
780 :obj:`~_module.Kernel`
781 Newly created kernel object.
783 """
784 self._lazy_load_module() 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
785 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
786 if self._code_type not in supported_code_types: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
787 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2jflfmf
788 try: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
789 name = self._sym_map[name] 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
790 except KeyError: 2` { | } ~ abbbcbdbs ebc v w x q 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = y ? @ D E F G H I J K L M N O P Q R S T U V W X Y z Z [ 0 ] ^ A B jbkb;b_
791 if isinstance(name, str): 2` { | } ~ abbbcbdbs ebc v w x q 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = y ? @ D E F G H I J K L M N O P Q R S T U V W X Y z Z [ 0 ] ^ A B jbkb;b_
792 name = name.encode() 2` { | } ~ abbbcbdbs ebc v w x q 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = y ? @ D E F G H I J K L M N O P Q R S T U V W X Y z Z [ 0 ] ^ A B jbkb;b_
794 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
795 if not h_kernel: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
796 HANDLE_RETURN(get_last_error()) 2;b
797 return Kernel._from_handle(h_kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
799 @property
800 def code(self) -> CodeTypeT:
801 """Return the underlying code object."""
802 return self._module 2?f@fEi[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgFi*fqgrgr 'f1 fbgb2 HghbIgibJg(f+fjf)f]g,f^gsg_glfmftgugv w 7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/gVivgwgxgygzgAgBgCgDgEgFg_ :g}g~gahbhchdhehfh;ggh=ghhihjhkhlhmhnhohphqhrhshthuhvhwh?gxhyhzhAhBhChGg@gDhEh[g
804 @property
805 def name(self) -> str:
806 """Return a human-readable name of this code object."""
807 return self._name 2?f@fEi[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgFi*fqgrgv w 7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g`g{g|gvgwgxgygzgAgBgCgDgEgFgGg@g
809 @property
810 def code_type(self) -> str:
811 """Return the type of the underlying code object."""
812 return self._code_type 2?f@fEi[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgFi*fqgrg'f2 hbib(f+fjf)f,flfmftgugv w vgwgxgygzgAgBgCgDgEgFgGg[g
814 @property
815 def symbol_mapping(self) -> dict[str, str]:
816 """Return a copy of the symbol mapping dictionary."""
817 return dict(self._sym_map) 2r 'f1 fbgbHgIgJg(f+fjf)f,fsg
819 @property
820 def handle(self) -> object:
821 """Return the underlying handle object.
823 .. caution::
825 This handle is a Python object. To get the memory address of the underlying C
826 handle, call ``int(ObjectCode.handle)``.
827 """
828 self._lazy_load_module() 2Dikf
829 return as_py(self._h_library) 2Dikf
831 def __eq__(self, other: object) -> bool:
832 if not isinstance(other, ObjectCode): 2kfKgLgMgNgOgPgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g4gpfnfof
833 return NotImplemented 2kfKgLgMgNgOgPgFbQgRgSgTgUgVgWgXgYgz GbZg0g1g2g3g4g
834 # Trigger lazy load for both objects to compare handles
835 self._lazy_load_module() 2kfpfnfof
836 (<ObjectCode>other)._lazy_load_module() 2kfpfnfof
837 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2kfpfnfof
839 def __hash__(self) -> int:
840 # Trigger lazy load to get the handle
841 self._lazy_load_module() 2rfvfwfxfyfzfAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfPfQfsftfnfof
842 return hash(as_intptr(self._h_library)) 2rfvfwfxfyfzfAfDbBfCfDfEfFfGfHfIfJfy EbKfLfMfNfOfPfQfsftfnfof
844 def __repr__(self) -> str:
845 # Trigger lazy load to get the handle
846 self._lazy_load_module() 2RfSf;b
847 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2RfSf;b