Coverage for cuda/core/_module.pyx: 87.85%
288 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-10 02:27 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-10 02:27 +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 libcpp.mutex cimport py_safe_call_once
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.") 2yk
59 @staticmethod
60 cdef KernelAttributes _init(KernelHandle h_kernel):
61 cdef KernelAttributes self = KernelAttributes.__new__(KernelAttributes) 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
62 self._h_kernel = h_kernel 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
63 self._device_id = -1 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
64 self._cache = {} 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
65 return self 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
67 cdef KernelAttributes _view_for_device(self, int device_id):
68 cdef KernelAttributes view = KernelAttributes.__new__(KernelAttributes) 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
69 view._h_kernel = self._h_kernel 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
70 view._device_id = device_id 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
71 view._cache = self._cache 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
72 return view 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
74 cdef inline int _effective_device_id(self) except? -1:
75 if self._device_id >= 0: 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
76 return self._device_id 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
77 return Device().device_id 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
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 c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
82 cached = self._cache.get(cache_key, cache_key) 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
83 if cached is not cache_key: 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
84 return cached 2Ob0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
85 cdef int result
86 with nogil: 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
87 HANDLE_RETURN(cydriver.cuKernelGetAttribute(&result, attribute, as_cu(self._h_kernel), device_id)) 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
88 self._cache[cache_key] = result # setdefault not needed for ints 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
89 return result 2b c d Obr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
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) 2(gOb0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
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 c d Obr a w t 5f
113 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK 2b c d Obr a w t 5f
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( 2$f
121 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES 2$f
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( 22f
129 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES 22f
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( 23f
137 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES 23f
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( 2Obx y z A B C D E F G H I J K L M N O 6f
145 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_NUM_REGS 2Obx y z A B C D E F G H I J K L M N O 6f
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( 28f
153 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PTX_VERSION 28f
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( 20f
161 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_BINARY_VERSION 20f
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( 2Xf
169 self._get_cached_attribute( 2Xf
170 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CACHE_MODE_CA 2Xf
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( 24f
179 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES 24f
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( 27f
186 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT 27f
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( 2Yf
194 self._get_cached_attribute( 2Yf
195 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET 2Yf
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( 2#f
203 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH 2#f
204 )
206 @property
207 def required_cluster_height(self) -> int:
208 """int : The required cluster height in blocks."""
209 return self._get_cached_attribute( 2!f
210 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT 2!f
211 )
213 @property
214 def required_cluster_depth(self) -> int:
215 """int : The required cluster depth in blocks."""
216 return self._get_cached_attribute( 29f
217 self._effective_device_id(), cydriver.CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH 29f
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( 2Zf
224 self._get_cached_attribute( 2Zf
225 self._effective_device_id(), 2Zf
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( 21f
234 self._effective_device_id(), 21f
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.") 2zk
252 @staticmethod
253 cdef KernelOccupancy _init(KernelHandle h_kernel):
254 cdef KernelOccupancy self = KernelOccupancy.__new__(KernelOccupancy) 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
255 self._h_kernel = h_kernel 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
256 return self 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
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 1oxyzABCDEFGHIJKLMNO
285 cdef size_t c_shmem_size = dynamic_shared_memory_size 1oxyzABCDEFGHIJKLMNO
286 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 1oxyzABCDEFGHIJKLMNO
287 with nogil: 1oxyzABCDEFGHIJKLMNO
288 HANDLE_RETURN(cydriver.cuOccupancyMaxActiveBlocksPerMultiprocessor( 1oxyzABCDEFGHIJKLMNO
289 &num_blocks, func, c_block_size, c_shmem_size
290 ))
291 return num_blocks 1oxyzABCDEFGHIJKLMNO
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: 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) 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
327 cdef cydriver.CUoccupancyB2DSize callback
328 cdef size_t c_shmem_size
329 cdef int c_block_size_limit = block_size_limit 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
330 if isinstance(dynamic_shared_memory_needed, int): 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
331 c_shmem_size = dynamic_shared_memory_needed 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
332 with nogil: 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
333 HANDLE_RETURN(cydriver.cuOccupancyMaxPotentialBlockSize( 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
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): 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
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( 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
344 "dynamic_shared_memory_needed expected to have type int, or CUoccupancyB2DSize, " 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
345 f"got {type(dynamic_shared_memory_needed)}" 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
346 )
347 return MaxPotentialBlockSizeOccupancyResult(min_grid_size=min_grid_size, max_block_size=max_block_size) 2*f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
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 2hgigjgkglgmg
368 cdef int c_block_size = block_size 2hgigjgkglgmg
369 cdef cydriver.CUfunction func = <cydriver.CUfunction>as_cu(self._h_kernel) 2hgigjgkglgmg
370 with nogil: 2hgigjgkglgmg
371 HANDLE_RETURN(cydriver.cuOccupancyAvailableDynamicSMemPerBlock( 2hgigjgkglgmg
372 &dynamic_smem_size, func, c_num_blocks, c_block_size
373 ))
374 return dynamic_smem_size 2hgigjgkglgmg
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.") 2Ak
450 @staticmethod
451 cdef Kernel _from_handle(KernelHandle h_kernel):
452 cdef Kernel ker = Kernel.__new__(Kernel) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcUjgchcVjicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdr Oda cgPdw Qdt Rde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aedg8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfR
453 ker._h_kernel = h_kernel 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcUjgchcVjicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdr Oda cgPdw Qdt Rde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aedg8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfR
454 ker._attributes = None 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcUjgchcVjicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdr Oda cgPdw Qdt Rde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aedg8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfR
455 ker._occupancy = None 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcUjgchcVjicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdr Oda cgPdw Qdt Rde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aedg8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfR
456 return ker 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcUjgchcVjicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdr Oda cgPdw Qdt Rde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aedg8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfR
458 @property
459 @cython.critical_section
460 def attributes(self) -> KernelAttributes:
461 """Get the read-only attributes of this kernel."""
462 cdef KernelAttributes attributes
463 if self._attributes is None: 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
464 attributes = KernelAttributes._init(self._h_kernel) 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
465 if self._attributes is None: 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
466 self._attributes = attributes 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
467 return self._attributes 2b c d (gObr a w t x y z A B C D E F G H I J K L M N O 0fXf1fYf2f3f4f5fZf6f7f8f9f!f#f$f
469 cdef tuple _get_arguments_info(self, bint param_info=False):
470 if cy_driver_version() < (12, 4, 0): 2e s p f g h i q j k l m bg
471 raise NotImplementedError(
472 "Driver version 12.4 or newer is required for this function. "
473 f"Using driver version {'.'.join(map(str, cy_driver_version()))}"
474 )
475 if cy_binding_version() < (12, 4, 0): 2e s p f g h i q j k l m bg
476 raise NotImplementedError(
477 "cuda.bindings 12.4 or newer is required for this function. "
478 f"Using binding version {'.'.join(map(str, cy_binding_version()))}"
479 )
480 cdef size_t arg_pos = 0 2e s p f g h i q j k l m bg
481 cdef list param_info_data = [] 2e s p f g h i q j k l m bg
482 cdef cydriver.CUkernel cu_kernel = as_cu(self._h_kernel) 2e s p f g h i q j k l m bg
483 cdef size_t param_offset, param_size
484 cdef cydriver.CUresult err
485 while True: 2e s p f g h i q j k l m bg
486 with nogil: 2e s p f g h i q j k l m bg
487 err = cydriver.cuKernelGetParamInfo(cu_kernel, arg_pos, ¶m_offset, ¶m_size) 2e s p f g h i q j k l m bg
488 if err != cydriver.CUDA_SUCCESS: 2e s p f g h i q j k l m bg
489 break 2e s p f g h i q j k l m bg
490 if param_info: 2e f g h i j k l m bg
491 param_info_data.append(ParamInfo(offset=param_offset, size=param_size)) 2f g h i j k l m bg
492 arg_pos = arg_pos + 1 2e f g h i j k l m bg
493 if err != cydriver.CUDA_ERROR_INVALID_VALUE: 2e s p f g h i q j k l m bg
494 HANDLE_RETURN(err) 1s
495 return arg_pos, param_info_data 2e p f g h i q j k l m bg
497 @property
498 def num_arguments(self) -> int:
499 """int : The number of arguments of this function"""
500 num_args, _ = self._get_arguments_info() 2e s p f g h i q j k l m bg
501 return num_args 2e p f g h i q j k l m bg
503 @property
504 def arguments_info(self) -> list[ParamInfo]:
505 """list[ParamInfo]: (offset, size) for each argument of this function"""
506 _, param_info = self._get_arguments_info(param_info=True) 2p f g h i q j k l m bg
507 return param_info 2p f g h i q j k l m bg
509 @property
510 @cython.critical_section
511 def occupancy(self) -> KernelOccupancy:
512 """Get the occupancy information for launching this kernel."""
513 cdef KernelOccupancy occupancy
514 if self._occupancy is None: 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
515 occupancy = KernelOccupancy._init(self._h_kernel) 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
516 if self._occupancy is None: 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
517 self._occupancy = occupancy 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
518 return self._occupancy 2o hgigjgkglgmgx y z A B C D E F G H I J K L M N O *f+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fag
520 @property
521 def handle(self) -> object:
522 """Return the underlying kernel handle object.
524 .. caution::
526 This handle is a Python object. To get the memory address of the underlying C
527 handle, call ``int(Kernel.handle)``.
528 """
529 return as_py(self._h_kernel) 2b FbGbS HbIbJbKbLbMbBka cgw t e Xjdg
531 @property
532 def _handle(self) -> object:
533 return self.handle
535 @staticmethod
536 def from_handle(handle, mod: ObjectCode | None = None) -> Kernel:
537 """Creates a new :obj:`Kernel` object from a kernel handle.
539 Parameters
540 ----------
541 handle : int
542 Kernel handle representing the address of a foreign
543 kernel object (CUkernel).
544 mod : :obj:`ObjectCode`, optional
545 The ObjectCode object associated with this kernel. Provides
546 library lifetime for foreign kernels not created by
547 cuda.core.
548 """
550 if not isinstance(handle, int): 2b r a cgw 4j5j6j7j8j9j!j#j$j%jt dg
551 raise TypeError(f"handle must be an integer, got {type(handle).__name__}") 24j5j6j7j8j9j!j#j$j%j
553 cdef cydriver.CUkernel cu_kernel = <cydriver.CUkernel><void*><size_t>handle 2b r a cgw t dg
554 cdef KernelHandle h_kernel = create_kernel_handle_ref(cu_kernel) 2b r a cgw t dg
555 if not h_kernel: 2b r a cgw t dg
556 HANDLE_RETURN(get_last_error())
558 cdef LibraryHandle h_existing_lib = get_kernel_library(h_kernel) 2b r a cgw t dg
559 cdef LibraryHandle h_caller_lib
561 if mod is not None: 2b r a cgw t dg
562 h_caller_lib = (<ObjectCode>mod)._h_library 2a cgt
563 if h_existing_lib and h_caller_lib: 2a cgt
564 if as_cu(h_existing_lib) != as_cu(h_caller_lib): 2a cgt
565 import warnings 1a
566 warnings.warn( 1a
567 "The library from the provided ObjectCode does not match "
568 "the library associated with this kernel.",
569 stacklevel=2,
570 )
572 cdef Kernel k = Kernel._from_handle(h_kernel) 2b r a cgw t dg
573 if mod is not None and not h_existing_lib: 2b r a cgw t dg
574 k._keepalive = mod
575 return k 2b r a cgw t dg
577 def __eq__(self, other: object) -> bool:
578 if not isinstance(other, Kernel): 2UjVjS Xjdg'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}jYj~jak0j1j
579 return NotImplemented 2Xj'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}jYj~j
580 return as_intptr(self._h_kernel) == as_intptr((<Kernel>other)._h_kernel) 2UjVjS Xjdgak0j1j
582 def __hash__(self) -> int:
583 return hash(as_intptr(self._h_kernel)) 2dgCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkWjZk0k1k2k0j1j
585 def __repr__(self) -> str:
586 return f"<Kernel handle={as_intptr(self._h_kernel):#x}>" 2EbNb3k
589CodeTypeT = bytes | bytearray | str
591cdef tuple _supported_code_type = tuple(ObjectCodeFormatType.__members__.values())
594cdef void _lazy_load_module_once(void *self_v) except *:
595 # Call-once helper for the lazy module loading, we want to avoid unloading
596 # a module in case of threads racing, so use `call_once`.
597 cdef ObjectCode self = <ObjectCode>self_v 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
598 cdef LibraryHandle h_library
599 cdef bytes path_bytes
600 module = self._module 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
601 if isinstance(module, str): 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
602 path_bytes = module.encode() 1P3Q5
603 h_library = create_library_handle_from_file(<const char*>path_bytes) 1P3Q5
604 elif isinstance(module, (bytes, bytearray)): 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdUdVd4 Wd6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
605 h_library = create_library_handle_from_data(<const void*><char*>module) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdUdVd4 Wd6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
606 elif isinstance(module, PathLike):
607 path_bytes = fsencode(module)
608 h_library = create_library_handle_from_file(<const char*>path_bytes)
609 else:
610 assert_type_str_or_bytes_like(module)
611 raise_code_path_meant_to_be_unreachable()
612 return
613 if not h_library: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
614 HANDLE_RETURN(get_last_error())
615 self._h_library = h_library 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`g` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
618cdef class ObjectCode:
619 """Represent a compiled program to be loaded onto the device.
621 This object provides a unified interface for different types of
622 compiled programs that will be loaded onto the device.
624 Note
625 ----
626 This class has no default constructor. If you already have a cubin that you would
627 like to load, use the :meth:`from_cubin` alternative constructor. Constructing directly
628 from all other possible code types should be avoided in favor of compilation through
629 :class:`~cuda.core.Program`
630 """
632 def __init__(self, *args, **kwargs) -> None:
633 raise RuntimeError( 24k
634 "ObjectCode objects cannot be instantiated directly. "
635 "Please use ObjectCode APIs (from_cubin, from_ptx) or Program APIs (compile)."
636 )
638 @classmethod
639 def _init(cls, module, code_type, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
640 assert code_type in _supported_code_type, f"{code_type=} is not supported" 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
641 cdef ObjectCode self = ObjectCode.__new__(ObjectCode) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
643 # _h_library is assigned during _lazy_load_module
644 self._h_library = LibraryHandle() # Empty handle 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
646 self._code_type = str(code_type) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
648 if isinstance(module, (str, bytes, bytearray)): 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
649 self._module = module 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdUd3 Vd4 Wdih5 jh6 khBisgCi%fDiJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
650 elif isinstance(module, PathLike): 2P Q ogpg
651 self._module = fspath(module) 2P Q ogpg
652 else:
653 self._module = module
654 self._sym_map = {} if symbol_mapping is None else symbol_mapping 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
655 self._name = name if name else "" 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
657 return self 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdug]hvg^hwg_h`hxg{hyg|hzg}hAg~hBgaiCgbiDgciEgdiFgeiGgfiHggiIghiJgiiKgjiLgkiMgliNgmiOgniPgoiQgpiRgqiSgriTgsiUgtiuiVgviwirgxiWgyiXgziAiMdNdr Oda PdQdRde ngSds p f g h i q j k l m )fTdP Ud3 Vd4 WdQ ih5 jh6 khogBisgCi%fDipgJhtgKhYgLh'f(fZg0gu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 AeEi8 Be9 CeFiDeEeFe! GeGiHeIeJeKeLeMeNeOePeQe# ReHiSe$ TeIiUeVeWe% XeJiYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %eKi'e(eLi)eMiNiOiPiQiRiSiTiUi` *eViWiXiYiZi+e,e-e{ .e0i/e| :e1i;e=e?e} @e2i[e]e^e_e`e{e|e}e~eaf~ bf3icfabdf4iefffgfbbhf5iifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxf6iyfzf7iAf8i9i!i#i$i%i'i(i)iubBf*i+i,i-i.iCfDfEfvbFf/ilh:imh;iGfwbHf=i?iIfxbJf@iKfybLf[iMfzbNf]iOfAbPf^iQfBbRf_iSfCbTf`iUfDbVf{inhoh|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjMhNhOhNjOjPhQhRhWfShphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3gPj4g5g6g7g8g9gQj!g#g$g%gRjR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?hSj'gHh@h[hIhTj
659 @staticmethod
660 def _reduce_helper(module, code_type, name, symbol_mapping):
661 return ObjectCode._init(module, code_type, name=name if name else "", symbol_mapping=symbol_mapping) 2nglhmh
663 def __reduce__(self) -> tuple[object, ...]:
664 return ObjectCode._reduce_helper, (self._module, self._code_type, self._name, self._sym_map) 2nglhmh
666 @staticmethod
667 def from_cubin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
668 """Create an :class:`ObjectCode` instance from an existing cubin.
670 Parameters
671 ----------
672 module : bytes | str | os.PathLike
673 Either a bytes object containing the in-memory cubin to load, or
674 a file path object (or its string representation) pointing to the
675 on-disk cubin to load.
676 name : str | None
677 A human-readable identifier representing this code object.
678 symbol_mapping : dict | None
679 A dictionary specifying how the unmangled symbol names (as keys)
680 should be mapped to the mangled names before trying to retrieve
681 them (default to no mappings).
682 """
683 return ObjectCode._init(module, ObjectCodeFormatType.CUBIN, name=name, symbol_mapping=symbol_mapping) 2P 3 4 DhEhFhGh
685 @staticmethod
686 def from_ptx(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
687 """Create an :class:`ObjectCode` instance from an existing PTX.
689 Parameters
690 ----------
691 module : bytes | str | os.PathLike
692 Either a bytes object containing the in-memory ptx code to load, or
693 a file path object (or its string representation) pointing to the
694 on-disk ptx file to load.
695 name : str | None
696 A human-readable identifier representing this code object.
697 symbol_mapping : dict | None
698 A dictionary specifying how the unmangled symbol names (as keys)
699 should be mapped to the mangled names before trying to retrieve
700 them (default to no mappings).
701 """
702 return ObjectCode._init(module, ObjectCodeFormatType.PTX, name=name, symbol_mapping=symbol_mapping) 2rgpgtgYg
704 @staticmethod
705 def from_ltoir(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
706 """Create an :class:`ObjectCode` instance from an existing LTOIR.
708 Parameters
709 ----------
710 module : bytes | str | os.PathLike
711 Either a bytes object containing the in-memory ltoir code to load,
712 or a file path object (or its string representation) pointing to the
713 on-disk ltoir file to load.
714 name : str | None
715 A human-readable identifier representing this code object.
716 symbol_mapping : dict | None
717 A dictionary specifying how the unmangled symbol names (as keys)
718 should be mapped to the mangled names before trying to retrieve
719 them (default to no mappings).
720 """
721 return ObjectCode._init(module, ObjectCodeFormatType.LTOIR, name=name, symbol_mapping=symbol_mapping) 2ogsg%f
723 @staticmethod
724 def from_fatbin(module: bytes | str | PathLike[str], *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
725 """Create an :class:`ObjectCode` instance from an existing fatbin.
727 Parameters
728 ----------
729 module : bytes | str | os.PathLike
730 Either a bytes object containing the in-memory fatbin to load, or
731 or a file path object (or its string representation) pointing to the
732 on-disk fatbin to load.
733 name : str | None
734 A human-readable identifier representing this code object.
735 symbol_mapping : dict | None
736 A dictionary specifying how the unmangled symbol names (as keys)
737 should be mapped to the mangled names before trying to retrieve
738 them (default to no mappings).
739 """
740 return ObjectCode._init(module, ObjectCodeFormatType.FATBIN, name=name, symbol_mapping=symbol_mapping) 1Q56
742 @staticmethod
743 def from_object(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
744 """Create an :class:`ObjectCode` instance from an existing object code.
746 Parameters
747 ----------
748 module : bytes | str
749 Either a bytes object containing the in-memory object code to load, or
750 a file path string pointing to the on-disk object code to load.
751 name : str | None
752 A human-readable identifier representing this code object.
753 symbol_mapping : dict | None
754 A dictionary specifying how the unmangled symbol names (as keys)
755 should be mapped to the mangled names before trying to retrieve
756 them (default to no mappings).
757 """
758 return ObjectCode._init(module, ObjectCodeFormatType.OBJECT, name=name, symbol_mapping=symbol_mapping) 2(f0gv
760 @staticmethod
761 def from_library(module: bytes | str, *, name: str = "", symbol_mapping: dict[str, str] | None = None) -> ObjectCode:
762 """Create an :class:`ObjectCode` instance from an existing library.
764 Parameters
765 ----------
766 module : bytes | str
767 Either a bytes object containing the in-memory library to load, or
768 a file path string pointing to the on-disk library to load.
769 name : str | None
770 A human-readable identifier representing this code object.
771 symbol_mapping : dict | None
772 A dictionary specifying how the unmangled symbol names (as keys)
773 should be mapped to the mangled names before trying to retrieve
774 them (default to no mappings).
775 """
776 return ObjectCode._init(module, ObjectCodeFormatType.LIBRARY, name=name, symbol_mapping=symbol_mapping) 2'fZgu
778 # TODO: do we want to unload in a finalizer? Probably not..
780 cdef int _lazy_load_module(self) except -1:
781 py_safe_call_once(self._load_once, _lazy_load_module_once, <void *>self) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fZjTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`gWj` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
782 return 0 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m )fZjTdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Aeeg8 Be9 Ce)gDeEeFe! Ge*gHeIeJeKeLeMeNeOePeQe# Re+gSe$ Te,gUeVeWe% Xe-gYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e.g'e(e/g:g)e;g=g?g@g[g]g^g_g`gWj` {g*e|g}g~gahbh+e,e-e{ .ech/e| :edh;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfehfhIfxbJfqgKfybLfghMfzbNfhhOfAbPffgQfBbRfggSfCbTfUfDbVfWfR
784 def get_kernel(self, name: str | bytes) -> Kernel:
785 """Return the :obj:`~_module.Kernel` of a specified name from this object code.
787 Parameters
788 ----------
789 name : str | bytes
790 Name of the kernel to retrieve.
792 Returns
793 -------
794 :obj:`~_module.Kernel`
795 Newly created kernel object.
797 """
798 self._lazy_load_module() 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
799 supported_code_types = (ObjectCodeFormatType.CUBIN, ObjectCodeFormatType.PTX, ObjectCodeFormatType.FATBIN) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
800 if self._code_type not in supported_code_types: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 %f'f(fu v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
801 raise RuntimeError(f'Unsupported code type "{self._code_type}" ({supported_code_types=})') 2%f'f(f
802 try: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
803 name = self._sym_map[name] 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
804 except KeyError: 2T U V W X Y Z 0 1 o 2 e u v 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbWfR
805 if isinstance(name, str): 2T U V W X Y Z 0 1 o 2 e u v 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbWfR
806 name = name.encode() 2T U V W X Y Z 0 1 o 2 e u v 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbWfR
808 cdef KernelHandle h_kernel = create_kernel_handle(self._h_library, <const char*>name) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
809 if not h_kernel: 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfWfR
810 HANDLE_RETURN(get_last_error()) 2Wf
811 return Kernel._from_handle(h_kernel) 2PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycb c d zcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScEbFbGbS TcUcVcWcXcYcZc0c1c2cHbIbJb3cKbLbMbNb4c5c6c7c8c9c!c#c$c%c'c(cT U V W X Y Z 0 1 o )c*c2 +c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOda PdQdRde Sds p f g h i q j k l m TdP Ud3 Vd4 WdQ 5 6 u v XdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze7 Ae8 Be9 CeDeEeFe! GeHeIeJeKeLeMeNeOePeQe# ReSe$ TeUeVeWe% XeYeZe0e' ( ) * + , - . / : ; = ? @ [ ] ^ 1e2e3e4e5e6e7e8e9e!e#e$e_ %e'e(e)e` *e+e,e-e{ .e/e| :e;e=e?e} @e[e]e^e_e`e{e|e}e~eaf~ bfcfabdfefffgfbbhfifjfkfcbdbebfbgbhbibjbkblbmbnbobpbqbrbsblfmfnfofpfqfrfsftfufvfwftbxfyfzfAfubBfCfDfEfvbFfGfwbHfIfxbJfKfybLfMfzbNfOfAbPfQfBbRfSfCbTfUfDbVfR
813 def get_module(self) -> driver.CUmodule:
814 """Return a context-dependent :obj:`~driver.CUmodule` for legacy interop.
816 Bridges the native :obj:`~driver.CUlibrary` (see :attr:`handle`) to a
817 ``CUmodule`` via ``cuLibraryGetModule``, for use with legacy driver APIs
818 that only accept ``CUmodule``.
820 Returns
821 -------
822 :obj:`~driver.CUmodule`
823 Module handle for the current CUDA context, suitable for legacy
824 driver APIs that accept ``CUmodule``.
825 """
826 self._lazy_load_module() 2)f
827 cdef cydriver.CUmodule mod
828 with nogil: 2)f
829 HANDLE_RETURN(cydriver.cuLibraryGetModule(&mod, as_cu(self._h_library))) 2)f
830 return as_py(mod) 2)f
832 @property
833 def code(self) -> CodeTypeT:
834 """Return the underlying code object."""
835 return self._module 2ugvgwg2jxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVg3jrgWgXgr ngP 3 4 Q ih5 jh6 khogsg%fpgJhtgKhYgLh'f(fZg0gu v nhohRhShphqhrhshthuhvhwhxhyhzhAhBhCh5k1g2g3g4g5g6g7g8g9g!g#g$g%gR DhWhXhYhZh0h1h2h3hEh4hFh5h6h7h8h9h!h#h$h%h'h(h)h*h+h,h-hGh.h/h:h;h=h?h'gHh@h[hIh
837 @property
838 def name(self) -> str:
839 """Return a human-readable name of this code object."""
840 return self._name 2ugvgwg2jxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVg3jrgWgXgu v nhohMhNhOhPhQhphqhrhshthuhvhwhxhyhzhAhBhChThUhVh1g2g3g4g5g6g7g8g9g!g#g$g%g'gHh
842 @property
843 def code_type(self) -> str:
844 """Return the type of the underlying code object."""
845 return self._code_type 2ugvgwg2jxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVg3jrgWgXgngQ 5 6 ogsg%fpgtg'f(fZg0gu v 1g2g3g4g5g6g7g8g9g!g#g$g%g'gIh
847 @property
848 def symbol_mapping(self) -> dict[str, str]:
849 """Return a copy of the symbol mapping dictionary."""
850 return dict(self._sym_map) 2r ngP 3 4 ihjhkhogsg%fpgtgYg
852 @property
853 def handle(self) -> object:
854 """Return the native, context-independent :obj:`~driver.CUlibrary` handle.
856 Used by ``cuda.core`` and newer driver library APIs. For legacy APIs
857 that only accept a ``CUmodule``, use :meth:`get_module` instead.
859 .. caution::
861 This handle is a Python object. To get the memory address of the underlying C
862 handle, call ``int(ObjectCode.handle)``.
863 """
864 self._lazy_load_module() 2Zjeg
865 return as_py(self._h_library) 2Zjeg
867 def __eq__(self, other: object) -> bool:
868 if not isinstance(other, ObjectCode): 2egbkckdkekfkgkhkikjkkklkmknkokpkqkYjrksktkukvkwkxkqgfggg
869 return NotImplemented 2egbkckdkekfkgkhkikjkkklkmknkokpkqkYjrksktkukvkwkxk
870 # Trigger lazy load for both objects to compare handles
871 self._lazy_load_module() 2egqgfggg
872 (<ObjectCode>other)._lazy_load_module() 2egqgfggg
873 return as_intptr(self._h_library) == as_intptr((<ObjectCode>other)._h_library) 2egqgfggg
875 def __hash__(self) -> int:
876 # Trigger lazy load to get the handle
877 self._lazy_load_module() 2)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`gWj{g|g}g~gahbhchdhghhhfggg
878 return hash(as_intptr(self._h_library)) 2)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`gWj{g|g}g~gahbhchdhghhhfggg
880 def __repr__(self) -> str:
881 # Trigger lazy load to get the handle
882 self._lazy_load_module() 2ehfhWf
883 return f"<ObjectCode handle={as_intptr(self._h_library):#x} code_type='{self._code_type}'>" 2ehfhWf