numba-cuda 0.22.0__cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- _numba_cuda_redirector.pth +4 -0
- _numba_cuda_redirector.py +89 -0
- numba_cuda/VERSION +1 -0
- numba_cuda/__init__.py +6 -0
- numba_cuda/_version.py +11 -0
- numba_cuda/numba/cuda/__init__.py +70 -0
- numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
- numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
- numba_cuda/numba/cuda/api.py +580 -0
- numba_cuda/numba/cuda/api_util.py +76 -0
- numba_cuda/numba/cuda/args.py +72 -0
- numba_cuda/numba/cuda/bf16.py +397 -0
- numba_cuda/numba/cuda/cache_hints.py +287 -0
- numba_cuda/numba/cuda/cext/__init__.py +2 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
- numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
- numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
- numba_cuda/numba/cuda/cext/_helperlib.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
- numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
- numba_cuda/numba/cuda/cext/_typeof.h +19 -0
- numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
- numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
- numba_cuda/numba/cuda/cext/mviewbuf.cpython-313-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
- numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
- numba_cuda/numba/cuda/cg.py +67 -0
- numba_cuda/numba/cuda/cgutils.py +1294 -0
- numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
- numba_cuda/numba/cuda/codegen.py +541 -0
- numba_cuda/numba/cuda/compiler.py +1396 -0
- numba_cuda/numba/cuda/core/analysis.py +758 -0
- numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
- numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
- numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
- numba_cuda/numba/cuda/core/base.py +1332 -0
- numba_cuda/numba/cuda/core/boxing.py +1411 -0
- numba_cuda/numba/cuda/core/bytecode.py +728 -0
- numba_cuda/numba/cuda/core/byteflow.py +2346 -0
- numba_cuda/numba/cuda/core/caching.py +744 -0
- numba_cuda/numba/cuda/core/callconv.py +392 -0
- numba_cuda/numba/cuda/core/codegen.py +171 -0
- numba_cuda/numba/cuda/core/compiler.py +199 -0
- numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
- numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
- numba_cuda/numba/cuda/core/config.py +650 -0
- numba_cuda/numba/cuda/core/consts.py +124 -0
- numba_cuda/numba/cuda/core/controlflow.py +989 -0
- numba_cuda/numba/cuda/core/entrypoints.py +57 -0
- numba_cuda/numba/cuda/core/environment.py +66 -0
- numba_cuda/numba/cuda/core/errors.py +917 -0
- numba_cuda/numba/cuda/core/event.py +511 -0
- numba_cuda/numba/cuda/core/funcdesc.py +330 -0
- numba_cuda/numba/cuda/core/generators.py +387 -0
- numba_cuda/numba/cuda/core/imputils.py +509 -0
- numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
- numba_cuda/numba/cuda/core/interpreter.py +3617 -0
- numba_cuda/numba/cuda/core/ir.py +1812 -0
- numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
- numba_cuda/numba/cuda/core/optional.py +129 -0
- numba_cuda/numba/cuda/core/options.py +262 -0
- numba_cuda/numba/cuda/core/postproc.py +249 -0
- numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
- numba_cuda/numba/cuda/core/registry.py +46 -0
- numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
- numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
- numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
- numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
- numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
- numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
- numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
- numba_cuda/numba/cuda/core/sigutils.py +68 -0
- numba_cuda/numba/cuda/core/ssa.py +498 -0
- numba_cuda/numba/cuda/core/targetconfig.py +330 -0
- numba_cuda/numba/cuda/core/tracing.py +231 -0
- numba_cuda/numba/cuda/core/transforms.py +956 -0
- numba_cuda/numba/cuda/core/typed_passes.py +867 -0
- numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
- numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
- numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
- numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
- numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
- numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
- numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
- numba_cuda/numba/cuda/cpython/iterators.py +167 -0
- numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
- numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
- numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
- numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
- numba_cuda/numba/cuda/cpython/slicing.py +322 -0
- numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
- numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
- numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
- numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
- numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
- numba_cuda/numba/cuda/cuda_paths.py +691 -0
- numba_cuda/numba/cuda/cudadecl.py +543 -0
- numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
- numba_cuda/numba/cuda/cudadrv/devicearray.py +954 -0
- numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
- numba_cuda/numba/cuda/cudadrv/driver.py +3238 -0
- numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +562 -0
- numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
- numba_cuda/numba/cuda/cudadrv/error.py +48 -0
- numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
- numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
- numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
- numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
- numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
- numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
- numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
- numba_cuda/numba/cuda/cudaimpl.py +983 -0
- numba_cuda/numba/cuda/cudamath.py +149 -0
- numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
- numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
- numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
- numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
- numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
- numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
- numba_cuda/numba/cuda/datamodel/manager.py +11 -0
- numba_cuda/numba/cuda/datamodel/models.py +9 -0
- numba_cuda/numba/cuda/datamodel/packer.py +9 -0
- numba_cuda/numba/cuda/datamodel/registry.py +11 -0
- numba_cuda/numba/cuda/datamodel/testing.py +11 -0
- numba_cuda/numba/cuda/debuginfo.py +997 -0
- numba_cuda/numba/cuda/decorators.py +294 -0
- numba_cuda/numba/cuda/descriptor.py +35 -0
- numba_cuda/numba/cuda/device_init.py +155 -0
- numba_cuda/numba/cuda/deviceufunc.py +1021 -0
- numba_cuda/numba/cuda/dispatcher.py +2463 -0
- numba_cuda/numba/cuda/errors.py +72 -0
- numba_cuda/numba/cuda/extending.py +697 -0
- numba_cuda/numba/cuda/flags.py +178 -0
- numba_cuda/numba/cuda/fp16.py +357 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/initialize.py +24 -0
- numba_cuda/numba/cuda/intrinsics.py +531 -0
- numba_cuda/numba/cuda/itanium_mangler.py +214 -0
- numba_cuda/numba/cuda/kernels/__init__.py +2 -0
- numba_cuda/numba/cuda/kernels/reduction.py +265 -0
- numba_cuda/numba/cuda/kernels/transpose.py +65 -0
- numba_cuda/numba/cuda/libdevice.py +3386 -0
- numba_cuda/numba/cuda/libdevicedecl.py +20 -0
- numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
- numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
- numba_cuda/numba/cuda/locks.py +19 -0
- numba_cuda/numba/cuda/lowering.py +1980 -0
- numba_cuda/numba/cuda/mathimpl.py +374 -0
- numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
- numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
- numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
- numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
- numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
- numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
- numba_cuda/numba/cuda/misc/appdirs.py +594 -0
- numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
- numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
- numba_cuda/numba/cuda/misc/dump_style.py +41 -0
- numba_cuda/numba/cuda/misc/findlib.py +75 -0
- numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
- numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
- numba_cuda/numba/cuda/misc/literal.py +28 -0
- numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
- numba_cuda/numba/cuda/misc/special.py +94 -0
- numba_cuda/numba/cuda/models.py +56 -0
- numba_cuda/numba/cuda/np/arraymath.py +5130 -0
- numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
- numba_cuda/numba/cuda/np/extensions.py +11 -0
- numba_cuda/numba/cuda/np/linalg.py +3087 -0
- numba_cuda/numba/cuda/np/math/__init__.py +0 -0
- numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
- numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
- numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
- numba_cuda/numba/cuda/np/npdatetime.py +969 -0
- numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
- numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
- numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
- numba_cuda/numba/cuda/np/numpy_support.py +798 -0
- numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
- numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
- numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
- numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
- numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
- numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
- numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
- numba_cuda/numba/cuda/nvvmutils.py +254 -0
- numba_cuda/numba/cuda/printimpl.py +126 -0
- numba_cuda/numba/cuda/random.py +308 -0
- numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
- numba_cuda/numba/cuda/serialize.py +267 -0
- numba_cuda/numba/cuda/simulator/__init__.py +63 -0
- numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
- numba_cuda/numba/cuda/simulator/api.py +179 -0
- numba_cuda/numba/cuda/simulator/bf16.py +4 -0
- numba_cuda/numba/cuda/simulator/compiler.py +38 -0
- numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
- numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
- numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
- numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
- numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
- numba_cuda/numba/cuda/simulator/kernel.py +320 -0
- numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
- numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
- numba_cuda/numba/cuda/simulator/reduction.py +19 -0
- numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
- numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
- numba_cuda/numba/cuda/simulator_init.py +18 -0
- numba_cuda/numba/cuda/stubs.py +624 -0
- numba_cuda/numba/cuda/target.py +505 -0
- numba_cuda/numba/cuda/testing.py +347 -0
- numba_cuda/numba/cuda/tests/__init__.py +62 -0
- numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
- numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
- numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
- numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
- numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
- numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
- numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +191 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +200 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
- numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
- numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
- numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
- numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
- numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
- numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
- numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
- numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
- numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
- numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
- numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
- numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
- numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
- numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +978 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
- numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
- numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
- numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
- numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
- numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
- numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
- numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
- numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
- numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
- numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
- numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
- numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
- numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
- numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
- numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
- numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
- numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
- numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
- numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
- numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
- numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
- numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
- numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
- numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
- numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
- numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
- numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
- numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
- numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
- numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
- numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
- numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
- numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
- numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
- numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
- numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +446 -0
- numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
- numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
- numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
- numba_cuda/numba/cuda/tests/data/error.cu +12 -0
- numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
- numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
- numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
- numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
- numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
- numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +452 -0
- numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
- numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
- numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
- numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
- numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
- numba_cuda/numba/cuda/tests/support.py +900 -0
- numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
- numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
- numba_cuda/numba/cuda/typeconv/rules.py +63 -0
- numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
- numba_cuda/numba/cuda/types/__init__.py +233 -0
- numba_cuda/numba/cuda/types/__init__.pyi +167 -0
- numba_cuda/numba/cuda/types/abstract.py +9 -0
- numba_cuda/numba/cuda/types/common.py +9 -0
- numba_cuda/numba/cuda/types/containers.py +9 -0
- numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
- numba_cuda/numba/cuda/types/cuda_common.py +110 -0
- numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
- numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
- numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
- numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
- numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
- numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
- numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
- numba_cuda/numba/cuda/types/ext_types.py +101 -0
- numba_cuda/numba/cuda/types/function_type.py +11 -0
- numba_cuda/numba/cuda/types/functions.py +9 -0
- numba_cuda/numba/cuda/types/iterators.py +9 -0
- numba_cuda/numba/cuda/types/misc.py +9 -0
- numba_cuda/numba/cuda/types/npytypes.py +9 -0
- numba_cuda/numba/cuda/types/scalars.py +9 -0
- numba_cuda/numba/cuda/typing/__init__.py +19 -0
- numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
- numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
- numba_cuda/numba/cuda/typing/bufproto.py +70 -0
- numba_cuda/numba/cuda/typing/builtins.py +1209 -0
- numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
- numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
- numba_cuda/numba/cuda/typing/collections.py +138 -0
- numba_cuda/numba/cuda/typing/context.py +782 -0
- numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
- numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
- numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
- numba_cuda/numba/cuda/typing/listdecl.py +147 -0
- numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
- numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
- numba_cuda/numba/cuda/typing/npydecl.py +749 -0
- numba_cuda/numba/cuda/typing/setdecl.py +115 -0
- numba_cuda/numba/cuda/typing/templates.py +1446 -0
- numba_cuda/numba/cuda/typing/typeof.py +301 -0
- numba_cuda/numba/cuda/ufuncs.py +746 -0
- numba_cuda/numba/cuda/utils.py +724 -0
- numba_cuda/numba/cuda/vector_types.py +214 -0
- numba_cuda/numba/cuda/vectorizers.py +260 -0
- numba_cuda-0.22.0.dist-info/METADATA +109 -0
- numba_cuda-0.22.0.dist-info/RECORD +487 -0
- numba_cuda-0.22.0.dist-info/WHEEL +6 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE +26 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE.numba +24 -0
- numba_cuda-0.22.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
This module contains utils for manipulating target configurations such as
|
|
6
|
+
compiler flags.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import re
|
|
10
|
+
import zlib
|
|
11
|
+
import base64
|
|
12
|
+
|
|
13
|
+
from types import MappingProxyType
|
|
14
|
+
from numba.cuda import utils
|
|
15
|
+
from numba.cuda import HAS_NUMBA
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Option:
|
|
19
|
+
"""An option to be used in ``TargetConfig``."""
|
|
20
|
+
|
|
21
|
+
__slots__ = "_type", "_default", "_doc"
|
|
22
|
+
|
|
23
|
+
def __init__(self, type, *, default, doc):
|
|
24
|
+
"""
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
type :
|
|
28
|
+
Type of the option value. It can be a callable.
|
|
29
|
+
The setter always calls ``self._type(value)``.
|
|
30
|
+
default :
|
|
31
|
+
The default value for the option.
|
|
32
|
+
doc : str
|
|
33
|
+
Docstring for the option.
|
|
34
|
+
"""
|
|
35
|
+
self._type = type
|
|
36
|
+
self._default = default
|
|
37
|
+
self._doc = doc
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def type(self):
|
|
41
|
+
return self._type
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def default(self):
|
|
45
|
+
return self._default
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def doc(self):
|
|
49
|
+
return self._doc
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if HAS_NUMBA:
|
|
53
|
+
from numba.core.targetconfig import ConfigStack, _FlagsStack
|
|
54
|
+
else:
|
|
55
|
+
|
|
56
|
+
class _FlagsStack(utils.ThreadLocalStack, stack_name="flags"):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
class ConfigStack:
|
|
60
|
+
"""A stack for tracking target configurations in the compiler.
|
|
61
|
+
|
|
62
|
+
It stores the stack in a thread-local class attribute. All instances in the
|
|
63
|
+
same thread will see the same stack.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def top_or_none(cls):
|
|
68
|
+
"""Get the TOS or return None if no config is set."""
|
|
69
|
+
self = cls()
|
|
70
|
+
if self:
|
|
71
|
+
flags = self.top()
|
|
72
|
+
else:
|
|
73
|
+
# Note: should this be the default flag for the target instead?
|
|
74
|
+
flags = None
|
|
75
|
+
return flags
|
|
76
|
+
|
|
77
|
+
def __init__(self):
|
|
78
|
+
self._stk = _FlagsStack()
|
|
79
|
+
|
|
80
|
+
def top(self):
|
|
81
|
+
return self._stk.top()
|
|
82
|
+
|
|
83
|
+
def __len__(self):
|
|
84
|
+
return len(self._stk)
|
|
85
|
+
|
|
86
|
+
def enter(self, flags):
|
|
87
|
+
"""Returns a contextmanager that performs ``push(flags)`` on enter and
|
|
88
|
+
``pop()`` on exit.
|
|
89
|
+
"""
|
|
90
|
+
return self._stk.enter(flags)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class _MetaTargetConfig(type):
|
|
94
|
+
"""Metaclass for ``TargetConfig``.
|
|
95
|
+
|
|
96
|
+
When a subclass of ``TargetConfig`` is created, all ``Option`` defined
|
|
97
|
+
as class members will be parsed and corresponding getters, setters, and
|
|
98
|
+
delters will be inserted.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
def __init__(cls, name, bases, dct):
|
|
102
|
+
"""Invoked when subclass is created.
|
|
103
|
+
|
|
104
|
+
Insert properties for each ``Option`` that are class members.
|
|
105
|
+
All the options will be grouped inside the ``.options`` class
|
|
106
|
+
attribute.
|
|
107
|
+
"""
|
|
108
|
+
# Gather options from base classes and class dict
|
|
109
|
+
opts = {}
|
|
110
|
+
# Reversed scan into the base classes to follow MRO ordering such that
|
|
111
|
+
# the closest base class is overriding
|
|
112
|
+
for base_cls in reversed(bases):
|
|
113
|
+
opts.update(base_cls.options)
|
|
114
|
+
opts.update(cls.find_options(dct))
|
|
115
|
+
# Store the options into class attribute as a ready-only mapping.
|
|
116
|
+
cls.options = MappingProxyType(opts)
|
|
117
|
+
|
|
118
|
+
# Make properties for each of the options
|
|
119
|
+
def make_prop(name, option):
|
|
120
|
+
def getter(self):
|
|
121
|
+
return self._values.get(name, option.default)
|
|
122
|
+
|
|
123
|
+
def setter(self, val):
|
|
124
|
+
self._values[name] = option.type(val)
|
|
125
|
+
|
|
126
|
+
def delter(self):
|
|
127
|
+
del self._values[name]
|
|
128
|
+
|
|
129
|
+
return property(getter, setter, delter, option.doc)
|
|
130
|
+
|
|
131
|
+
for name, option in cls.options.items():
|
|
132
|
+
setattr(cls, name, make_prop(name, option))
|
|
133
|
+
|
|
134
|
+
def find_options(cls, dct):
|
|
135
|
+
"""Returns a new dict with all the items that are a mapping to an
|
|
136
|
+
``Option``.
|
|
137
|
+
"""
|
|
138
|
+
return {k: v for k, v in dct.items() if isinstance(v, Option)}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class _NotSetType:
|
|
142
|
+
def __repr__(self):
|
|
143
|
+
return "<NotSet>"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
_NotSet = _NotSetType()
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class TargetConfig(metaclass=_MetaTargetConfig):
|
|
150
|
+
"""Base class for ``TargetConfig``.
|
|
151
|
+
|
|
152
|
+
Subclass should fill class members with ``Option``. For example:
|
|
153
|
+
|
|
154
|
+
>>> class MyTargetConfig(TargetConfig):
|
|
155
|
+
>>> a_bool_option = Option(type=bool, default=False, doc="a bool")
|
|
156
|
+
>>> an_int_option = Option(type=int, default=0, doc="an int")
|
|
157
|
+
|
|
158
|
+
The metaclass will insert properties for each ``Option``. For example:
|
|
159
|
+
|
|
160
|
+
>>> tc = MyTargetConfig()
|
|
161
|
+
>>> tc.a_bool_option = True # invokes the setter
|
|
162
|
+
>>> print(tc.an_int_option) # print the default
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
__slots__ = ["_values"]
|
|
166
|
+
|
|
167
|
+
# Used for compression in mangling.
|
|
168
|
+
# Set to -15 to disable the header and checksum for smallest output.
|
|
169
|
+
_ZLIB_CONFIG = {"wbits": -15}
|
|
170
|
+
|
|
171
|
+
def __init__(self, copy_from=None):
|
|
172
|
+
"""
|
|
173
|
+
Parameters
|
|
174
|
+
----------
|
|
175
|
+
copy_from : TargetConfig or None
|
|
176
|
+
if None, creates an empty ``TargetConfig``.
|
|
177
|
+
Otherwise, creates a copy.
|
|
178
|
+
"""
|
|
179
|
+
self._values = {}
|
|
180
|
+
if copy_from is not None:
|
|
181
|
+
assert isinstance(copy_from, TargetConfig)
|
|
182
|
+
self._values.update(copy_from._values)
|
|
183
|
+
|
|
184
|
+
def __repr__(self):
|
|
185
|
+
# NOTE: default options will be placed at the end and grouped inside
|
|
186
|
+
# a square bracket; i.e. [optname=optval, ...]
|
|
187
|
+
args = []
|
|
188
|
+
defs = []
|
|
189
|
+
for k in self.options:
|
|
190
|
+
msg = f"{k}={getattr(self, k)}"
|
|
191
|
+
if not self.is_set(k):
|
|
192
|
+
defs.append(msg)
|
|
193
|
+
else:
|
|
194
|
+
args.append(msg)
|
|
195
|
+
clsname = self.__class__.__name__
|
|
196
|
+
return f"{clsname}({', '.join(args)}, [{', '.join(defs)}])"
|
|
197
|
+
|
|
198
|
+
def __hash__(self):
|
|
199
|
+
return hash(tuple(sorted(self.values())))
|
|
200
|
+
|
|
201
|
+
def __eq__(self, other):
|
|
202
|
+
if isinstance(other, TargetConfig):
|
|
203
|
+
return self.values() == other.values()
|
|
204
|
+
else:
|
|
205
|
+
return NotImplemented
|
|
206
|
+
|
|
207
|
+
def values(self):
|
|
208
|
+
"""Returns a dict of all the values"""
|
|
209
|
+
return {k: getattr(self, k) for k in self.options}
|
|
210
|
+
|
|
211
|
+
def is_set(self, name):
|
|
212
|
+
"""Is the option set?"""
|
|
213
|
+
self._guard_option(name)
|
|
214
|
+
return name in self._values
|
|
215
|
+
|
|
216
|
+
def discard(self, name):
|
|
217
|
+
"""Remove the option by name if it is defined.
|
|
218
|
+
|
|
219
|
+
After this, the value for the option will be set to its default value.
|
|
220
|
+
"""
|
|
221
|
+
self._guard_option(name)
|
|
222
|
+
self._values.pop(name, None)
|
|
223
|
+
|
|
224
|
+
def inherit_if_not_set(self, name, default=_NotSet):
|
|
225
|
+
"""Inherit flag from ``ConfigStack``.
|
|
226
|
+
|
|
227
|
+
Parameters
|
|
228
|
+
----------
|
|
229
|
+
name : str
|
|
230
|
+
Option name.
|
|
231
|
+
default : optional
|
|
232
|
+
When given, it overrides the default value.
|
|
233
|
+
It is only used when the flag is not defined locally and there is
|
|
234
|
+
no entry in the ``ConfigStack``.
|
|
235
|
+
"""
|
|
236
|
+
self._guard_option(name)
|
|
237
|
+
if not self.is_set(name):
|
|
238
|
+
cstk = ConfigStack()
|
|
239
|
+
if cstk:
|
|
240
|
+
# inherit
|
|
241
|
+
top = cstk.top()
|
|
242
|
+
setattr(self, name, getattr(top, name))
|
|
243
|
+
elif default is not _NotSet:
|
|
244
|
+
setattr(self, name, default)
|
|
245
|
+
|
|
246
|
+
def copy(self):
|
|
247
|
+
"""Clone this instance."""
|
|
248
|
+
return type(self)(self)
|
|
249
|
+
|
|
250
|
+
def summary(self) -> str:
|
|
251
|
+
"""Returns a ``str`` that summarizes this instance.
|
|
252
|
+
|
|
253
|
+
In contrast to ``__repr__``, only options that are explicitly set will
|
|
254
|
+
be shown.
|
|
255
|
+
"""
|
|
256
|
+
args = [f"{k}={v}" for k, v in self._summary_args()]
|
|
257
|
+
clsname = self.__class__.__name__
|
|
258
|
+
return f"{clsname}({', '.join(args)})"
|
|
259
|
+
|
|
260
|
+
def _guard_option(self, name):
|
|
261
|
+
if name not in self.options:
|
|
262
|
+
msg = f"{name!r} is not a valid option for {type(self)}"
|
|
263
|
+
raise ValueError(msg)
|
|
264
|
+
|
|
265
|
+
def _summary_args(self):
|
|
266
|
+
"""returns a sorted sequence of 2-tuple containing the
|
|
267
|
+
``(flag_name, flag_value)`` for flag that are set with a non-default
|
|
268
|
+
value.
|
|
269
|
+
"""
|
|
270
|
+
args = []
|
|
271
|
+
for k in sorted(self.options):
|
|
272
|
+
opt = self.options[k]
|
|
273
|
+
if self.is_set(k):
|
|
274
|
+
flagval = getattr(self, k)
|
|
275
|
+
if opt.default != flagval:
|
|
276
|
+
v = (k, flagval)
|
|
277
|
+
args.append(v)
|
|
278
|
+
return args
|
|
279
|
+
|
|
280
|
+
@classmethod
|
|
281
|
+
def _make_compression_dictionary(cls) -> bytes:
|
|
282
|
+
"""Returns a ``bytes`` object suitable for use as a dictionary for
|
|
283
|
+
compression.
|
|
284
|
+
"""
|
|
285
|
+
buf = []
|
|
286
|
+
# include package name
|
|
287
|
+
buf.append("numba")
|
|
288
|
+
# include class name
|
|
289
|
+
buf.append(cls.__class__.__name__)
|
|
290
|
+
# include common values
|
|
291
|
+
buf.extend(["True", "False"])
|
|
292
|
+
# include all options name and their default value
|
|
293
|
+
for k, opt in cls.options.items():
|
|
294
|
+
buf.append(k)
|
|
295
|
+
buf.append(str(opt.default))
|
|
296
|
+
return "".join(buf).encode()
|
|
297
|
+
|
|
298
|
+
def get_mangle_string(self) -> str:
|
|
299
|
+
"""Return a string suitable for symbol mangling."""
|
|
300
|
+
zdict = self._make_compression_dictionary()
|
|
301
|
+
|
|
302
|
+
comp = zlib.compressobj(
|
|
303
|
+
zdict=zdict, level=zlib.Z_BEST_COMPRESSION, **self._ZLIB_CONFIG
|
|
304
|
+
)
|
|
305
|
+
# The mangled string is a compressed and base64 encoded version of the
|
|
306
|
+
# summary
|
|
307
|
+
buf = [comp.compress(self.summary().encode())]
|
|
308
|
+
buf.append(comp.flush())
|
|
309
|
+
return base64.b64encode(b"".join(buf)).decode()
|
|
310
|
+
|
|
311
|
+
@classmethod
|
|
312
|
+
def demangle(cls, mangled: str) -> str:
|
|
313
|
+
"""Returns the demangled result from ``.get_mangle_string()``"""
|
|
314
|
+
|
|
315
|
+
# unescape _XX sequence
|
|
316
|
+
def repl(x):
|
|
317
|
+
return chr(int("0x" + x.group(0)[1:], 16))
|
|
318
|
+
|
|
319
|
+
unescaped = re.sub(r"_[a-zA-Z0-9][a-zA-Z0-9]", repl, mangled)
|
|
320
|
+
# decode base64
|
|
321
|
+
raw = base64.b64decode(unescaped)
|
|
322
|
+
# decompress
|
|
323
|
+
zdict = cls._make_compression_dictionary()
|
|
324
|
+
dc = zlib.decompressobj(zdict=zdict, **cls._ZLIB_CONFIG)
|
|
325
|
+
buf = []
|
|
326
|
+
while raw:
|
|
327
|
+
buf.append(dc.decompress(raw))
|
|
328
|
+
raw = dc.unconsumed_tail
|
|
329
|
+
buf.append(dc.flush())
|
|
330
|
+
return b"".join(buf).decode()
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
import inspect
|
|
5
|
+
import logging
|
|
6
|
+
import sys
|
|
7
|
+
import threading
|
|
8
|
+
from functools import wraps
|
|
9
|
+
from itertools import chain
|
|
10
|
+
|
|
11
|
+
from numba.cuda.core import config
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TLS(threading.local):
|
|
15
|
+
"""Use a subclass to properly initialize the TLS variables in all threads.""" # noqa: E501
|
|
16
|
+
|
|
17
|
+
def __init__(self):
|
|
18
|
+
self.tracing = False
|
|
19
|
+
self.indent = 0
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
tls = TLS()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def find_function_info(func, spec, args):
|
|
26
|
+
"""Return function meta-data in a tuple.
|
|
27
|
+
|
|
28
|
+
(name, type)"""
|
|
29
|
+
|
|
30
|
+
module = getattr(func, "__module__", None)
|
|
31
|
+
name = getattr(func, "__name__", None)
|
|
32
|
+
self = getattr(func, "__self__", None)
|
|
33
|
+
cname = None
|
|
34
|
+
if self:
|
|
35
|
+
cname = self.__name__
|
|
36
|
+
# cname = self.__class__.__name__
|
|
37
|
+
# Try to deduce the class' name even for unbound methods from their
|
|
38
|
+
# first argument, which we assume to be a class instance if named 'self'...
|
|
39
|
+
elif len(spec.args) and spec.args[0] == "self":
|
|
40
|
+
cname = args[0].__class__.__name__
|
|
41
|
+
# ...or a class object if named 'cls'
|
|
42
|
+
elif len(spec.args) and spec.args[0] == "cls":
|
|
43
|
+
cname = args[0].__name__
|
|
44
|
+
if name:
|
|
45
|
+
qname = []
|
|
46
|
+
if module and module != "__main__":
|
|
47
|
+
qname.append(module)
|
|
48
|
+
qname.append(".")
|
|
49
|
+
if cname:
|
|
50
|
+
qname.append(cname)
|
|
51
|
+
qname.append(".")
|
|
52
|
+
qname.append(name)
|
|
53
|
+
name = "".join(qname)
|
|
54
|
+
return name, None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def chop(value):
|
|
58
|
+
MAX_SIZE = 320
|
|
59
|
+
s = repr(value)
|
|
60
|
+
if len(s) > MAX_SIZE:
|
|
61
|
+
return s[:MAX_SIZE] + "..." + s[-1]
|
|
62
|
+
else:
|
|
63
|
+
return s
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def create_events(fname, spec, args, kwds):
|
|
67
|
+
values = dict()
|
|
68
|
+
if spec.defaults:
|
|
69
|
+
values = dict(zip(spec.args[-len(spec.defaults) :], spec.defaults))
|
|
70
|
+
values.update(kwds)
|
|
71
|
+
values.update(list(zip(spec.args[: len(args)], args)))
|
|
72
|
+
positional = ["%s=%r" % (a, values.pop(a)) for a in spec.args]
|
|
73
|
+
anonymous = [str(a) for a in args[len(positional) :]]
|
|
74
|
+
keywords = ["%s=%r" % (k, values[k]) for k in sorted(values.keys())]
|
|
75
|
+
params = ", ".join([f for f in chain(positional, anonymous, keywords) if f])
|
|
76
|
+
|
|
77
|
+
enter = [">> ", tls.indent * " ", fname, "(", params, ")"]
|
|
78
|
+
leave = ["<< ", tls.indent * " ", fname]
|
|
79
|
+
return enter, leave
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def dotrace(*args, **kwds):
|
|
83
|
+
"""Function decorator to trace a function's entry and exit.
|
|
84
|
+
|
|
85
|
+
*args: categories in which to trace this function. Example usage:
|
|
86
|
+
|
|
87
|
+
@trace
|
|
88
|
+
def function(...):...
|
|
89
|
+
|
|
90
|
+
@trace('mycategory')
|
|
91
|
+
def function(...):...
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
recursive = kwds.get("recursive", False)
|
|
97
|
+
|
|
98
|
+
def decorator(func):
|
|
99
|
+
spec = None
|
|
100
|
+
logger = logging.getLogger("trace")
|
|
101
|
+
|
|
102
|
+
def wrapper(*args, **kwds):
|
|
103
|
+
if not logger.isEnabledFor(logging.INFO) or tls.tracing:
|
|
104
|
+
return func(*args, **kwds)
|
|
105
|
+
|
|
106
|
+
fname, ftype = find_function_info(func, spec, args)
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
tls.tracing = True
|
|
110
|
+
enter, leave = create_events(fname, spec, args, kwds)
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
logger.info("".join(enter))
|
|
114
|
+
tls.indent += 1
|
|
115
|
+
try:
|
|
116
|
+
try:
|
|
117
|
+
tls.tracing = False
|
|
118
|
+
result = func(*args, **kwds)
|
|
119
|
+
finally:
|
|
120
|
+
tls.tracing = True
|
|
121
|
+
except: # noqa: E722
|
|
122
|
+
type, value, traceback = sys.exc_info()
|
|
123
|
+
leave.append(" => exception thrown\n\traise ")
|
|
124
|
+
mname = type.__module__
|
|
125
|
+
if mname != "__main__":
|
|
126
|
+
leave.append(mname)
|
|
127
|
+
leave.append(".")
|
|
128
|
+
leave.append(type.__name__)
|
|
129
|
+
if value.args:
|
|
130
|
+
leave.append("(")
|
|
131
|
+
leave.append(", ".join(chop(v) for v in value.args))
|
|
132
|
+
leave.append(")")
|
|
133
|
+
else:
|
|
134
|
+
leave.append("()")
|
|
135
|
+
raise
|
|
136
|
+
else:
|
|
137
|
+
if result is not None:
|
|
138
|
+
leave.append(" -> ")
|
|
139
|
+
leave.append(chop(result))
|
|
140
|
+
finally:
|
|
141
|
+
tls.indent -= 1
|
|
142
|
+
logger.info("".join(leave))
|
|
143
|
+
finally:
|
|
144
|
+
tls.tracing = False
|
|
145
|
+
return result
|
|
146
|
+
|
|
147
|
+
# wrapper end
|
|
148
|
+
|
|
149
|
+
rewrap = lambda x: x
|
|
150
|
+
# Unwrap already wrapped functions
|
|
151
|
+
# (to be rewrapped again later)
|
|
152
|
+
if isinstance(func, classmethod):
|
|
153
|
+
rewrap = type(func)
|
|
154
|
+
# Note: 'func.__func__' only works in Python 3
|
|
155
|
+
func = func.__get__(True).__func__
|
|
156
|
+
elif isinstance(func, staticmethod):
|
|
157
|
+
rewrap = type(func)
|
|
158
|
+
# Note: 'func.__func__' only works in Python 3
|
|
159
|
+
func = func.__get__(True)
|
|
160
|
+
elif isinstance(func, property):
|
|
161
|
+
raise NotImplementedError
|
|
162
|
+
|
|
163
|
+
spec = inspect.getfullargspec(func)
|
|
164
|
+
return rewrap(wraps(func)(wrapper))
|
|
165
|
+
|
|
166
|
+
arg0 = len(args) and args[0] or None
|
|
167
|
+
# not supported yet...
|
|
168
|
+
if recursive:
|
|
169
|
+
raise NotImplementedError
|
|
170
|
+
if inspect.ismodule(arg0):
|
|
171
|
+
for n, f in inspect.getmembers(arg0, inspect.isfunction):
|
|
172
|
+
setattr(arg0, n, decorator(f))
|
|
173
|
+
for n, c in inspect.getmembers(arg0, inspect.isclass):
|
|
174
|
+
dotrace(c, *args, recursive=recursive)
|
|
175
|
+
elif inspect.isclass(arg0):
|
|
176
|
+
for n, f in inspect.getmembers(
|
|
177
|
+
arg0, lambda x: (inspect.isfunction(x) or inspect.ismethod(x))
|
|
178
|
+
):
|
|
179
|
+
setattr(arg0, n, decorator(f))
|
|
180
|
+
|
|
181
|
+
if callable(arg0) or type(arg0) in (classmethod, staticmethod):
|
|
182
|
+
return decorator(arg0)
|
|
183
|
+
elif isinstance(arg0, property):
|
|
184
|
+
# properties combine up to three functions: 'get', 'set', 'del',
|
|
185
|
+
# so let's wrap them all.
|
|
186
|
+
pget, pset, pdel = None, None, None
|
|
187
|
+
if arg0.fget:
|
|
188
|
+
pget = decorator(arg0.fget)
|
|
189
|
+
if arg0.fset:
|
|
190
|
+
pset = decorator(arg0.fset)
|
|
191
|
+
if arg0.fdel:
|
|
192
|
+
pdel = decorator(arg0.fdel)
|
|
193
|
+
return property(pget, pset, pdel)
|
|
194
|
+
|
|
195
|
+
else:
|
|
196
|
+
return decorator
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def notrace(*args, **kwds):
|
|
200
|
+
"""Just a no-op in case tracing is disabled."""
|
|
201
|
+
|
|
202
|
+
def decorator(func):
|
|
203
|
+
return func
|
|
204
|
+
|
|
205
|
+
arg0 = len(args) and args[0] or None
|
|
206
|
+
|
|
207
|
+
if callable(arg0) or type(arg0) in (classmethod, staticmethod):
|
|
208
|
+
return decorator(arg0)
|
|
209
|
+
else:
|
|
210
|
+
return decorator
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def doevent(msg):
|
|
214
|
+
msg = ["== ", tls.indent * " ", msg]
|
|
215
|
+
logger = logging.getLogger("trace")
|
|
216
|
+
logger.info("".join(msg))
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def noevent(msg):
|
|
220
|
+
pass
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
if config.TRACE:
|
|
224
|
+
logger = logging.getLogger("trace")
|
|
225
|
+
logger.setLevel(logging.INFO)
|
|
226
|
+
logger.handlers = [logging.StreamHandler()]
|
|
227
|
+
trace = dotrace
|
|
228
|
+
event = doevent
|
|
229
|
+
else:
|
|
230
|
+
trace = notrace
|
|
231
|
+
event = noevent
|