Coverage for cuda/core/_module.pyx: 87.27%
275 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-13 01:38 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-13 01:38 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5from __future__ import annotations
7from libc.stddef cimport size_t
9from collections import namedtuple
10from os import fsencode, fspath, PathLike
12from cuda.core._device import Device
13from cuda.core._launch_config cimport LaunchConfig
14from cuda.core._launch_config import LaunchConfig
15from cuda.core._stream cimport Stream, Stream_accept
16from cuda.core._program import ObjectCodeFormatType
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.version cimport cy_binding_version, cy_driver_version
37from cuda.core._utils.cuda_utils import driver
38from cuda.bindings cimport cydriver
40__all__ = ["Kernel", "ObjectCode"]
43cdef class KernelAttributes:
44 """Read-only view of a kernel's per-device attributes.
46 The default view returned by :attr:`Kernel.attributes` is bound to
47 the current device, resolved at attribute-access time. Use
48 ``kernel.attributes[device]`` to obtain a view bound to a specific
49 device (an :class:`int` device ordinal or :class:`Device`). Per-device
50 views share the underlying cache so a value queried through one view
51 is visible through the others.
52 """
54 def __init__(self, *args, **kwargs) -> None:
55 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2xi
57 @staticmethod
58 cdef KernelAttributes _init(KernelHandle h_kernel):
59 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
60 self._h_kernel = h_kernel 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
61 self._device_id = -1 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
62 self._cache = {} 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
63 return self 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
65 cdef KernelAttributes _view_for_device(self, int device_id):
66 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
67 view._h_kernel = self._h_kernel 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
68 view._device_id = device_id 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
69 view._cache = self._cache 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
70 return view 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
72 cdef inline int _effective_device_id(self) except? -1:
73 if self._device_id >= 0: 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
74 return self._device_id 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
75 return Device().device_id 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
77 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1:
78 """Helper function to get a cached attribute or fetch and cache it if not present."""
79 cdef tuple cache_key = (device_id, <int>attribute) 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
80 cached = self._cache.get(cache_key, cache_key) 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
81 if cached is not cache_key: 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
82 return cached 2,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
83 cdef int result
84 with nogil: 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
85 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
86 self._cache[cache_key] = result 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
87 return result 2b d e ,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
89 def __getitem__(self, device: Device | int) -> KernelAttributes:
90 """Return a view of these attributes bound to a specific device.
92 Parameters
93 ----------
94 device : Device or int
95 The device whose attributes to query. Accepts a :class:`Device`
96 or a device ordinal (:class:`int`).
98 Returns
99 -------
100 KernelAttributes
101 A view bound to ``device`` that shares the underlying cache
102 with this view.
103 """
104 return self._view_for_device(Device(device).device_id) 2mh,b+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
106 @property
107 def max_threads_per_block(self) -> int:
108 """int : The maximum number of threads per block.
109 This attribute is read-only."""
110 return self._get_cached_attribute( 2b d e ,br a A u :e
111 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e ,br a A u :e
112 )
114 @property
115 def shared_size_bytes(self) -> int:
116 """int : The size in bytes of statically-allocated shared memory required by this function.
117 This attribute is read-only."""
118 return self._get_cached_attribute( 2^e
119 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2^e
120 )
122 @property
123 def const_size_bytes(self) -> int:
124 """int : The size in bytes of user-allocated constant memory required by this function.
125 This attribute is read-only."""
126 return self._get_cached_attribute( 2-e
127 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2-e
128 )
130 @property
131 def local_size_bytes(self) -> int:
132 """int : The size in bytes of local memory used by each thread of this function.
133 This attribute is read-only."""
134 return self._get_cached_attribute( 2.e
135 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2.e
136 )
138 @property
139 def num_regs(self) -> int:
140 """int : The number of registers used by each thread of this function.
141 This attribute is read-only."""
142 return self._get_cached_attribute( 2,bjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb;e
143 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2,bjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb;e
144 )
146 @property
147 def ptx_version(self) -> int:
148 """int : The PTX virtual architecture version for which the function was compiled.
149 This attribute is read-only."""
150 return self._get_cached_attribute( 2?e
151 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2?e
152 )
154 @property
155 def binary_version(self) -> int:
156 """int : The binary architecture version for which the function was compiled.
157 This attribute is read-only."""
158 return self._get_cached_attribute( 2+e
159 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2+e
160 )
162 @property
163 def cache_mode_ca(self) -> bool:
164 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set.
165 This attribute is read-only."""
166 return bool( 2(e
167 self._get_cached_attribute( 2(e
168 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2(e
169 )
170 )
172 @property
173 def max_dynamic_shared_size_bytes(self) -> int:
174 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used
175 by this function."""
176 return self._get_cached_attribute( 2/e
177 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2/e
178 )
180 @property
181 def preferred_shared_memory_carveout(self) -> int:
182 """int : The shared memory carveout preference, in percent of the total shared memory."""
183 return self._get_cached_attribute( 2=e
184 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2=e
185 )
187 @property
188 def cluster_size_must_be_set(self) -> bool:
189 """bool : The kernel must launch with a valid cluster size specified.
190 This attribute is read-only."""
191 return bool( 2)e
192 self._get_cached_attribute( 2)e
193 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2)e
194 )
195 )
197 @property
198 def required_cluster_width(self) -> int:
199 """int : The required cluster width in blocks."""
200 return self._get_cached_attribute( 2]e
201 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2]e
202 )
204 @property
205 def required_cluster_height(self) -> int:
206 """int : The required cluster height in blocks."""
207 return self._get_cached_attribute( 2[e
208 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2[e
209 )
211 @property
212 def required_cluster_depth(self) -> int:
213 """int : The required cluster depth in blocks."""
214 return self._get_cached_attribute( 2@e
215 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2@e
216 )
218 @property
219 def non_portable_cluster_size_allowed(self) -> bool:
220 """bool : Whether the function can be launched with non-portable cluster size."""
221 return bool( 2*e
222 self._get_cached_attribute( 2*e
223 self._effective_device_id(), 2*e
224 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED,
225 )
226 )
228 @property
229 def cluster_scheduling_policy_preference(self) -> int:
230 """int : The block scheduling policy of a function."""
231 return self._get_cached_attribute( 2,e
232 self._effective_device_id(), 2,e
233 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE,
234 )
237MaxPotentialBlockSizeOccupancyResult = namedtuple(
238 "MaxPotentialBlockSizeOccupancyResult", ("min_grid_size", "max_block_size")
239)
242cdef class KernelOccupancy:
243 """This class offers methods to query occupancy metrics that help determine optimal
244 launch parameters such as block size, grid size, and shared memory usage.
245 """
247 def __init__(self, *args, **kwargs) -> None:
248 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 2yi
250 @staticmethod
251 cdef KernelOccupancy _init(KernelHandle h_kernel):
252 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
253 self._h_kernel = h_kernel 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
254 return self 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
256 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int:
257 """Occupancy of the kernel.
259 Returns the maximum number of active blocks per multiprocessor for this kernel.
261 Parameters
262 ----------
263 block_size: int
264 Block size parameter used to launch this kernel.
265 dynamic_shared_memory_size: int
266 The amount of dynamic shared memory in bytes needed by block.
267 Use `0` if block does not need shared memory.
269 Returns
270 -------
271 int
272 The maximum number of active blocks per multiprocessor.
274 Note
275 ----
276 The fraction of the product of maximum number of active blocks per multiprocessor
277 and the block size to the maximum number of threads per multiprocessor is known as
278 theoretical multiprocessor utilization (occupancy).
280 """
281 cdef int num_blocks
282 cdef int c_block_size = block_size 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb
283 cdef size_t c_shmem_size = dynamic_shared_memory_size 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb
284 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb
285 with nogil: 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb
286 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb
287 &num_blocks, func, c_block_size, c_shmem_size
288 ))
289 return num_blocks 2s jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb
291 def max_potential_block_size(
292 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int
293 ) -> MaxPotentialBlockSizeOccupancyResult:
294 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy.
296 Returns the minimum grid size needed to achieve the maximum occupancy and
297 the maximum block size that can achieve the maximum occupancy.
299 Parameters
300 ----------
301 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize]
302 The amount of dynamic shared memory in bytes needed by block.
303 Use `0` if block does not need shared memory. Use C-callable
304 represented by :obj:`~driver.CUoccupancyB2DSize` to encode
305 amount of needed dynamic shared memory which varies depending
306 on tne block size.
307 block_size_limit: int
308 Known upper limit on the kernel block size. Use `0` to indicate
309 the maximum block size permitted by the device / kernel instead
311 Returns
312 -------
313 :obj:`~MaxPotentialBlockSizeOccupancyResult`
314 An object with `min_grid_size` and `max_block_size` attributes encoding
315 the suggested launch configuration.
317 Note
318 ----
319 Please be advised that use of C-callable that requires Python Global
320 Interpreter Lock may lead to deadlocks.
322 """
323 cdef int min_grid_size, max_block_size
324 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
325 cdef cydriver.CUoccupancyB2DSize callback
326 cdef size_t c_shmem_size
327 cdef int c_block_size_limit = block_size_limit 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
328 if isinstance(dynamic_shared_memory_needed, int): 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
329 c_shmem_size = dynamic_shared_memory_needed 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
330 with nogil: 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
331 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
332 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit
333 ))
334 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
335 # Callback may require GIL, so don't use nogil here
336 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr()
337 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize(
338 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit
339 ))
340 else:
341 raise TypeError( 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
342 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
343 f"got {type(dynamic_shared_memory_needed)}" 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
344 )
345 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2CfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
347 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int:
348 """Dynamic shared memory available per block for given launch configuration.
350 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration.
352 Parameters
353 ----------
354 num_blocks_per_multiprocessor: int
355 Number of blocks to be concurrently executing on a multiprocessor.
356 block_size: int
357 Block size parameter used to launch this kernel.
359 Returns
360 -------
361 int
362 Dynamic shared memory available per block for given launch configuration.
363 """
364 cdef size_t dynamic_smem_size
365 cdef int c_num_blocks = num_blocks_per_multiprocessor 23f4f5f6f7f8f
366 cdef int c_block_size = block_size 23f4f5f6f7f8f
367 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 23f4f5f6f7f8f
368 with nogil: 23f4f5f6f7f8f
369 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 23f4f5f6f7f8f
370 &dynamic_smem_size, func, c_num_blocks, c_block_size
371 ))
372 return dynamic_smem_size 23f4f5f6f7f8f
374 def max_potential_cluster_size(self, config: LaunchConfig, *, stream: Stream) -> int:
375 """Maximum potential cluster size.
377 The maximum potential cluster size for this kernel and given launch configuration.
379 Parameters
380 ----------
381 config: :obj:`~_launch_config.LaunchConfig`
382 Kernel launch configuration. Cluster dimensions in the configuration are ignored.
383 stream: :obj:`~Stream`
384 Keyword-only. The stream on which this kernel is to be launched.
385 Must be passed explicitly; pass ``device.default_stream`` to
386 use the default stream.
388 Returns
389 -------
390 int
391 The maximum cluster size that can be launched for this kernel and launch configuration.
392 """
393 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
394 cdef Stream s = Stream_accept(stream)
395 drv_cfg.hStream = as_cu(s._h_stream)
396 cdef int cluster_size
397 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
398 with nogil:
399 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg))
400 return cluster_size
402 def max_active_clusters(self, config: LaunchConfig, *, stream: Stream) -> int:
403 """Maximum number of active clusters on the target device.
405 The maximum number of clusters that could concurrently execute on the target device.
407 Parameters
408 ----------
409 config: :obj:`~_launch_config.LaunchConfig`
410 Kernel launch configuration.
411 stream: :obj:`~Stream`
412 Keyword-only. The stream on which this kernel is to be launched.
413 Must be passed explicitly; pass ``device.default_stream`` to
414 use the default stream.
416 Returns
417 -------
418 int
419 The maximum number of clusters that could co-exist on the target device.
420 """
421 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
422 cdef Stream s = Stream_accept(stream)
423 drv_cfg.hStream = as_cu(s._h_stream)
424 cdef int num_clusters
425 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
426 with nogil:
427 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg))
428 return num_clusters
431ParamInfo = namedtuple("ParamInfo", ["offset", "size"])
434cdef class Kernel:
435 """Represent a compiled kernel that had been loaded onto the device.
437 Kernel instances can execution when passed directly into the
438 :func:`~launch` function.
440 Directly creating a :obj:`~_module.Kernel` is not supported, and they
441 should instead be created through a :obj:`~_module.ObjectCode` object.
443 """
445 def __init__(self, *args, **kwargs) -> None:
446 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 2zi
448 @staticmethod
449 cdef Kernel _from_handle(KernelHandle h_kernel):
450 cdef Kernel ker = Kernel.__new__(Kernel) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]
451 ker._h_kernel = h_kernel 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]
452 ker._attributes = None 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]
453 ker._occupancy = None 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]
454 return ker 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|bii}b~bjiacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cr #ca df$cA %cu 'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]
456 @property
457 def attributes(self) -> KernelAttributes:
458 """Get the read-only attributes of this kernel."""
459 if self._attributes is None: 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
460 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
461 return self._attributes 2b d e mh,br a A u jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAb+e(e,e)e-e.e/e:e*e;e=e?e@e[e]e^e
463 cdef tuple _get_arguments_info(self, bint param_info=False):
464 if cy_driver_version() < (12, 4, 0): 2c t o f g h i p j k l m ~e
465 raise NotImplementedError(
466 "Driver version 12.4 or newer is required for this function. "
467 f"Using driver version {'.'.join(map(str, cy_driver_version()))}"
468 )
469 if cy_binding_version() < (12, 4, 0): 2c t o f g h i p j k l m ~e
470 raise NotImplementedError(
471 "cuda.bindings 12.4 or newer is required for this function. "
472 f"Using binding version {'.'.join(map(str, cy_binding_version()))}"
473 )
474 cdef size_t arg_pos = 0 2c t o f g h i p j k l m ~e
475 cdef list param_info_data = [] 2c t o f g h i p j k l m ~e
476 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2c t o f g h i p j k l m ~e
477 cdef size_t param_offset, param_size
478 cdef cydriver.CUresult err
479 while True: 2c t o f g h i p j k l m ~e
480 with nogil: 2c t o f g h i p j k l m ~e
481 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2c t o f g h i p j k l m ~e
482 if err != cydriver.CUDA_SUCCESS: 2c t o f g h i p j k l m ~e
483 break 2c t o f g h i p j k l m ~e
484 if param_info: 2c f g h i j k l m ~e
485 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2f g h i j k l m ~e
486 arg_pos = arg_pos + 1 2c f g h i j k l m ~e
487 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2c t o f g h i p j k l m ~e
488 HANDLE_RETURN(err) 1t
489 return arg_pos, param_info_data 2c o f g h i p j k l m ~e
491 @property
492 def num_arguments(self) -> int:
493 """int : The number of arguments of this function"""
494 num_args, _ = self._get_arguments_info() 2c t o f g h i p j k l m ~e
495 return num_args 2c o f g h i p j k l m ~e
497 @property
498 def arguments_info(self) -> list[ParamInfo]:
499 """list[ParamInfo]: (offset, size) for each argument of this function"""
500 _, param_info = self._get_arguments_info(param_info=True) 2o f g h i p j k l m ~e
501 return param_info 2o f g h i p j k l m ~e
503 @property
504 def occupancy(self) -> KernelOccupancy:
505 """Get the occupancy information for launching this kernel."""
506 if self._occupancy is None: 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
507 self._occupancy = KernelOccupancy._init(self._h_kernel) 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
508 return self._occupancy 2s 3f4f5f6f7f8fjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWf
510 @property
511 def handle(self) -> object:
512 """Return the underlying kernel handle object.
514 .. caution::
516 This handle is a Python object. To get the memory address of the underlying C
517 handle, call ``int(Kernel.handle)``.
518 """
519 return as_py(self._h_kernel) 2b Aia dfA u c v q
521 @property
522 def _handle(self) -> object:
523 return self.handle
525 @staticmethod
526 def from_handle(handle, mod: ObjectCode | None = None) -> Kernel:
527 """Creates a new :obj:`Kernel` object from a kernel handle.
529 Parameters
530 ----------
531 handle : int
532 Kernel handle representing the address of a foreign
533 kernel object (CUkernel).
534 mod : :obj:`ObjectCode`, optional
535 The ObjectCode object associated with this kernel. Provides
536 library lifetime for foreign kernels not created by
537 cuda.core.
538 """
540 if not isinstance(handle, int): 2b r a dfA nioipiqirisitiuiviwiu q
541 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2nioipiqirisitiuiviwi
543 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b r a dfA u q
544 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a dfA u q
545 if not h_kernel: 2b r a dfA u q
546 HANDLE_RETURN(get_last_error())
548 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a dfA u q
549 cdef LibraryHandle h_caller_lib
551 if mod is not None: 2b r a dfA u q
552 h_caller_lib = (<ObjectCode>mod)._h_library 2a dfu
553 if h_existing_lib and h_caller_lib: 2a dfu
554 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a dfu
555 import warnings 1a
556 warnings.warn( 1a
557 "The library from the provided ObjectCode does not match "
558 "the library associated with this kernel.",
559 stacklevel=2,
560 )
562 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a dfA u q
563 if mod is not None and not h_existing_lib: 2b r a dfA u q
564 k._keepalive = mod
565 return k 2b r a dfA u q
567 def __eq__(self, other: object) -> bool:
568 if not isinstance(other, Kernel): 2iijiv 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 y z
569 return NotImplemented 1vBCDEFGHIJKLMNOPQRSTUVWxX
570 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2iijiv q Y y z
572 def __hash__(self) -> int:
573 return hash(as_intptr(self._h_kernel)) 1q123456789!#$%'()*+,-./:w;=@[yz
575 def __repr__(self) -> str:
576 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1?
579CodeTypeT = bytes | bytearray | str
581cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values())
583cdef class ObjectCode:
584 """Represent a compiled program to be loaded onto the device.
586 This object provides a unified interface for different types of
587 compiled programs that will be loaded onto the device.
589 Note
590 ----
591 This class has no default constructor. If you already have a cubin that you would
592 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
593 from all other possible code types should be avoided in favor of compilation through
594 :class:`~cuda.core.Program`
595 """
597 def __init__(self, *args, **kwargs) -> None:
598 raise RuntimeError( 2Bi
599 "ObjectCode objects cannot be instantiated directly. "
600 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
601 )
603 @classmethod
604 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
605 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
606 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
608 # _h_library is assigned during _lazy_load_module
609 self._h_library = LibraryHandle() # Empty handle 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
611 self._code_type = str(code_type) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
613 if isinstance(module, (str, bytes, bytearray)): 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
614 self._module = module 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )c*cdb+ceb,cogfbpggbqgVh1fWh_eXh!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
615 elif isinstance(module, PathLike): 2Z 0 YfZf
616 self._module = fspath(module) 2Z 0 YfZf
617 else:
618 self._module = module
619 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
620 self._name = name if name else "" 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
622 return self 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9fnh!fohph#fqh$frh%fsh'fth(fuh)fvh*fwh+fxh,fyh-fzh.fAh/fBh:fCh;fDh=fEh?fFh@fGh[fHh]fIh^fJh_fKh`fLh{fMh|fNhOh}fPhQh0fRh~fShagThUh9c!cr #ca $c%c'cc Xf(ct o f g h i p j k l m )cZ *cdb+ceb,c0 ogfbpggbqgYfVh1fWh_eXhZf!g2f#gbg$g-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lergmeneoepeqereseteueveC wesgxeD yetgzeAeBeE CeugDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SevgTeUewgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgVeWeXeX YeLgMgNgZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$eYh%eib'eZhOgPg0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidiei+bQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gficgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhging8gkhlh9ghi
624 @staticmethod
625 def _reduce_helper(module, code_type, name, symbol_mapping):
626 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2XfMgNg
628 def __reduce__(self) -> tuple[object, ...]:
629 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2XfMgNg
631 @staticmethod
632 def from_cubin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
633 """Create an :class:`ObjectCode` instance from an existing cubin.
635 Parameters
636 ----------
637 module : Union[bytes, str, os.PathLike]
638 Either a bytes object containing the in-memory cubin to load, or
639 a file path object (or its string representation) pointing to the
640 on-disk cubin to load.
641 name : Optional[str]
642 A human-readable identifier representing this code object.
643 symbol_mapping : Optional[dict]
644 A dictionary specifying how the unmangled symbol names (as keys)
645 should be mapped to the mangled names before trying to retrieve
646 them (default to no mappings).
647 """
648 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2Z dbeb4g5g6g7g
650 @staticmethod
651 def from_ptx(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
652 """Create an :class:`ObjectCode` instance from an existing PTX.
654 Parameters
655 ----------
656 module : Union[bytes, str, os.PathLike]
657 Either a bytes object containing the in-memory ptx code to load, or
658 a file path object (or its string representation) pointing to the
659 on-disk ptx file to load.
660 name : Optional[str]
661 A human-readable identifier representing this code object.
662 symbol_mapping : Optional[dict]
663 A dictionary specifying how the unmangled symbol names (as keys)
664 should be mapped to the mangled names before trying to retrieve
665 them (default to no mappings).
666 """
667 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 20fZf2fbg
669 @staticmethod
670 def from_ltoir(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
671 """Create an :class:`ObjectCode` instance from an existing LTOIR.
673 Parameters
674 ----------
675 module : Union[bytes, str, os.PathLike]
676 Either a bytes object containing the in-memory ltoir code to load,
677 or a file path object (or its string representation) pointing to the
678 on-disk ltoir file to load.
679 name : Optional[str]
680 A human-readable identifier representing this code object.
681 symbol_mapping : Optional[dict]
682 A dictionary specifying how the unmangled symbol names (as keys)
683 should be mapped to the mangled names before trying to retrieve
684 them (default to no mappings).
685 """
686 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2Yf1f_e
688 @staticmethod
689 def from_fatbin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
690 """Create an :class:`ObjectCode` instance from an existing fatbin.
692 Parameters
693 ----------
694 module : Union[bytes, str, os.PathLike]
695 Either a bytes object containing the in-memory fatbin to load, or
696 or a file path object (or its string representation) pointing to the
697 on-disk fatbin to load.
698 name : Optional[str]
699 A human-readable identifier representing this code object.
700 symbol_mapping : Optional[dict]
701 A dictionary specifying how the unmangled symbol names (as keys)
702 should be mapped to the mangled names before trying to retrieve
703 them (default to no mappings).
704 """
705 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 20 fbgb
707 @staticmethod
708 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
709 """Create an :class:`ObjectCode` instance from an existing object code.
711 Parameters
712 ----------
713 module : Union[bytes, str]
714 Either a bytes object containing the in-memory object code to load, or
715 a file path string pointing to the on-disk object code to load.
716 name : Optional[str]
717 A human-readable identifier representing this code object.
718 symbol_mapping : Optional[dict]
719 A dictionary specifying how the unmangled symbol names (as keys)
720 should be mapped to the mangled names before trying to retrieve
721 them (default to no mappings).
722 """
723 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping)
725 @staticmethod
726 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
727 """Create an :class:`ObjectCode` instance from an existing library.
729 Parameters
730 ----------
731 module : Union[bytes, str]
732 Either a bytes object containing the in-memory library to load, or
733 a file path string pointing to the on-disk library to load.
734 name : Optional[str]
735 A human-readable identifier representing this code object.
736 symbol_mapping : Optional[dict]
737 A dictionary specifying how the unmangled symbol names (as keys)
738 should be mapped to the mangled names before trying to retrieve
739 them (default to no mappings).
740 """
741 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping)
743 # TODO: do we want to unload in a finalizer? Probably not..
745 cdef int _lazy_load_module(self) except -1:
746 if self._h_library: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m ki)cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
747 return 0 2FbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*bki`eafw bfcf{e|e+b
748 module = self._module 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
749 cdef bytes path_bytes
750 if isinstance(module, str): 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
751 path_bytes = module.encode() 2Z db0 fb
752 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 2Z db0 fb
753 elif isinstance(module, (bytes, bytearray)): 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )c*c+ceb,cgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
754 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )c*c+ceb,cgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
755 elif isinstance(module, PathLike):
756 path_bytes = fsencode(module)
757 self._h_library = create_library_handle_from_file(<const char*>path_bytes)
758 else:
759 assert_type_str_or_bytes_like(module)
760 raise_code_path_meant_to_be_unreachable()
761 return -1
762 if not self._h_library: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
763 HANDLE_RETURN(get_last_error())
764 return 0 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xd`eq Yd1 Zdaf0d1d2d2 3def4d5d6d7d8d9d!d#d$d%d3 'dff(d4 )dgf*d+d,d5 -dhf.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~difaebejfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfcedeee; feyfge= hezfiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0eAfBf1eY 2e}e3e@ 4ebf5e[ 6ecf7ey 8e{e9ez !e|e#ehb$e%eib'e+b]
766 def get_kernel(self, name: str | bytes) -> Kernel:
767 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
769 Parameters
770 ----------
771 name : str | bytes
772 Name of the kernel to retrieve.
774 Returns
775 -------
776 :obj:`~_module.Kernel`
777 Newly created kernel object.
779 """
780 self._lazy_load_module() 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
781 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
782 if self._code_type not in supported_code_types: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb_e-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
783 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2_e
784 try: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
785 name = self._sym_map[name] 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
786 except KeyError: 2^ _ ` { | } ~ abbbs cbc v q 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 @ [ y z hbib+b]
787 if isinstance(name, str): 2^ _ ` { | } ~ abbbs cbc v q 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 @ [ y z hbib+b]
788 name = name.encode() 2^ _ ` { | } ~ abbbs cbc v q 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 @ [ y z hbib+b]
790 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
791 if not h_kernel: 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e+b]
792 HANDLE_RETURN(get_last_error()) 2+b
793 return Kernel._from_handle(h_kernel) 2-b.b/b:b;b=bFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcb d e rcsctc3b4b5b6b7b8b9b!b#b$b%b'b(b)bucvcwcxcyczcAcBcCcDcEc*b^ _ ` { | } ~ abbbs cbFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ca $c%c'cc (ct o f g h i p j k l m )cZ *cdb+ceb,c0 fbgb-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdv Xdq Yd1 Zd0d1d2d2 3d4d5d6d7d8d9d!d#d$d%d3 'd(d4 )d*d+d,d5 -d.d/d:d6 7 8 9 ! # $ % ' ( ) * + , - . / ;d=d?d@d[d]d^d_d`d{d|d}d: ~daebeBbw Cbcedeee; fege= heiejekeB lemeneoepeqereseteueveC wexeD yezeAeBeE CeDeEeFeF G H I J K L M N O P Q R S T U V GeHeIeJeKeLeMeNeOePeQeReW SeTeUeDbx EbVeWeXeX YeZe? 0e1eY 2e3e@ 4e5e[ 6e7ey 8e9ez !e#ehb$e%eib'e]
795 @property
796 def code(self) -> CodeTypeT:
797 """Return the underlying code object."""
798 return self._module 29f!fli#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}fmi0f~fagr XfZ dbeb0 ogfbpggbqgYf1f_eZf!g2f#gbg$gOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3gCicgdgegfggghgigjgkglgmg] 4g)g*g+g,g-g.g/g:g5g;g6g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdh7gehfhghhhihjhng8gkhlh9g
800 @property
801 def name(self) -> str:
802 """Return a human-readable name of this code object."""
803 return self._name 29f!fli#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}fmi0f~fagOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g%g'g(gcgdgegfggghgigjgkglgmgng8g
805 @property
806 def code_type(self) -> str:
807 """Return the type of the underlying code object."""
808 return self._code_type 29f!fli#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}fmi0f~fagXf0 fbgbYf1f_eZf2fcgdgegfggghgigjgkglgmgng9g
810 @property
811 def symbol_mapping(self) -> dict[str, str]:
812 """Return a copy of the symbol mapping dictionary."""
813 return dict(self._sym_map) 2r XfZ dbebogpgqgYf1f_eZf2fbg
815 @property
816 def handle(self) -> object:
817 """Return the underlying handle object.
819 .. caution::
821 This handle is a Python object. To get the memory address of the underlying C
822 handle, call ``int(ObjectCode.handle)``.
823 """
824 self._lazy_load_module() 2ki`e
825 return as_py(self._h_library) 2ki`e
827 def __eq__(self, other: object) -> bool:
828 if not isinstance(other, ObjectCode): 2`ergsgtgugvgwgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgLg}e{e|e
829 return NotImplemented 2`ergsgtgugvgwgDbxgygzgAgBgCgDgEgFgx EbGgHgIgJgKgLg
830 # Trigger lazy load for both objects to compare handles
831 self._lazy_load_module() 2`e}e{e|e
832 (<ObjectCode>other)._lazy_load_module() 2`e}e{e|e
833 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2`e}e{e|e
835 def __hash__(self) -> int:
836 # Trigger lazy load to get the handle
837 self._lazy_load_module() 2afefffgfhfifjfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfyfzfbfcf{e|e
838 return hash(as_intptr(self._h_library)) 2afefffgfhfifjfBbkflfmfnfofpfqfrfsfw Cbtfufvfwfxfyfzfbfcf{e|e
840 def __repr__(self) -> str:
841 # Trigger lazy load to get the handle
842 self._lazy_load_module() 2AfBf+b
843 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2AfBf+b