Coverage for cuda / core / _module.pyx: 88.10%
269 statements
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-22 01:37 +0000
« prev ^ index » next coverage.py v7.14.0, created at 2026-05-22 01:37 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5from __future__ import annotations
7from libc.stddef cimport size_t
9from collections import namedtuple
11from cuda.core._device import Device
12from cuda.core._launch_config cimport LaunchConfig
13from cuda.core._launch_config import LaunchConfig
14from cuda.core._stream cimport Stream, Stream_accept
15from cuda.core._program import ObjectCodeFormatType
16from cuda.core._resource_handles cimport (
17 LibraryHandle,
18 KernelHandle,
19 create_library_handle_from_file,
20 create_library_handle_from_data,
21 create_kernel_handle,
22 create_kernel_handle_ref,
23 get_kernel_library,
24 get_last_error,
25 as_cu,
26 as_py,
27 as_intptr,
28)
29from cuda.core._stream import Stream
30from cuda.core._utils.clear_error_support import (
31 assert_type_str_or_bytes_like,
32 raise_code_path_meant_to_be_unreachable,
33)
34from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
35from cuda.core._utils.version cimport cy_binding_version, cy_driver_version
36from cuda.core._utils.cuda_utils import driver
37from cuda.bindings cimport cydriver
39__all__ = ["Kernel", "ObjectCode"]
42cdef class KernelAttributes:
43 """Read-only view of a kernel's per-device attributes.
45 The default view returned by :attr:`Kernel.attributes` is bound to
46 the current device, resolved at attribute-access time. Use
47 ``kernel.attributes[device]`` to obtain a view bound to a specific
48 device (an :class:`int` device ordinal or :class:`Device`). Per-device
49 views share the underlying cache so a value queried through one view
50 is visible through the others.
51 """
53 def __init__(self, *args, **kwargs):
54 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2qi
56 @staticmethod
57 cdef KernelAttributes _init(KernelHandle h_kernel):
58 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
59 self._h_kernel = h_kernel 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
60 self._device_id = -1 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
61 self._cache = {} 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
62 return self 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
64 cdef KernelAttributes _view_for_device(self, int device_id):
65 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
66 view._h_kernel = self._h_kernel 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
67 view._device_id = device_id 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
68 view._cache = self._cache 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
69 return view 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
71 cdef inline int _effective_device_id(self) except? -1:
72 if self._device_id >= 0: 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
73 return self._device_id 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
74 return Device().device_id 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
76 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1:
77 """Helper function to get a cached attribute or fetch and cache it if not present."""
78 cdef tuple cache_key = (device_id, <int>attribute) 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
79 cached = self._cache.get(cache_key, cache_key) 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
80 if cached is not cache_key: 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
81 return cached 2.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
82 cdef int result
83 with nogil: 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
84 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
85 self._cache[cache_key] = result 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
86 return result 2b d e .bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
88 def __getitem__(self, device) -> KernelAttributes:
89 """Return a view of these attributes bound to a specific device.
91 Parameters
92 ----------
93 device : Device or int
94 The device whose attributes to query. Accepts a :class:`Device`
95 or a device ordinal (:class:`int`).
97 Returns
98 -------
99 KernelAttributes
100 A view bound to ``device`` that shares the underlying cache
101 with this view.
102 """
103 return self._view_for_device(Device(device).device_id) 27g.b,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
105 @property
106 def max_threads_per_block(self) -> int:
107 """int : The maximum number of threads per block.
108 This attribute is read-only."""
109 return self._get_cached_attribute( 2b d e .bs a C u ;e
110 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e .bs a C u ;e
111 )
113 @property
114 def shared_size_bytes(self) -> int:
115 """int : The size in bytes of statically-allocated shared memory required by this function.
116 This attribute is read-only."""
117 return self._get_cached_attribute( 2_e
118 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2_e
119 )
121 @property
122 def const_size_bytes(self) -> int:
123 """int : The size in bytes of user-allocated constant memory required by this function.
124 This attribute is read-only."""
125 return self._get_cached_attribute( 2.e
126 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2.e
127 )
129 @property
130 def local_size_bytes(self) -> int:
131 """int : The size in bytes of local memory used by each thread of this function.
132 This attribute is read-only."""
133 return self._get_cached_attribute( 2n /e
134 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2/e
135 )
137 @property
138 def num_regs(self) -> int:
139 """int : The number of registers used by each thread of this function.
140 This attribute is read-only."""
141 return self._get_cached_attribute( 2.bmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb=e
142 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2.bmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb=e
143 )
145 @property
146 def ptx_version(self) -> int:
147 """int : The PTX virtual architecture version for which the function was compiled.
148 This attribute is read-only."""
149 return self._get_cached_attribute( 2@e
150 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2@e
151 )
153 @property
154 def binary_version(self) -> int:
155 """int : The binary architecture version for which the function was compiled.
156 This attribute is read-only."""
157 return self._get_cached_attribute( 2,e
158 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2,e
159 )
161 @property
162 def cache_mode_ca(self) -> bool:
163 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set.
164 This attribute is read-only."""
165 return bool( 2)e
166 self._get_cached_attribute( 2)e
167 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2)e
168 )
169 )
171 @property
172 def max_dynamic_shared_size_bytes(self) -> int:
173 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used
174 by this function."""
175 return self._get_cached_attribute( 2:e
176 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2:e
177 )
179 @property
180 def preferred_shared_memory_carveout(self) -> int:
181 """int : The shared memory carveout preference, in percent of the total shared memory."""
182 return self._get_cached_attribute( 2?e
183 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2?e
184 )
186 @property
187 def cluster_size_must_be_set(self) -> bool:
188 """bool : The kernel must launch with a valid cluster size specified.
189 This attribute is read-only."""
190 return bool( 2*e
191 self._get_cached_attribute( 2*e
192 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2*e
193 )
194 )
196 @property
197 def required_cluster_width(self) -> int:
198 """int : The required cluster width in blocks."""
199 return self._get_cached_attribute( 2^e
200 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2^e
201 )
203 @property
204 def required_cluster_height(self) -> int:
205 """int : The required cluster height in blocks."""
206 return self._get_cached_attribute( 2]e
207 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2]e
208 )
210 @property
211 def required_cluster_depth(self) -> int:
212 """int : The required cluster depth in blocks."""
213 return self._get_cached_attribute( 2[e
214 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2[e
215 )
217 @property
218 def non_portable_cluster_size_allowed(self) -> bool:
219 """bool : Whether the function can be launched with non-portable cluster size."""
220 return bool( 2+e
221 self._get_cached_attribute( 2+e
222 self._effective_device_id(), 2+e
223 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED,
224 )
225 )
227 @property
228 def cluster_scheduling_policy_preference(self) -> int:
229 """int : The block scheduling policy of a function."""
230 return self._get_cached_attribute( 2-e
231 self._effective_device_id(), 2-e
232 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE,
233 )
236MaxPotentialBlockSizeOccupancyResult = namedtuple("MaxPotential", ("min_grid_size", "max_block_size"))
239cdef class KernelOccupancy:
240 """This class offers methods to query occupancy metrics that help determine optimal
241 launch parameters such as block size, grid size, and shared memory usage.
242 """
244 def __init__(self, *args, **kwargs):
245 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 2ri
247 @staticmethod
248 cdef KernelOccupancy _init(KernelHandle h_kernel):
249 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
250 self._h_kernel = h_kernel 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
251 return self 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
253 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int:
254 """Occupancy of the kernel.
256 Returns the maximum number of active blocks per multiprocessor for this kernel.
258 Parameters
259 ----------
260 block_size: int
261 Block size parameter used to launch this kernel.
262 dynamic_shared_memory_size: int
263 The amount of dynamic shared memory in bytes needed by block.
264 Use `0` if block does not need shared memory.
266 Returns
267 -------
268 int
269 The maximum number of active blocks per multiprocessor.
271 Note
272 ----
273 The fraction of the product of maximum number of active blocks per multiprocessor
274 and the block size to the maximum number of threads per multiprocessor is known as
275 theoretical multiprocessor utilization (occupancy).
277 """
278 cdef int num_blocks
279 cdef int c_block_size = block_size 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb
280 cdef size_t c_shmem_size = dynamic_shared_memory_size 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb
281 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb
282 with nogil: 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb
283 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb
284 &num_blocks, func, c_block_size, c_shmem_size
285 ))
286 return num_blocks 2r mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb
288 def max_potential_block_size(
289 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int
290 ) -> MaxPotentialBlockSizeOccupancyResult:
291 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy.
293 Returns the minimum grid size needed to achieve the maximum occupancy and
294 the maximum block size that can achieve the maximum occupancy.
296 Parameters
297 ----------
298 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize]
299 The amount of dynamic shared memory in bytes needed by block.
300 Use `0` if block does not need shared memory. Use C-callable
301 represented by :obj:`~driver.CUoccupancyB2DSize` to encode
302 amount of needed dynamic shared memory which varies depending
303 on tne block size.
304 block_size_limit: int
305 Known upper limit on the kernel block size. Use `0` to indicate
306 the maximum block size permitted by the device / kernel instead
308 Returns
309 -------
310 :obj:`~MaxPotentialBlockSizeOccupancyResult`
311 An object with `min_grid_size` and `max_block_size` attributes encoding
312 the suggested launch configuration.
314 Note
315 ----
316 Please be advised that use of C-callable that requires Python Global
317 Interpreter Lock may lead to deadlocks.
319 """
320 cdef int min_grid_size, max_block_size
321 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
322 cdef cydriver.CUoccupancyB2DSize callback
323 cdef size_t c_shmem_size
324 cdef int c_block_size_limit = block_size_limit 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
325 if isinstance(dynamic_shared_memory_needed, int): 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
326 c_shmem_size = dynamic_shared_memory_needed 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
327 with nogil: 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
328 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
329 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit
330 ))
331 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
332 # Callback may require GIL, so don't use nogil here
333 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr()
334 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize(
335 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit
336 ))
337 else:
338 raise TypeError( 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
339 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
340 f"got {type(dynamic_shared_memory_needed)}" 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
341 )
342 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2EfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
344 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int:
345 """Dynamic shared memory available per block for given launch configuration.
347 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration.
349 Parameters
350 ----------
351 num_blocks_per_multiprocessor: int
352 Number of blocks to be concurrently executing on a multiprocessor.
353 block_size: int
354 Block size parameter used to launch this kernel.
356 Returns
357 -------
358 int
359 Dynamic shared memory available per block for given launch configuration.
360 """
361 cdef size_t dynamic_smem_size
362 cdef int c_num_blocks = num_blocks_per_multiprocessor 20f1f2f3f4f5f
363 cdef int c_block_size = block_size 20f1f2f3f4f5f
364 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 20f1f2f3f4f5f
365 with nogil: 20f1f2f3f4f5f
366 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 20f1f2f3f4f5f
367 &dynamic_smem_size, func, c_num_blocks, c_block_size
368 ))
369 return dynamic_smem_size 20f1f2f3f4f5f
371 def max_potential_cluster_size(self, config: LaunchConfig, *, stream: Stream) -> int:
372 """Maximum potential cluster size.
374 The maximum potential cluster size for this kernel and given launch configuration.
376 Parameters
377 ----------
378 config: :obj:`~_launch_config.LaunchConfig`
379 Kernel launch configuration. Cluster dimensions in the configuration are ignored.
380 stream: :obj:`~Stream`
381 Keyword-only. The stream on which this kernel is to be launched.
382 Must be passed explicitly; pass ``device.default_stream`` to
383 use the default stream.
385 Returns
386 -------
387 int
388 The maximum cluster size that can be launched for this kernel and launch configuration.
389 """
390 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
391 cdef Stream s = Stream_accept(stream)
392 drv_cfg.hStream = as_cu(s._h_stream)
393 cdef int cluster_size
394 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
395 with nogil:
396 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg))
397 return cluster_size
399 def max_active_clusters(self, config: LaunchConfig, *, stream: Stream) -> int:
400 """Maximum number of active clusters on the target device.
402 The maximum number of clusters that could concurrently execute on the target device.
404 Parameters
405 ----------
406 config: :obj:`~_launch_config.LaunchConfig`
407 Kernel launch configuration.
408 stream: :obj:`~Stream`
409 Keyword-only. The stream on which this kernel is to be launched.
410 Must be passed explicitly; pass ``device.default_stream`` to
411 use the default stream.
413 Returns
414 -------
415 int
416 The maximum number of clusters that could co-exist on the target device.
417 """
418 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
419 cdef Stream s = Stream_accept(stream)
420 drv_cfg.hStream = as_cu(s._h_stream)
421 cdef int num_clusters
422 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
423 with nogil:
424 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg))
425 return num_clusters
428ParamInfo = namedtuple("ParamInfo", ["offset", "size"])
431cdef class Kernel:
432 """Represent a compiled kernel that had been loaded onto the device.
434 Kernel instances can execution when passed directly into the
435 :func:`~launch` function.
437 Directly creating a :obj:`~_module.Kernel` is not supported, and they
438 should instead be created through a :obj:`~_module.ObjectCode` object.
440 """
442 def __init__(self, *args, **kwargs):
443 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 2si
445 @staticmethod
446 cdef Kernel _from_handle(KernelHandle h_kernel):
447 cdef Kernel ker = Kernel.__new__(Kernel) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
448 ker._h_kernel = h_kernel 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
449 ker._attributes = None 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
450 ker._occupancy = None 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
451 return ker 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bbiacbcciccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$cs %ca ef'cC (cu )cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
453 @property
454 def attributes(self) -> KernelAttributes:
455 """Get the read-only attributes of this kernel."""
456 if self._attributes is None: 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
457 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
458 return self._attributes 2b d e 7g.bs a C u mbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDb,e)e-e*e.e/e:e;e+e=e?e@e[e]e^e_e
460 cdef tuple _get_arguments_info(self, bint param_info=False):
461 if cy_driver_version() < (12, 4, 0): 2c t o f g h i p j k l m af
462 raise NotImplementedError(
463 "Driver version 12.4 or newer is required for this function. "
464 f"Using driver version {'.'.join(map(str, cy_driver_version()))}"
465 )
466 if cy_binding_version() < (12, 4, 0): 2c t o f g h i p j k l m af
467 raise NotImplementedError(
468 "cuda.bindings 12.4 or newer is required for this function. "
469 f"Using binding version {'.'.join(map(str, cy_binding_version()))}"
470 )
471 cdef size_t arg_pos = 0 2c t o f g h i p j k l m af
472 cdef list param_info_data = [] 2c t o f g h i p j k l m af
473 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2c t o f g h i p j k l m af
474 cdef size_t param_offset, param_size
475 cdef cydriver.CUresult err
476 while True: 2c t o f g h i p j k l m af
477 with nogil: 2c t o f g h i p j k l m af
478 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2c t o f g h i p j k l m af
479 if err != cydriver.CUDA_SUCCESS: 2c t o f g h i p j k l m af
480 break 2c t o f g h i p j k l m af
481 if param_info: 2c f g h i j k l m af
482 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2f g h i j k l m af
483 arg_pos = arg_pos + 1 2c f g h i j k l m af
484 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2c t o f g h i p j k l m af
485 HANDLE_RETURN(err) 1t
486 return arg_pos, param_info_data 2c o f g h i p j k l m af
488 @property
489 def num_arguments(self) -> int:
490 """int : The number of arguments of this function"""
491 num_args, _ = self._get_arguments_info() 2c t o f g h i p j k l m af
492 return num_args 2c o f g h i p j k l m af
494 @property
495 def arguments_info(self) -> list[ParamInfo]:
496 """list[ParamInfo]: (offset, size) for each argument of this function"""
497 _, param_info = self._get_arguments_info(param_info=True) 2o f g h i p j k l m af
498 return param_info 2o f g h i p j k l m af
500 @property
501 def occupancy(self) -> KernelOccupancy:
502 """Get the occupancy information for launching this kernel."""
503 if self._occupancy is None: 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
504 self._occupancy = KernelOccupancy._init(self._h_kernel) 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
505 return self._occupancy 2r 0f1f2f3f4f5fmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYf
507 @property
508 def handle(self):
509 """Return the underlying kernel handle object.
511 .. caution::
513 This handle is a Python object. To get the memory address of the underlying C
514 handle, call ``int(Kernel.handle)``.
515 """
516 return as_py(self._h_kernel) 2b v tia efC u c w q
518 @property
519 def _handle(self):
520 return self.handle
522 @staticmethod
523 def from_handle(handle, mod: ObjectCode = None) -> Kernel:
524 """Creates a new :obj:`Kernel` object from a kernel handle.
526 Parameters
527 ----------
528 handle : int
529 Kernel handle representing the address of a foreign
530 kernel object (CUkernel).
531 mod : :obj:`ObjectCode`, optional
532 The ObjectCode object associated with this kernel. Provides
533 library lifetime for foreign kernels not created by
534 cuda.core.
535 """
537 if not isinstance(handle, int): 2b s a efC gihiiijikiliminioipiu q
538 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2gihiiijikiliminioipi
540 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b s a efC u q
541 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b s a efC u q
542 if not h_kernel: 2b s a efC u q
543 HANDLE_RETURN(get_last_error())
545 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b s a efC u q
546 cdef LibraryHandle h_caller_lib
548 if mod is not None: 2b s a efC u q
549 h_caller_lib = (<ObjectCode>mod)._h_library 2a efu
550 if h_existing_lib and h_caller_lib: 2a efu
551 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a efu
552 import warnings 1a
553 warnings.warn( 1a
554 "The library from the provided ObjectCode does not match "
555 "the library associated with this kernel.",
556 stacklevel=2,
557 )
559 cdef Kernel k = Kernel._from_handle(h_kernel) 2b s a efC u q
560 if mod is not None and not h_existing_lib: 2b s a efC u q
561 k._keepalive = mod
562 return k 2b s a efC u q
564 def __eq__(self, other) -> bool:
565 if not isinstance(other, Kernel): 2biciw q D E F G H I J K L M N O P Q R S T U V W X Y y Z 0 z A
566 return NotImplemented 1wDEFGHIJKLMNOPQRSTUVWXYyZ
567 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2biciw q 0 z A
569 def __hash__(self) -> int:
570 return hash(as_intptr(self._h_kernel)) 1q23456789!#$%'()*+,-./:;x=?[]zA
572 def __repr__(self) -> str:
573 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1@
576CodeTypeT = bytes | bytearray | str
578cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values())
580cdef class ObjectCode:
581 """Represent a compiled program to be loaded onto the device.
583 This object provides a unified interface for different types of
584 compiled programs that will be loaded onto the device.
586 Note
587 ----
588 This class has no default constructor. If you already have a cubin that you would
589 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
590 from all other possible code types should be avoided in favor of compilation through
591 :class:`~cuda.core.Program`
592 """
594 def __init__(self, *args, **kwargs):
595 raise RuntimeError( 2ui
596 "ObjectCode objects cannot be instantiated directly. "
597 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
598 )
600 @classmethod
601 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict | None = None):
602 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
603 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
605 # _h_library is assigned during _lazy_load_module
606 self._h_library = LibraryHandle() # Empty handle 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
608 self._code_type = str(code_type) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
609 self._module = module 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
610 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
611 self._name = name if name else "" 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
613 return self 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c8fih9fjhkh!flh#fmh$fnh%foh'fph(fqh)frh*fsh+fth,fuh-fvh.fwh/fxh:fyh;fzh=fAh?fBh@fCh[fDh]fEh^fFh_fGh`fHh{fIhJh|fKhLh6fMh}fNh~fOhv #c$cs %ca 'c(c)cc Zf*ct o f g h i p j k l m +ceb,cfb-cgbmghbng7fPh`eQh1 8gib9g.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meogneoepeqereseteueveweE xepgyeF zeqgAeBeCeG DergEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TesgUeVetgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgWeXeYeZ ZeIgJgKg0e@ 1eBfCfDfag2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%eRh'ekb(eShLgMgThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{h|hlbNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdg}hegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfh~hlg5gghhh6gai
615 @staticmethod
616 def _reduce_helper(module, code_type, name, symbol_mapping):
617 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2ZfJgKg
619 def __reduce__(self):
620 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2ZfJgKg
622 @staticmethod
623 def from_cubin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
624 """Create an :class:`ObjectCode` instance from an existing cubin.
626 Parameters
627 ----------
628 module : Union[bytes, str]
629 Either a bytes object containing the in-memory cubin to load, or
630 a file path string pointing to the on-disk cubin to load.
631 name : Optional[str]
632 A human-readable identifier representing this code object.
633 symbol_mapping : Optional[dict]
634 A dictionary specifying how the unmangled symbol names (as keys)
635 should be mapped to the mangled names before trying to retrieve
636 them (default to no mappings).
637 """
638 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2ebfb1g2g3g4g
640 @staticmethod
641 def from_ptx(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
642 """Create an :class:`ObjectCode` instance from an existing PTX.
644 Parameters
645 ----------
646 module : Union[bytes, str]
647 Either a bytes object containing the in-memory ptx code to load, or
648 a file path string pointing to the on-disk ptx file to load.
649 name : Optional[str]
650 A human-readable identifier representing this code object.
651 symbol_mapping : Optional[dict]
652 A dictionary specifying how the unmangled symbol names (as keys)
653 should be mapped to the mangled names before trying to retrieve
654 them (default to no mappings).
655 """
656 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 26f1 ib
658 @staticmethod
659 def from_ltoir(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
660 """Create an :class:`ObjectCode` instance from an existing LTOIR.
662 Parameters
663 ----------
664 module : Union[bytes, str]
665 Either a bytes object containing the in-memory ltoir code to load, or
666 a file path string pointing to the on-disk ltoir file to load.
667 name : Optional[str]
668 A human-readable identifier representing this code object.
669 symbol_mapping : Optional[dict]
670 A dictionary specifying how the unmangled symbol names (as keys)
671 should be mapped to the mangled names before trying to retrieve
672 them (default to no mappings).
673 """
674 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 27f`e
676 @staticmethod
677 def from_fatbin(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
678 """Create an :class:`ObjectCode` instance from an existing fatbin.
680 Parameters
681 ----------
682 module : Union[bytes, str]
683 Either a bytes object containing the in-memory fatbin to load, or
684 a file path string pointing to the on-disk fatbin to load.
685 name : Optional[str]
686 A human-readable identifier representing this code object.
687 symbol_mapping : Optional[dict]
688 A dictionary specifying how the unmangled symbol names (as keys)
689 should be mapped to the mangled names before trying to retrieve
690 them (default to no mappings).
691 """
692 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 2gbhb
694 @staticmethod
695 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
696 """Create an :class:`ObjectCode` instance from an existing object code.
698 Parameters
699 ----------
700 module : Union[bytes, str]
701 Either a bytes object containing the in-memory object code to load, or
702 a file path string pointing to the on-disk object code to load.
703 name : Optional[str]
704 A human-readable identifier representing this code object.
705 symbol_mapping : Optional[dict]
706 A dictionary specifying how the unmangled symbol names (as keys)
707 should be mapped to the mangled names before trying to retrieve
708 them (default to no mappings).
709 """
710 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping)
712 @staticmethod
713 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict | None = None) -> ObjectCode:
714 """Create an :class:`ObjectCode` instance from an existing library.
716 Parameters
717 ----------
718 module : Union[bytes, str]
719 Either a bytes object containing the in-memory library to load, or
720 a file path string pointing to the on-disk library to load.
721 name : Optional[str]
722 A human-readable identifier representing this code object.
723 symbol_mapping : Optional[dict]
724 A dictionary specifying how the unmangled symbol names (as keys)
725 should be mapped to the mangled names before trying to retrieve
726 them (default to no mappings).
727 """
728 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping)
730 # TODO: do we want to unload in a finalizer? Probably not..
732 cdef int _lazy_load_module(self) except -1:
733 if self._h_library: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m di+ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
734 return 0 2IbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-bv di{ebfx cfdf|e}e
735 module = self._module 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
736 assert_type_str_or_bytes_like(module) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
737 cdef bytes path_bytes
738 if isinstance(module, str): 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
739 path_bytes = module.encode() 2ebgb1
740 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 2ebgb1
741 if not self._h_library: 2ebgb1
742 HANDLE_RETURN(get_last_error())
743 return 0 2ebgb1
744 if isinstance(module, (bytes, bytearray)): 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
745 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
746 if not self._h_library: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
747 HANDLE_RETURN(get_last_error())
748 return 0 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +c,cfb-chb`eib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Yd{eq Zd2 0dbf1d2d3d3 4dff5d6d7d8d9d!d#d$d%d'd4 (dgf)d5 *dhf+d,d-d6 .dif/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aejfbecekfEblfmfnfofpfqfrfsftfx Fbufvfwfxfyfdeeefe= gezfhe? ieAfjekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1eBfCfDf2e0 3e~e4e[ 5ecf6e] 7edf8ez 9e|e!eA #e}e$ejb%e'ekb(elbB ^
749 raise_code_path_meant_to_be_unreachable()
750 return -1
752 def get_kernel(self, name) -> Kernel:
753 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
755 Parameters
756 ----------
757 name : str | bytes
758 Name of the kernel to retrieve.
760 Returns
761 -------
762 :obj:`~_module.Kernel`
763 Newly created kernel object.
765 """
766 self._lazy_load_module() 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
767 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
768 if self._code_type not in supported_code_types: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb`e1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
769 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2`e
770 try: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
771 name = self._sym_map[name] 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
772 except KeyError: 2_ ` { | } ~ abbbcbr dbv c w q 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; x = ? D E F G H I J K L M N O P Q R S T U V W X Y y Z @ 0 [ ] z A jbkblbB ^
773 if isinstance(name, str): 2_ ` { | } ~ abbbcbr dbv c w q 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; x = ? D E F G H I J K L M N O P Q R S T U V W X Y y Z @ 0 [ ] z A jbkblbB ^
774 name = name.encode() 2_ ` { | } ~ abbbcbr dbv c w q 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; x = ? D E F G H I J K L M N O P Q R S T U V W X Y y Z @ 0 [ ] z A jbkblbB ^
776 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
777 if not h_kernel: 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
778 HANDLE_RETURN(get_last_error())
779 return Kernel._from_handle(h_kernel) 2/b:b;b=b?b@bIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcscb d e tcucvc6b7b8b9b!b#b$b%b'b(b)b*b+b,bwcxcyczcAcBcCcDcEcFcGc-b_ ` { | } ~ abbbcbr dbHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!cv #c$c%ca 'c(c)cc *ct o f g h i p j k l m +ceb,cfb-cgbhb1 ib.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdw Ydq Zd2 0d1d2d3d3 4d5d6d7d8d9d!d#d$d%d'd4 (d)d5 *d+d,d-d6 .d/d:d;d7 8 9 ! # $ % ' ( ) * + , - . / : =d?d@d[d]d^d_d`d{d|d}d~d; aebeceEbx Fbdeeefe= gehe? iejekeleD meneoepeqereseteueveweE xeyeF zeAeBeCeG DeEeFeGeH I J K L M N O P Q R S T U V W X HeIeJeKeLeMeNeOePeQeReSeY TeUeVeGby HbWeXeYeZ Ze0e@ 1e2e0 3e4e[ 5e6e] 7e8ez 9e!eA #e$ejb%e'ekb(elbB ^
781 @property
782 def code(self) -> CodeTypeT:
783 """Return the underlying code object."""
784 return self._module 28f9fei!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|ffi6f}f~fs Zfebfbgbmghbng7f`e1 8gib9gagLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0gB vibgcgdgegfggghgigjgkg^ 1g$g%g'g(g)g*g+g,g2g-g3g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~g4gahbhchdhehfhlg5gghhh6g
786 @property
787 def name(self) -> str:
788 """Return a human-readable name of this code object."""
789 return self._name 28f9fei!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|ffi6f}f~fagLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g!g#gB bgcgdgegfggghgigjgkglg5g
791 @property
792 def code_type(self) -> str:
793 """Return the type of the underlying code object."""
794 return self._code_type 28f9fei!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|ffi6f}f~fZfgbhb7f`e1 agB bgcgdgegfggghgigjgkglg6g
796 @property
797 def symbol_mapping(self) -> dict:
798 """Return a copy of the symbol mapping dictionary."""
799 return dict(self._sym_map) 2s Zfebfbmgng7f`e1 ib
801 @property
802 def handle(self):
803 """Return the underlying handle object.
805 .. caution::
807 This handle is a Python object. To get the memory address of the underlying C
808 handle, call ``int(ObjectCode.handle)``.
809 """
810 self._lazy_load_module() 2v di{e
811 return as_py(self._h_library) 2v di{e
813 def __eq__(self, other) -> bool:
814 if not isinstance(other, ObjectCode): 2{eogpgqgrgsgtgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgIg~e|e}e
815 return NotImplemented 2{eogpgqgrgsgtgGbugvgwgxgygzgAgBgCgy HbDgEgFgGgHgIg
816 # Trigger lazy load for both objects to compare handles
817 self._lazy_load_module() 2{e~e|e}e
818 (<ObjectCode>other)._lazy_load_module() 2{e~e|e}e
819 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2{e~e|e}e
821 def __hash__(self) -> int:
822 # Trigger lazy load to get the handle
823 self._lazy_load_module() 2bfffgfhfifjfkfEblfmfnfofpfqfrfsftfx FbufvfwfxfyfzfAfcfdf|e}e
824 return hash(as_intptr(self._h_library)) 2bfffgfhfifjfkfEblfmfnfofpfqfrfsftfx FbufvfwfxfyfzfAfcfdf|e}e
826 def __repr__(self) -> str:
827 # Trigger lazy load to get the handle
828 self._lazy_load_module() 2BfCfDf
829 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2BfCfDf