Coverage for cuda/core/_module.pyx: 87.59%
282 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-29 01:38 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-29 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
7cimport cython
8from libc.stddef cimport size_t
9from libc.stdint cimport intptr_t
11from collections import namedtuple
12from os import fsencode, fspath, PathLike
14from cuda.core._device import Device
15from cuda.core._launch_config cimport LaunchConfig
16from cuda.core._launch_config import LaunchConfig
17from cuda.core._stream cimport Stream, Stream_accept
18from cuda.core._program import ObjectCodeFormatType
19from cuda.core._resource_handles cimport (
20 LibraryHandle,
21 KernelHandle,
22 create_library_handle_from_file,
23 create_library_handle_from_data,
24 create_kernel_handle,
25 create_kernel_handle_ref,
26 get_kernel_library,
27 get_last_error,
28 as_cu,
29 as_py,
30 as_intptr,
31)
32from cuda.core._stream import Stream
33from cuda.core._utils.clear_error_support import (
34 assert_type_str_or_bytes_like,
35 raise_code_path_meant_to_be_unreachable,
36)
37from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
38from cuda.core._utils.version cimport cy_binding_version, cy_driver_version
39from cuda.core._utils.cuda_utils import driver
40from cuda.bindings cimport cydriver
42__all__ = ["Kernel", "ObjectCode"]
45cdef class KernelAttributes:
46 """Read-only view of a kernel's per-device attributes.
48 The default view returned by :attr:`Kernel.attributes` is bound to
49 the current device, resolved at attribute-access time. Use
50 ``kernel.attributes[device]`` to obtain a view bound to a specific
51 device (an :class:`int` device ordinal or :class:`Device`). Per-device
52 views share the underlying cache so a value queried through one view
53 is visible through the others.
54 """
56 def __init__(self, *args, **kwargs) -> None:
57 raise RuntimeError("KernelAttributes cannot be instantiated directly. Please use Kernel APIs.") 2Ri
59 @staticmethod
60 cdef KernelAttributes _init(KernelHandle h_kernel):
61 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
62 self._h_kernel = h_kernel 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
63 self._device_id = -1 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
64 self._cache = {} 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
65 return self 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
67 cdef KernelAttributes _view_for_device(self, int device_id):
68 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
69 view._h_kernel = self._h_kernel 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
70 view._device_id = device_id 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
71 view._cache = self._cache 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
72 return view 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
74 cdef inline int _effective_device_id(self) except? -1:
75 if self._device_id >= 0: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
76 return self._device_id 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
77 return Device().device_id 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
79 cdef int _get_cached_attribute(self, int device_id, cydriver.CUfunction_attribute attribute) except? -1:
80 """Helper function to get a cached attribute or fetch and cache it if not present."""
81 cdef tuple cache_key = (device_id, <int>attribute) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
82 cached = self._cache.get(cache_key, cache_key) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
83 if cached is not cache_key: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
84 return cached 2=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
85 cdef int result
86 with nogil: 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
87 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
88 self._cache[cache_key] = result # setdefault not needed for ints 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
89 return result 2b d e =br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
91 def __getitem__(self, device: Device | int) -> KernelAttributes:
92 """Return a view of these attributes bound to a specific device.
94 Parameters
95 ----------
96 device : Device or int
97 The device whose attributes to query. Accepts a :class:`Device`
98 or a device ordinal (:class:`int`).
100 Returns
101 -------
102 KernelAttributes
103 A view bound to ``device`` that shares the underlying cache
104 with this view.
105 """
106 return self._view_for_device(Device(device).device_id) 2Gh=b{e^e|e_e}e~eafbf`ecfdfefffgfhfif
108 @property
109 def max_threads_per_block(self) -> int:
110 """int : The maximum number of threads per block.
111 This attribute is read-only."""
112 return self._get_cached_attribute( 2b d e =br a C u bf
113 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b d e =br a C u bf
114 )
116 @property
117 def shared_size_bytes(self) -> int:
118 """int : The size in bytes of statically-allocated shared memory required by this function.
119 This attribute is read-only."""
120 return self._get_cached_attribute( 2if
121 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2if
122 )
124 @property
125 def const_size_bytes(self) -> int:
126 """int : The size in bytes of user-allocated constant memory required by this function.
127 This attribute is read-only."""
128 return self._get_cached_attribute( 2}e
129 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 2}e
130 )
132 @property
133 def local_size_bytes(self) -> int:
134 """int : The size in bytes of local memory used by each thread of this function.
135 This attribute is read-only."""
136 return self._get_cached_attribute( 2~e
137 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 2~e
138 )
140 @property
141 def num_regs(self) -> int:
142 """int : The number of registers used by each thread of this function.
143 This attribute is read-only."""
144 return self._get_cached_attribute( 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf
145 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2=blbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcf
146 )
148 @property
149 def ptx_version(self) -> int:
150 """int : The PTX virtual architecture version for which the function was compiled.
151 This attribute is read-only."""
152 return self._get_cached_attribute( 2ef
153 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 2ef
154 )
156 @property
157 def binary_version(self) -> int:
158 """int : The binary architecture version for which the function was compiled.
159 This attribute is read-only."""
160 return self._get_cached_attribute( 2{e
161 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 2{e
162 )
164 @property
165 def cache_mode_ca(self) -> bool:
166 """bool : Whether the function has been compiled with user specified option "-Xptxas --dlcm=ca" set.
167 This attribute is read-only."""
168 return bool( 2^e
169 self._get_cached_attribute( 2^e
170 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2^e
171 )
172 )
174 @property
175 def max_dynamic_shared_size_bytes(self) -> int:
176 """int : The maximum size in bytes of dynamically-allocated shared memory that can be used
177 by this function."""
178 return self._get_cached_attribute( 2af
179 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 2af
180 )
182 @property
183 def preferred_shared_memory_carveout(self) -> int:
184 """int : The shared memory carveout preference, in percent of the total shared memory."""
185 return self._get_cached_attribute( 2df
186 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 2df
187 )
189 @property
190 def cluster_size_must_be_set(self) -> bool:
191 """bool : The kernel must launch with a valid cluster size specified.
192 This attribute is read-only."""
193 return bool( 2_e
194 self._get_cached_attribute( 2_e
195 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2_e
196 )
197 )
199 @property
200 def required_cluster_width(self) -> int:
201 """int : The required cluster width in blocks."""
202 return self._get_cached_attribute( 2hf
203 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2hf
204 )
206 @property
207 def required_cluster_height(self) -> int:
208 """int : The required cluster height in blocks."""
209 return self._get_cached_attribute( 2gf
210 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2gf
211 )
213 @property
214 def required_cluster_depth(self) -> int:
215 """int : The required cluster depth in blocks."""
216 return self._get_cached_attribute( 2ff
217 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 2ff
218 )
220 @property
221 def non_portable_cluster_size_allowed(self) -> bool:
222 """bool : Whether the function can be launched with non-portable cluster size."""
223 return bool( 2`e
224 self._get_cached_attribute( 2`e
225 self._effective_device_id(), 2`e
226 cydriver.CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED,
227 )
228 )
230 @property
231 def cluster_scheduling_policy_preference(self) -> int:
232 """int : The block scheduling policy of a function."""
233 return self._get_cached_attribute( 2|e
234 self._effective_device_id(), 2|e
235 cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE,
236 )
239MaxPotentialBlockSizeOccupancyResult = namedtuple(
240 "MaxPotentialBlockSizeOccupancyResult", ("min_grid_size", "max_block_size")
241)
244cdef class KernelOccupancy:
245 """This class offers methods to query occupancy metrics that help determine optimal
246 launch parameters such as block size, grid size, and shared memory usage.
247 """
249 def __init__(self, *args, **kwargs) -> None:
250 raise RuntimeError("KernelOccupancy cannot be instantiated directly. Please use Kernel APIs.") 2Si
252 @staticmethod
253 cdef KernelOccupancy _init(KernelHandle h_kernel):
254 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
255 self._h_kernel = h_kernel 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
256 return self 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
258 def max_active_blocks_per_multiprocessor(self, block_size: int, dynamic_shared_memory_size: int) -> int:
259 """Occupancy of the kernel.
261 Returns the maximum number of active blocks per multiprocessor for this kernel.
263 Parameters
264 ----------
265 block_size: int
266 Block size parameter used to launch this kernel.
267 dynamic_shared_memory_size: int
268 The amount of dynamic shared memory in bytes needed by block.
269 Use `0` if block does not need shared memory.
271 Returns
272 -------
273 int
274 The maximum number of active blocks per multiprocessor.
276 Note
277 ----
278 The fraction of the product of maximum number of active blocks per multiprocessor
279 and the block size to the maximum number of threads per multiprocessor is known as
280 theoretical multiprocessor utilization (occupancy).
282 """
283 cdef int num_blocks
284 cdef int c_block_size = block_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
285 cdef size_t c_shmem_size = dynamic_shared_memory_size 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
286 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
287 with nogil: 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
288 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
289 &num_blocks, func, c_block_size, c_shmem_size
290 ))
291 return num_blocks 2s lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb
293 def max_potential_block_size(
294 self, dynamic_shared_memory_needed: int | driver.CUoccupancyB2DSize, block_size_limit: int
295 ) -> MaxPotentialBlockSizeOccupancyResult:
296 """MaxPotentialBlockSizeOccupancyResult: Suggested launch configuration for reasonable occupancy.
298 Returns the minimum grid size needed to achieve the maximum occupancy and
299 the maximum block size that can achieve the maximum occupancy.
301 Parameters
302 ----------
303 dynamic_shared_memory_needed: Union[int, driver.CUoccupancyB2DSize]
304 The amount of dynamic shared memory in bytes needed by block.
305 Use `0` if block does not need shared memory. Use C-callable
306 represented by :obj:`~driver.CUoccupancyB2DSize` to encode
307 amount of needed dynamic shared memory which varies depending
308 on tne block size.
309 block_size_limit: int
310 Known upper limit on the kernel block size. Use `0` to indicate
311 the maximum block size permitted by the device / kernel instead
313 Returns
314 -------
315 :obj:`~MaxPotentialBlockSizeOccupancyResult`
316 An object with `min_grid_size` and `max_block_size` attributes encoding
317 the suggested launch configuration.
319 Note
320 ----
321 Please be advised that use of C-callable that requires Python Global
322 Interpreter Lock may lead to deadlocks.
324 """
325 cdef int min_grid_size, max_block_size
326 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
327 cdef cydriver.CUoccupancyB2DSize callback
328 cdef size_t c_shmem_size
329 cdef int c_block_size_limit = block_size_limit 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
330 if isinstance(dynamic_shared_memory_needed, int): 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
331 c_shmem_size = dynamic_shared_memory_needed 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
332 with nogil: 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
333 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
334 &min_grid_size, &max_block_size, func, NULL, c_shmem_size, c_block_size_limit
335 ))
336 elif isinstance(dynamic_shared_memory_needed, driver.CUoccupancyB2DSize): 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
337 # Callback may require GIL, so don't use nogil here
338 callback = <cydriver.CUoccupancyB2DSize><size_t>dynamic_shared_memory_needed.getPtr()
339 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize(
340 &min_grid_size, &max_block_size, func, callback, 0, c_block_size_limit
341 ))
342 else:
343 raise TypeError( 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
344 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
345 f"got {type(dynamic_shared_memory_needed)}" 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
346 )
347 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2UfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
349 def available_dynamic_shared_memory_per_block(self, num_blocks_per_multiprocessor: int, block_size: int) -> int:
350 """Dynamic shared memory available per block for given launch configuration.
352 The amount of dynamic shared memory per block, in bytes, for given kernel launch configuration.
354 Parameters
355 ----------
356 num_blocks_per_multiprocessor: int
357 Number of blocks to be concurrently executing on a multiprocessor.
358 block_size: int
359 Block size parameter used to launch this kernel.
361 Returns
362 -------
363 int
364 Dynamic shared memory available per block for given launch configuration.
365 """
366 cdef size_t dynamic_smem_size
367 cdef int c_num_blocks = num_blocks_per_multiprocessor 2.f/f:f;f=f?f
368 cdef int c_block_size = block_size 2.f/f:f;f=f?f
369 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2.f/f:f;f=f?f
370 with nogil: 2.f/f:f;f=f?f
371 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2.f/f:f;f=f?f
372 &dynamic_smem_size, func, c_num_blocks, c_block_size
373 ))
374 return dynamic_smem_size 2.f/f:f;f=f?f
376 def max_potential_cluster_size(self, config: LaunchConfig, *, stream: Stream) -> int:
377 """Maximum potential cluster size.
379 The maximum potential cluster size for this kernel and given launch configuration.
381 Parameters
382 ----------
383 config: :obj:`~_launch_config.LaunchConfig`
384 Kernel launch configuration. Cluster dimensions in the configuration are ignored.
385 stream: :obj:`~Stream`
386 Keyword-only. The stream on which this kernel is to be launched.
387 Must be passed explicitly; pass ``device.default_stream`` to
388 use the default stream.
390 Returns
391 -------
392 int
393 The maximum cluster size that can be launched for this kernel and launch configuration.
394 """
395 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
396 cdef Stream s = Stream_accept(stream)
397 drv_cfg.hStream = as_cu(s._h_stream)
398 cdef int cluster_size
399 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
400 with nogil:
401 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialClusterSize(&cluster_size, func, &drv_cfg))
402 return cluster_size
404 def max_active_clusters(self, config: LaunchConfig, *, stream: Stream) -> int:
405 """Maximum number of active clusters on the target device.
407 The maximum number of clusters that could concurrently execute on the target device.
409 Parameters
410 ----------
411 config: :obj:`~_launch_config.LaunchConfig`
412 Kernel launch configuration.
413 stream: :obj:`~Stream`
414 Keyword-only. The stream on which this kernel is to be launched.
415 Must be passed explicitly; pass ``device.default_stream`` to
416 use the default stream.
418 Returns
419 -------
420 int
421 The maximum number of clusters that could co-exist on the target device.
422 """
423 cdef cydriver.CUlaunchConfig drv_cfg = (<LaunchConfig>config)._to_native_launch_config()
424 cdef Stream s = Stream_accept(stream)
425 drv_cfg.hStream = as_cu(s._h_stream)
426 cdef int num_clusters
427 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel)
428 with nogil:
429 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveClusters(&num_clusters, func, &drv_cfg))
430 return num_clusters
433ParamInfo = namedtuple("ParamInfo", ["offset", "size"])
436cdef class Kernel:
437 """Represent a compiled kernel that had been loaded onto the device.
439 Kernel instances can execution when passed directly into the
440 :func:`~launch` function.
442 Directly creating a :obj:`~_module.Kernel` is not supported, and they
443 should instead be created through a :obj:`~_module.ObjectCode` object.
445 """
447 def __init__(self, *args, **kwargs) -> None:
448 raise RuntimeError("Kernel objects cannot be instantiated directly. Please use ObjectCode APIs.") 2Ti
450 @staticmethod
451 cdef Kernel _from_handle(KernelHandle h_kernel):
452 cdef Kernel ker = Kernel.__new__(Kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca vf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
453 ker._h_kernel = h_kernel 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca vf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
454 ker._attributes = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca vf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
455 ker._occupancy = None 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca vf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
456 return ker 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcCincocDipcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=cr ?ca vf@cC [cu ]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
458 @property
459 @cython.critical_section
460 def attributes(self) -> KernelAttributes:
461 """Get the read-only attributes of this kernel."""
462 if self._attributes is None: 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
463 self._attributes = KernelAttributes._init(self._h_kernel) 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
464 return self._attributes 2b d e Gh=br a C u lbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb{e^e|e_e}e~eafbf`ecfdfefffgfhfif
466 cdef tuple _get_arguments_info(self, bint param_info=False):
467 if cy_driver_version() < (12, 4, 0): 2c t o f g h i p j k l m rf
468 raise NotImplementedError(
469 "Driver version 12.4 or newer is required for this function. "
470 f"Using driver version {'.'.join(map(str, cy_driver_version()))}"
471 )
472 if cy_binding_version() < (12, 4, 0): 2c t o f g h i p j k l m rf
473 raise NotImplementedError(
474 "cuda.bindings 12.4 or newer is required for this function. "
475 f"Using binding version {'.'.join(map(str, cy_binding_version()))}"
476 )
477 cdef size_t arg_pos = 0 2c t o f g h i p j k l m rf
478 cdef list param_info_data = [] 2c t o f g h i p j k l m rf
479 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2c t o f g h i p j k l m rf
480 cdef size_t param_offset, param_size
481 cdef cydriver.CUresult err
482 while True: 2c t o f g h i p j k l m rf
483 with nogil: 2c t o f g h i p j k l m rf
484 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2c t o f g h i p j k l m rf
485 if err != cydriver.CUDA_SUCCESS: 2c t o f g h i p j k l m rf
486 break 2c t o f g h i p j k l m rf
487 if param_info: 2c f g h i j k l m rf
488 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2f g h i j k l m rf
489 arg_pos = arg_pos + 1 2c f g h i j k l m rf
490 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2c t o f g h i p j k l m rf
491 HANDLE_RETURN(err) 1t
492 return arg_pos, param_info_data 2c o f g h i p j k l m rf
494 @property
495 def num_arguments(self) -> int:
496 """int : The number of arguments of this function"""
497 num_args, _ = self._get_arguments_info() 2c t o f g h i p j k l m rf
498 return num_args 2c o f g h i p j k l m rf
500 @property
501 def arguments_info(self) -> list[ParamInfo]:
502 """list[ParamInfo]: (offset, size) for each argument of this function"""
503 _, param_info = self._get_arguments_info(param_info=True) 2o f g h i p j k l m rf
504 return param_info 2o f g h i p j k l m rf
506 @property
507 @cython.critical_section
508 def occupancy(self) -> KernelOccupancy:
509 """Get the occupancy information for launching this kernel."""
510 if self._occupancy is None: 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
511 self._occupancy = KernelOccupancy._init(self._h_kernel) 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
512 return self._occupancy 2s .f/f:f;f=f?flbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f
514 @property
515 def handle(self) -> object:
516 """Return the underlying kernel handle object.
518 .. caution::
520 This handle is a Python object. To get the memory address of the underlying C
521 handle, call ``int(Kernel.handle)``.
522 """
523 return as_py(self._h_kernel) 2b Uia vfC u c x q
525 @property
526 def _handle(self) -> object:
527 return self.handle
529 @staticmethod
530 def from_handle(handle, mod: ObjectCode | None = None) -> Kernel:
531 """Creates a new :obj:`Kernel` object from a kernel handle.
533 Parameters
534 ----------
535 handle : int
536 Kernel handle representing the address of a foreign
537 kernel object (CUkernel).
538 mod : :obj:`ObjectCode`, optional
539 The ObjectCode object associated with this kernel. Provides
540 library lifetime for foreign kernels not created by
541 cuda.core.
542 """
544 if not isinstance(handle, int): 2b r a vfC HiIiJiKiLiMiNiOiPiQiu q
545 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 2HiIiJiKiLiMiNiOiPiQi
547 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b r a vfC u q
548 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a vfC u q
549 if not h_kernel: 2b r a vfC u q
550 HANDLE_RETURN(get_last_error())
552 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a vfC u q
553 cdef LibraryHandle h_caller_lib
555 if mod is not None: 2b r a vfC u q
556 h_caller_lib = (<ObjectCode>mod)._h_library 2a vfu
557 if h_existing_lib and h_caller_lib: 2a vfu
558 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a vfu
559 import warnings 1a
560 warnings.warn( 1a
561 "The library from the provided ObjectCode does not match "
562 "the library associated with this kernel.",
563 stacklevel=2,
564 )
566 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a vfC u q
567 if mod is not None and not h_existing_lib: 2b r a vfC u q
568 k._keepalive = mod
569 return k 2b r a vfC u q
571 def __eq__(self, other: object) -> bool:
572 if not isinstance(other, Kernel): 2CiDix q D E F G H I J K L M N O P Q R S T U V W X Y z Z 0 A B
573 return NotImplemented 1xDEFGHIJKLMNOPQRSTUVWXYzZ
574 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2CiDix q 0 A B
576 def __hash__(self) -> int:
577 return hash(as_intptr(self._h_kernel)) 1q3456789!#$%'()*+,-./:;=y?@]^AB
579 def __repr__(self) -> str:
580 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 1[
583CodeTypeT = bytes | bytearray | str
585cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values())
587cdef class ObjectCode:
588 """Represent a compiled program to be loaded onto the device.
590 This object provides a unified interface for different types of
591 compiled programs that will be loaded onto the device.
593 Note
594 ----
595 This class has no default constructor. If you already have a cubin that you would
596 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
597 from all other possible code types should be avoided in favor of compilation through
598 :class:`~cuda.core.Program`
599 """
601 def __init__(self, *args, **kwargs) -> None:
602 raise RuntimeError( 2Vi
603 "ObjectCode objects cannot be instantiated directly. "
604 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
605 )
607 @classmethod
608 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
609 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
610 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
612 # _h_library is assigned during _lazy_load_module
613 self._h_library = LibraryHandle() # Empty handle 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
615 self._code_type = str(code_type) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
617 if isinstance(module, (str, bytes, bytearray)): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
618 self._module = module 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c`cfb{cgb|cIghbJgibKg(h,f)hjf*h^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
619 elif isinstance(module, PathLike): 21 2 )f*f
620 self._module = fspath(module) 21 2 )f*f
621 else:
622 self._module = module
623 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
624 self._name = name if name else "" 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
626 return self 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c@fHh[fIhJh]fKh^fLh_fMh`fNh{fOh|fPh}fQh~fRhagShbgThcgUhdgVhegWhfgXhggYhhgZhig0hjg1hkg2hlg3hmg4hng5hog6hpg7h8hqg9h!h+f#hrg$hsg%h'h;c=cr ?ca @c[c]cc (f^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 IghbJgibKg)f(h,f)hjf*h*f^g-f_gtg`glfmfugvgv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeLgBeCeDeEeFeGeHeIeJeKeE LeMgMeF NeNgOePeQeG ReOgSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7ePg8e9eQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g!e#e$eZ %e5g6g7g'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e+h[ekb]e,h8g9g-h.h/h:h;h=h?h@h[h]h^h_h`h{h|h}h~haibicidieifigihiiijikiliminioipiqirisitiuiviwixiyi;b!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgziFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhAiHg[gEhFh]gBi
628 @staticmethod
629 def _reduce_helper(module, code_type, name, symbol_mapping):
630 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2(f6g7g
632 def __reduce__(self) -> tuple[object, ...]:
633 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2(f6g7g
635 @staticmethod
636 def from_cubin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
637 """Create an :class:`ObjectCode` instance from an existing cubin.
639 Parameters
640 ----------
641 module : Union[bytes, str, os.PathLike]
642 Either a bytes object containing the in-memory cubin to load, or
643 a file path object (or its string representation) pointing to the
644 on-disk cubin to load.
645 name : Optional[str]
646 A human-readable identifier representing this code object.
647 symbol_mapping : Optional[dict]
648 A dictionary specifying how the unmangled symbol names (as keys)
649 should be mapped to the mangled names before trying to retrieve
650 them (default to no mappings).
651 """
652 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 21 fbgb;g=g?g@g
654 @staticmethod
655 def from_ptx(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
656 """Create an :class:`ObjectCode` instance from an existing PTX.
658 Parameters
659 ----------
660 module : Union[bytes, str, os.PathLike]
661 Either a bytes object containing the in-memory ptx code to load, or
662 a file path object (or its string representation) pointing to the
663 on-disk ptx file to load.
664 name : Optional[str]
665 A human-readable identifier representing this code object.
666 symbol_mapping : Optional[dict]
667 A dictionary specifying how the unmangled symbol names (as keys)
668 should be mapped to the mangled names before trying to retrieve
669 them (default to no mappings).
670 """
671 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2+f*f-ftg
673 @staticmethod
674 def from_ltoir(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
675 """Create an :class:`ObjectCode` instance from an existing LTOIR.
677 Parameters
678 ----------
679 module : Union[bytes, str, os.PathLike]
680 Either a bytes object containing the in-memory ltoir code to load,
681 or a file path object (or its string representation) pointing to the
682 on-disk ltoir file to load.
683 name : Optional[str]
684 A human-readable identifier representing this code object.
685 symbol_mapping : Optional[dict]
686 A dictionary specifying how the unmangled symbol names (as keys)
687 should be mapped to the mangled names before trying to retrieve
688 them (default to no mappings).
689 """
690 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2)f,fjf
692 @staticmethod
693 def from_fatbin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
694 """Create an :class:`ObjectCode` instance from an existing fatbin.
696 Parameters
697 ----------
698 module : Union[bytes, str, os.PathLike]
699 Either a bytes object containing the in-memory fatbin to load, or
700 or a file path object (or its string representation) pointing to the
701 on-disk fatbin to load.
702 name : Optional[str]
703 A human-readable identifier representing this code object.
704 symbol_mapping : Optional[dict]
705 A dictionary specifying how the unmangled symbol names (as keys)
706 should be mapped to the mangled names before trying to retrieve
707 them (default to no mappings).
708 """
709 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 22 hbib
711 @staticmethod
712 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
713 """Create an :class:`ObjectCode` instance from an existing object code.
715 Parameters
716 ----------
717 module : Union[bytes, str]
718 Either a bytes object containing the in-memory object code to load, or
719 a file path string pointing to the on-disk object code to load.
720 name : Optional[str]
721 A human-readable identifier representing this code object.
722 symbol_mapping : Optional[dict]
723 A dictionary specifying how the unmangled symbol names (as keys)
724 should be mapped to the mangled names before trying to retrieve
725 them (default to no mappings).
726 """
727 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2mfvgw
729 @staticmethod
730 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
731 """Create an :class:`ObjectCode` instance from an existing library.
733 Parameters
734 ----------
735 module : Union[bytes, str]
736 Either a bytes object containing the in-memory library to load, or
737 a file path string pointing to the on-disk library to load.
738 name : Optional[str]
739 A human-readable identifier representing this code object.
740 symbol_mapping : Optional[dict]
741 A dictionary specifying how the unmangled symbol names (as keys)
742 should be mapped to the mangled names before trying to retrieve
743 them (default to no mappings).
744 """
745 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2lfugv
747 # TODO: do we want to unload in a finalizer? Probably not..
749 @cython.critical_section
750 cdef int _lazy_load_module(self) except -1:
751 if self._h_library: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pfEi_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
752 return 0 2HbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:bEikfsfy tfufnfof;b
753 module = self._module 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
754 cdef bytes path_bytes
755 if isinstance(module, str): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
756 path_bytes = module.encode() 21 fb2 hb
757 self._h_library = create_library_handle_from_file(<const char*>path_bytes) 21 fb2 hb
758 elif isinstance(module, (bytes, bytearray)): 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pf_c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
759 self._h_library = create_library_handle_from_data(<const void*><char*>module) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pf_c`c{cgb|cibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
760 elif isinstance(module, PathLike):
761 path_bytes = fsencode(module)
762 self._h_library = create_library_handle_from_file(<const char*>path_bytes)
763 else:
764 assert_type_str_or_bytes_like(module)
765 raise_code_path_meant_to_be_unreachable()
766 return -1
767 if not self._h_library: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
768 HANDLE_RETURN(get_last_error())
769 return 0 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m pf_c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dkfq %d3 'dsf(d)d*d4 +dwf,d-d.d/d:d;d=d?d@d[d5 ]dxf^d6 _dyf`d{d|d7 }dzf~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oeAfpeqeBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfresete? ueQfve@ weRfxeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (eSfTf)e0 *eqf+e] ,etf-e^ .euf/eA :enf;eB =eof?ejb@e[ekb]e;b_
771 def get_kernel(self, name: str | bytes) -> Kernel:
772 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
774 Parameters
775 ----------
776 name : str | bytes
777 Name of the kernel to retrieve.
779 Returns
780 -------
781 :obj:`~_module.Kernel`
782 Newly created kernel object.
784 """
785 self._lazy_load_module() 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
786 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
787 if self._code_type not in supported_code_types: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibjflfmfv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
788 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2jflfmf
789 try: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
790 name = self._sym_map[name] 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
791 except KeyError: 2` { | } ~ abbbcbdbs ebc v w x q 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = y ? @ D E F G H I J K L M N O P Q R S T U V W X Y z Z [ 0 ] ^ A B jbkb;b_
792 if isinstance(name, str): 2` { | } ~ abbbcbdbs ebc v w x q 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = y ? @ D E F G H I J K L M N O P Q R S T U V W X Y z Z [ 0 ] ^ A B jbkb;b_
793 name = name.encode() 2` { | } ~ abbbcbdbs ebc v w x q 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = y ? @ D E F G H I J K L M N O P Q R S T U V W X Y z Z [ 0 ] ^ A B jbkb;b_
795 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
796 if not h_kernel: 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e;b_
797 HANDLE_RETURN(get_last_error()) 2;b
798 return Kernel._from_handle(h_kernel) 2?b@b[bHbIb]b^b_b`b{b|b}b~bacbcccdcJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8becfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcb d e GcHcIc9b!b#b$b%b'b(b)b*b+b,b-b.b/bJcKcLcMcNcOcPcQcRcScTc:b` { | } ~ abbbcbdbs ebUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?ca @c[c]cc ^ct o f g h i p j k l m _c1 `cfb{cgb|c2 hbibv w }c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#dx $dq %d3 'd(d)d*d4 +d,d-d.d/d:d;d=d?d@d[d5 ]d^d6 _d`d{d|d7 }d~daebe8 9 ! # $ % ' ( ) * + , - . / : ; cedeeefegeheiejekelemene= oepeqeDby Ebresete? ueve@ wexeyezeD AeBeCeDeEeFeGeHeIeJeKeE LeMeF NeOePeQeG ReSeTeUeH I J K L M N O P Q R S T U V W X VeWeXeYeZe0e1e2e3e4e5e6eY 7e8e9eFbz Gb!e#e$eZ %e'e[ (e)e0 *e+e] ,e-e^ .e/eA :e;eB =e?ejb@e[ekb]e_
800 def get_module(self) -> object:
801 """Return a context-dependent :obj:`~driver.CUmodule` for legacy interop.
803 Bridges the native :obj:`~driver.CUlibrary` (see :attr:`handle`) to a
804 ``CUmodule`` via ``cuLibraryGetModule``, for use with legacy driver APIs
805 that only accept ``CUmodule``.
807 Returns
808 -------
809 :obj:`~driver.CUmodule`
810 Module handle for the current CUDA context, suitable for legacy
811 driver APIs that accept ``CUmodule``.
812 """
813 self._lazy_load_module() 2pf
814 cdef cydriver.CUmodule mod
815 with nogil: 2pf
816 HANDLE_RETURN(cydriver.cuLibraryGetModule(&mod, as_cu(self._h_library))) 2pf
817 return driver.CUmodule(<intptr_t>mod) 2pf
819 @property
820 def code(self) -> CodeTypeT:
821 """Return the underlying code object."""
822 return self._module 2@f[fFi]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgGi+frgsgr (f1 fbgb2 IghbJgibKg)f,fjf*f^g-f_gtg`glfmfugvgv w 8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:gWiwgxgygzgAgBgCgDgEgFgGg_ ;g~gahbhchdhehfhgh=ghh?gihjhkhlhmhnhohphqhrhshthuhvhwhxh@gyhzhAhBhChDhHg[gEhFh]g
824 @property
825 def name(self) -> str:
826 """Return a human-readable name of this code object."""
827 return self._name 2@f[fFi]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgGi+frgsgv w 8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g{g|g}gwgxgygzgAgBgCgDgEgFgGgHg[g
829 @property
830 def code_type(self) -> str:
831 """Return the type of the underlying code object."""
832 return self._code_type 2@f[fFi]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgGi+frgsg(f2 hbib)f,fjf*f-flfmfugvgv w wgxgygzgAgBgCgDgEgFgGgHg]g
834 @property
835 def symbol_mapping(self) -> dict[str, str]:
836 """Return a copy of the symbol mapping dictionary."""
837 return dict(self._sym_map) 2r (f1 fbgbIgJgKg)f,fjf*f-ftg
839 @property
840 def handle(self) -> object:
841 """Return the native, context-independent :obj:`~driver.CUlibrary` handle.
843 Used by ``cuda.core`` and newer driver library APIs. For legacy APIs
844 that only accept a ``CUmodule``, use :meth:`get_module` instead.
846 .. caution::
848 This handle is a Python object. To get the memory address of the underlying C
849 handle, call ``int(ObjectCode.handle)``.
850 """
851 self._lazy_load_module() 2Eikf
852 return as_py(self._h_library) 2Eikf
854 def __eq__(self, other: object) -> bool:
855 if not isinstance(other, ObjectCode): 2kfLgMgNgOgPgQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g5gqfnfof
856 return NotImplemented 2kfLgMgNgOgPgQgFbRgSgTgUgVgWgXgYgZgz Gb0g1g2g3g4g5g
857 # Trigger lazy load for both objects to compare handles
858 self._lazy_load_module() 2kfqfnfof
859 (<ObjectCode>other)._lazy_load_module() 2kfqfnfof
860 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2kfqfnfof
862 def __hash__(self) -> int:
863 # Trigger lazy load to get the handle
864 self._lazy_load_module() 2sfwfxfyfzfAfBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfQfRftfufnfof
865 return hash(as_intptr(self._h_library)) 2sfwfxfyfzfAfBfDbCfDfEfFfGfHfIfJfKfy EbLfMfNfOfPfQfRftfufnfof
867 def __repr__(self) -> str:
868 # Trigger lazy load to get the handle
869 self._lazy_load_module() 2SfTf;b
870 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2SfTf;b