numba-cuda 0.22.1__cp311-cp311-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-311-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-311-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-311-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-311-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-311-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/cuda_errors.py +917 -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 +9 -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 +360 -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.1.dist-info/METADATA +109 -0
- numba_cuda-0.22.1.dist-info/RECORD +488 -0
- numba_cuda-0.22.1.dist-info/WHEEL +6 -0
- numba_cuda-0.22.1.dist-info/licenses/LICENSE +26 -0
- numba_cuda-0.22.1.dist-info/licenses/LICENSE.numba +24 -0
- numba_cuda-0.22.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
import warnings
|
|
6
|
+
|
|
7
|
+
from importlib import metadata as importlib_metadata
|
|
8
|
+
from numba.cuda import HAS_NUMBA
|
|
9
|
+
|
|
10
|
+
_already_initialized = False
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def init_all():
|
|
15
|
+
"""Execute all `numba_cuda_extensions` entry points with the name `init`
|
|
16
|
+
|
|
17
|
+
If extensions have already been initialized, this function does nothing.
|
|
18
|
+
"""
|
|
19
|
+
if HAS_NUMBA:
|
|
20
|
+
from numba.core import entrypoints
|
|
21
|
+
|
|
22
|
+
entrypoints.init_all()
|
|
23
|
+
|
|
24
|
+
global _already_initialized
|
|
25
|
+
if _already_initialized:
|
|
26
|
+
return
|
|
27
|
+
|
|
28
|
+
# Must put this here to avoid extensions re-triggering initialization
|
|
29
|
+
_already_initialized = True
|
|
30
|
+
|
|
31
|
+
def load_ep(entry_point):
|
|
32
|
+
"""Loads a given entry point. Warns and logs on failure."""
|
|
33
|
+
logger.debug("Loading extension: %s", entry_point)
|
|
34
|
+
try:
|
|
35
|
+
func = entry_point.load()
|
|
36
|
+
func()
|
|
37
|
+
except Exception as e:
|
|
38
|
+
msg = (
|
|
39
|
+
f"Numba extension module '{entry_point.module}' "
|
|
40
|
+
f"failed to load due to '{type(e).__name__}({str(e)})'."
|
|
41
|
+
)
|
|
42
|
+
warnings.warn(msg, stacklevel=3)
|
|
43
|
+
logger.debug("Extension loading failed for: %s", entry_point)
|
|
44
|
+
|
|
45
|
+
eps = importlib_metadata.entry_points()
|
|
46
|
+
# Split, Python 3.10+ and importlib_metadata 3.6+ have the "selectable"
|
|
47
|
+
# interface, versions prior to that do not. See "compatibility note" in:
|
|
48
|
+
# https://docs.python.org/3.10/library/importlib.metadata.html#entry-points
|
|
49
|
+
if hasattr(eps, "select"):
|
|
50
|
+
for entry_point in eps.select(
|
|
51
|
+
group="numba_cuda_extensions", name="init"
|
|
52
|
+
):
|
|
53
|
+
load_ep(entry_point)
|
|
54
|
+
else:
|
|
55
|
+
for entry_point in eps.get("numba_cuda_extensions", ()):
|
|
56
|
+
if entry_point.name == "init":
|
|
57
|
+
load_ep(entry_point)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
import weakref
|
|
5
|
+
import importlib
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Environment:
|
|
9
|
+
"""Stores globals and constant pyobjects for runtime.
|
|
10
|
+
|
|
11
|
+
It is often needed to convert b/w nopython objects and pyobjects.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
__slots__ = ("env_name", "__weakref__")
|
|
15
|
+
# A weak-value dictionary to store live environment with env_name as the
|
|
16
|
+
# key.
|
|
17
|
+
_memo = weakref.WeakValueDictionary()
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def from_fndesc(cls, fndesc):
|
|
21
|
+
try:
|
|
22
|
+
# Avoid creating new Env
|
|
23
|
+
return cls._memo[fndesc.env_name]
|
|
24
|
+
except KeyError:
|
|
25
|
+
inst = cls()
|
|
26
|
+
inst.env_name = fndesc.env_name
|
|
27
|
+
cls._memo[fndesc.env_name] = inst
|
|
28
|
+
return inst
|
|
29
|
+
|
|
30
|
+
def can_cache(self):
|
|
31
|
+
is_dyn = "__name__" not in self.globals
|
|
32
|
+
return not is_dyn
|
|
33
|
+
|
|
34
|
+
def __reduce__(self):
|
|
35
|
+
return _rebuild_env, (
|
|
36
|
+
self.globals.get("__name__"),
|
|
37
|
+
self.consts,
|
|
38
|
+
self.env_name,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
def __del__(self):
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
def __repr__(self):
|
|
45
|
+
return f"<Environment {self.env_name!r} >"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _rebuild_env(modname, consts, env_name):
|
|
49
|
+
env = lookup_environment(env_name)
|
|
50
|
+
if env is not None:
|
|
51
|
+
return env
|
|
52
|
+
|
|
53
|
+
mod = importlib.import_module(modname)
|
|
54
|
+
env = Environment(mod.__dict__)
|
|
55
|
+
env.consts[:] = consts
|
|
56
|
+
env.env_name = env_name
|
|
57
|
+
# Cache loaded object
|
|
58
|
+
Environment._memo[env_name] = env
|
|
59
|
+
return env
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def lookup_environment(env_name):
|
|
63
|
+
"""Returns the Environment object for the given name;
|
|
64
|
+
or None if not found
|
|
65
|
+
"""
|
|
66
|
+
return Environment._memo.get(env_name)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
import sys
|
|
5
|
+
from numba.cuda.utils import redirect_numba_module
|
|
6
|
+
|
|
7
|
+
sys.modules[__name__] = redirect_numba_module(
|
|
8
|
+
locals(), "numba.core.errors", "numba.cuda.core.cuda_errors"
|
|
9
|
+
)
|
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
The ``numba.cuda.core.event`` module provides a simple event system for applications
|
|
6
|
+
to register callbacks to listen to specific compiler events.
|
|
7
|
+
|
|
8
|
+
The following events are built in:
|
|
9
|
+
|
|
10
|
+
- ``"numba-cuda:compile"`` is broadcast when a dispatcher is compiling. Events of
|
|
11
|
+
this kind have ``data`` defined to be a ``dict`` with the following
|
|
12
|
+
key-values:
|
|
13
|
+
|
|
14
|
+
- ``"dispatcher"``: the dispatcher object that is compiling.
|
|
15
|
+
- ``"args"``: the argument types.
|
|
16
|
+
- ``"return_type"``: the return type.
|
|
17
|
+
|
|
18
|
+
- ``"numba-cuda:compiler_lock"`` is broadcast when the internal compiler-lock is
|
|
19
|
+
acquired. This is mostly used internally to measure time spent with the lock
|
|
20
|
+
acquired.
|
|
21
|
+
|
|
22
|
+
- ``"numba-cuda:run_pass"`` is broadcast when a compiler pass is running.
|
|
23
|
+
|
|
24
|
+
- ``"name"``: pass name.
|
|
25
|
+
- ``"qualname"``: qualified name of the function being compiled.
|
|
26
|
+
- ``"module"``: module name of the function being compiled.
|
|
27
|
+
- ``"flags"``: compilation flags.
|
|
28
|
+
- ``"args"``: argument types.
|
|
29
|
+
- ``"return_type"`` return type.
|
|
30
|
+
|
|
31
|
+
Applications can register callbacks that are listening for specific events using
|
|
32
|
+
``register(kind: str, listener: Listener)``, where ``listener`` is an instance
|
|
33
|
+
of ``Listener`` that defines custom actions on occurrence of the specific event.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
import os
|
|
37
|
+
import json
|
|
38
|
+
import atexit
|
|
39
|
+
import abc
|
|
40
|
+
import enum
|
|
41
|
+
import time
|
|
42
|
+
import threading
|
|
43
|
+
from timeit import default_timer as timer
|
|
44
|
+
from contextlib import contextmanager, ExitStack
|
|
45
|
+
from collections import defaultdict
|
|
46
|
+
from numba.cuda.core import config
|
|
47
|
+
from numba.cuda import utils
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class EventStatus(enum.Enum):
|
|
51
|
+
"""Status of an event."""
|
|
52
|
+
|
|
53
|
+
START = enum.auto()
|
|
54
|
+
END = enum.auto()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# Builtin event kinds.
|
|
58
|
+
_builtin_kinds = frozenset(
|
|
59
|
+
[
|
|
60
|
+
"numba-cuda:compiler_lock",
|
|
61
|
+
"numba-cuda:compile",
|
|
62
|
+
"numba-cuda:run_pass",
|
|
63
|
+
]
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _guard_kind(kind):
|
|
68
|
+
"""Guard to ensure that an event kind is valid.
|
|
69
|
+
|
|
70
|
+
All event kinds with a "numba-cuda:" prefix must be defined in the pre-defined
|
|
71
|
+
``numba.cuda.core.event._builtin_kinds``.
|
|
72
|
+
Custom event kinds are allowed by not using the above prefix.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
kind : str
|
|
77
|
+
|
|
78
|
+
Return
|
|
79
|
+
------
|
|
80
|
+
res : str
|
|
81
|
+
"""
|
|
82
|
+
if kind.startswith("numba-cuda:") and kind not in _builtin_kinds:
|
|
83
|
+
msg = (
|
|
84
|
+
f"{kind} is not a valid event kind, "
|
|
85
|
+
"it starts with the reserved prefix 'numba-cuda:'"
|
|
86
|
+
)
|
|
87
|
+
raise ValueError(msg)
|
|
88
|
+
if kind.startswith("numba:"):
|
|
89
|
+
msg = (
|
|
90
|
+
f"{kind} is using invalid reserved prefix 'numba:' "
|
|
91
|
+
"it should either start with the reserved prefix 'numba-cuda:'"
|
|
92
|
+
", or be a custom event kind"
|
|
93
|
+
)
|
|
94
|
+
raise ValueError(msg)
|
|
95
|
+
return kind
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class Event:
|
|
99
|
+
"""An event.
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
----------
|
|
103
|
+
kind : str
|
|
104
|
+
status : EventStatus
|
|
105
|
+
data : any; optional
|
|
106
|
+
Additional data for the event.
|
|
107
|
+
exc_details : 3-tuple; optional
|
|
108
|
+
Same 3-tuple for ``__exit__``.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def __init__(self, kind, status, data=None, exc_details=None):
|
|
112
|
+
self._kind = _guard_kind(kind)
|
|
113
|
+
self._status = status
|
|
114
|
+
self._data = data
|
|
115
|
+
self._exc_details = (
|
|
116
|
+
None
|
|
117
|
+
if exc_details is None or exc_details[0] is None
|
|
118
|
+
else exc_details
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def kind(self):
|
|
123
|
+
"""Event kind
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
res : str
|
|
128
|
+
"""
|
|
129
|
+
return self._kind
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def status(self):
|
|
133
|
+
"""Event status
|
|
134
|
+
|
|
135
|
+
Returns
|
|
136
|
+
-------
|
|
137
|
+
res : EventStatus
|
|
138
|
+
"""
|
|
139
|
+
return self._status
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def data(self):
|
|
143
|
+
"""Event data
|
|
144
|
+
|
|
145
|
+
Returns
|
|
146
|
+
-------
|
|
147
|
+
res : object
|
|
148
|
+
"""
|
|
149
|
+
return self._data
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def is_start(self):
|
|
153
|
+
"""Is it a *START* event?
|
|
154
|
+
|
|
155
|
+
Returns
|
|
156
|
+
-------
|
|
157
|
+
res : bool
|
|
158
|
+
"""
|
|
159
|
+
return self._status == EventStatus.START
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def is_end(self):
|
|
163
|
+
"""Is it an *END* event?
|
|
164
|
+
|
|
165
|
+
Returns
|
|
166
|
+
-------
|
|
167
|
+
res : bool
|
|
168
|
+
"""
|
|
169
|
+
return self._status == EventStatus.END
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def is_failed(self):
|
|
173
|
+
"""Is the event carrying an exception?
|
|
174
|
+
|
|
175
|
+
This is used for *END* event. This method will never return ``True``
|
|
176
|
+
in a *START* event.
|
|
177
|
+
|
|
178
|
+
Returns
|
|
179
|
+
-------
|
|
180
|
+
res : bool
|
|
181
|
+
"""
|
|
182
|
+
return self._exc_details is None
|
|
183
|
+
|
|
184
|
+
def __str__(self):
|
|
185
|
+
data = (
|
|
186
|
+
f"{type(self.data).__qualname__}"
|
|
187
|
+
if self.data is not None
|
|
188
|
+
else "None"
|
|
189
|
+
)
|
|
190
|
+
return f"Event({self._kind}, {self._status}, data: {data})"
|
|
191
|
+
|
|
192
|
+
__repr__ = __str__
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
_registered = defaultdict(list)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def register(kind, listener):
|
|
199
|
+
"""Register a listener for a given event kind.
|
|
200
|
+
|
|
201
|
+
Parameters
|
|
202
|
+
----------
|
|
203
|
+
kind : str
|
|
204
|
+
listener : Listener
|
|
205
|
+
"""
|
|
206
|
+
assert isinstance(listener, Listener)
|
|
207
|
+
kind = _guard_kind(kind)
|
|
208
|
+
_registered[kind].append(listener)
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def unregister(kind, listener):
|
|
212
|
+
"""Unregister a listener for a given event kind.
|
|
213
|
+
|
|
214
|
+
Parameters
|
|
215
|
+
----------
|
|
216
|
+
kind : str
|
|
217
|
+
listener : Listener
|
|
218
|
+
"""
|
|
219
|
+
assert isinstance(listener, Listener)
|
|
220
|
+
kind = _guard_kind(kind)
|
|
221
|
+
lst = _registered[kind]
|
|
222
|
+
lst.remove(listener)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def broadcast(event):
|
|
226
|
+
"""Broadcast an event to all registered listeners.
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
event : Event
|
|
231
|
+
"""
|
|
232
|
+
for listener in _registered[event.kind]:
|
|
233
|
+
listener.notify(event)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class Listener(abc.ABC):
|
|
237
|
+
"""Base class for all event listeners."""
|
|
238
|
+
|
|
239
|
+
@abc.abstractmethod
|
|
240
|
+
def on_start(self, event):
|
|
241
|
+
"""Called when there is a *START* event.
|
|
242
|
+
|
|
243
|
+
Parameters
|
|
244
|
+
----------
|
|
245
|
+
event : Event
|
|
246
|
+
"""
|
|
247
|
+
pass
|
|
248
|
+
|
|
249
|
+
@abc.abstractmethod
|
|
250
|
+
def on_end(self, event):
|
|
251
|
+
"""Called when there is a *END* event.
|
|
252
|
+
|
|
253
|
+
Parameters
|
|
254
|
+
----------
|
|
255
|
+
event : Event
|
|
256
|
+
"""
|
|
257
|
+
pass
|
|
258
|
+
|
|
259
|
+
def notify(self, event):
|
|
260
|
+
"""Notify this Listener with the given Event.
|
|
261
|
+
|
|
262
|
+
Parameters
|
|
263
|
+
----------
|
|
264
|
+
event : Event
|
|
265
|
+
"""
|
|
266
|
+
if event.is_start:
|
|
267
|
+
self.on_start(event)
|
|
268
|
+
elif event.is_end:
|
|
269
|
+
self.on_end(event)
|
|
270
|
+
else:
|
|
271
|
+
raise AssertionError("unreachable")
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
class TimingListener(Listener):
|
|
275
|
+
"""A listener that measures the total time spent between *START* and
|
|
276
|
+
*END* events during the time this listener is active.
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
def __init__(self):
|
|
280
|
+
self._depth = 0
|
|
281
|
+
|
|
282
|
+
def on_start(self, event):
|
|
283
|
+
if self._depth == 0:
|
|
284
|
+
self._ts = timer()
|
|
285
|
+
self._depth += 1
|
|
286
|
+
|
|
287
|
+
def on_end(self, event):
|
|
288
|
+
self._depth -= 1
|
|
289
|
+
if self._depth == 0:
|
|
290
|
+
last = getattr(self, "_duration", 0)
|
|
291
|
+
self._duration = (timer() - self._ts) + last
|
|
292
|
+
|
|
293
|
+
@property
|
|
294
|
+
def done(self):
|
|
295
|
+
"""Returns a ``bool`` indicating whether a measurement has been made.
|
|
296
|
+
|
|
297
|
+
When this returns ``False``, the matching event has never fired.
|
|
298
|
+
If and only if this returns ``True``, ``.duration`` can be read without
|
|
299
|
+
error.
|
|
300
|
+
"""
|
|
301
|
+
return hasattr(self, "_duration")
|
|
302
|
+
|
|
303
|
+
@property
|
|
304
|
+
def duration(self):
|
|
305
|
+
"""Returns the measured duration.
|
|
306
|
+
|
|
307
|
+
This may raise ``AttributeError``. Users can use ``.done`` to check
|
|
308
|
+
that a measurement has been made.
|
|
309
|
+
"""
|
|
310
|
+
return self._duration
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class RecordingListener(Listener):
|
|
314
|
+
"""A listener that records all events and stores them in the ``.buffer``
|
|
315
|
+
attribute as a list of 2-tuple ``(float, Event)``, where the first element
|
|
316
|
+
is the time the event occurred as returned by ``time.time()`` and the second
|
|
317
|
+
element is the event.
|
|
318
|
+
"""
|
|
319
|
+
|
|
320
|
+
def __init__(self):
|
|
321
|
+
self.buffer = []
|
|
322
|
+
|
|
323
|
+
def on_start(self, event):
|
|
324
|
+
self.buffer.append((time.time(), event))
|
|
325
|
+
|
|
326
|
+
def on_end(self, event):
|
|
327
|
+
self.buffer.append((time.time(), event))
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
@contextmanager
|
|
331
|
+
def install_listener(kind, listener):
|
|
332
|
+
"""Install a listener for event "kind" temporarily within the duration of
|
|
333
|
+
the context.
|
|
334
|
+
|
|
335
|
+
Returns
|
|
336
|
+
-------
|
|
337
|
+
res : Listener
|
|
338
|
+
The *listener* provided.
|
|
339
|
+
|
|
340
|
+
Examples
|
|
341
|
+
--------
|
|
342
|
+
|
|
343
|
+
>>> with install_listener("numba-cuda:compile", listener):
|
|
344
|
+
>>> some_code() # listener will be active here.
|
|
345
|
+
>>> other_code() # listener will be unregistered by this point.
|
|
346
|
+
|
|
347
|
+
"""
|
|
348
|
+
register(kind, listener)
|
|
349
|
+
try:
|
|
350
|
+
yield listener
|
|
351
|
+
finally:
|
|
352
|
+
unregister(kind, listener)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
@contextmanager
|
|
356
|
+
def install_timer(kind, callback):
|
|
357
|
+
"""Install a TimingListener temporarily to measure the duration of
|
|
358
|
+
an event.
|
|
359
|
+
|
|
360
|
+
If the context completes successfully, the *callback* function is executed.
|
|
361
|
+
The *callback* function is expected to take a float argument for the
|
|
362
|
+
duration in seconds.
|
|
363
|
+
|
|
364
|
+
Returns
|
|
365
|
+
-------
|
|
366
|
+
res : TimingListener
|
|
367
|
+
|
|
368
|
+
Examples
|
|
369
|
+
--------
|
|
370
|
+
|
|
371
|
+
This is equivalent to:
|
|
372
|
+
|
|
373
|
+
>>> with install_listener(kind, TimingListener()) as res:
|
|
374
|
+
>>> ...
|
|
375
|
+
"""
|
|
376
|
+
tl = TimingListener()
|
|
377
|
+
with install_listener(kind, tl):
|
|
378
|
+
yield tl
|
|
379
|
+
|
|
380
|
+
if tl.done:
|
|
381
|
+
callback(tl.duration)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
@contextmanager
|
|
385
|
+
def install_recorder(kind):
|
|
386
|
+
"""Install a RecordingListener temporarily to record all events.
|
|
387
|
+
|
|
388
|
+
Once the context is closed, users can use ``RecordingListener.buffer``
|
|
389
|
+
to access the recorded events.
|
|
390
|
+
|
|
391
|
+
Returns
|
|
392
|
+
-------
|
|
393
|
+
res : RecordingListener
|
|
394
|
+
|
|
395
|
+
Examples
|
|
396
|
+
--------
|
|
397
|
+
|
|
398
|
+
This is equivalent to:
|
|
399
|
+
|
|
400
|
+
>>> with install_listener(kind, RecordingListener()) as res:
|
|
401
|
+
>>> ...
|
|
402
|
+
"""
|
|
403
|
+
rl = RecordingListener()
|
|
404
|
+
with install_listener(kind, rl):
|
|
405
|
+
yield rl
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def start_event(kind, data=None):
|
|
409
|
+
"""Trigger the start of an event of *kind* with *data*.
|
|
410
|
+
|
|
411
|
+
Parameters
|
|
412
|
+
----------
|
|
413
|
+
kind : str
|
|
414
|
+
Event kind.
|
|
415
|
+
data : any; optional
|
|
416
|
+
Extra event data.
|
|
417
|
+
"""
|
|
418
|
+
evt = Event(kind=kind, status=EventStatus.START, data=data)
|
|
419
|
+
broadcast(evt)
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
def end_event(kind, data=None, exc_details=None):
|
|
423
|
+
"""Trigger the end of an event of *kind*, *exc_details*.
|
|
424
|
+
|
|
425
|
+
Parameters
|
|
426
|
+
----------
|
|
427
|
+
kind : str
|
|
428
|
+
Event kind.
|
|
429
|
+
data : any; optional
|
|
430
|
+
Extra event data.
|
|
431
|
+
exc_details : 3-tuple; optional
|
|
432
|
+
Same 3-tuple for ``__exit__``. Or, ``None`` if no error.
|
|
433
|
+
"""
|
|
434
|
+
evt = Event(
|
|
435
|
+
kind=kind,
|
|
436
|
+
status=EventStatus.END,
|
|
437
|
+
data=data,
|
|
438
|
+
exc_details=exc_details,
|
|
439
|
+
)
|
|
440
|
+
broadcast(evt)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@contextmanager
|
|
444
|
+
def trigger_event(kind, data=None):
|
|
445
|
+
"""A context manager to trigger the start and end events of *kind* with
|
|
446
|
+
*data*. The start event is triggered when entering the context.
|
|
447
|
+
The end event is triggered when exiting the context.
|
|
448
|
+
|
|
449
|
+
Parameters
|
|
450
|
+
----------
|
|
451
|
+
kind : str
|
|
452
|
+
Event kind.
|
|
453
|
+
data : any; optional
|
|
454
|
+
Extra event data.
|
|
455
|
+
"""
|
|
456
|
+
with ExitStack() as scope:
|
|
457
|
+
|
|
458
|
+
@scope.push
|
|
459
|
+
def on_exit(*exc_details):
|
|
460
|
+
end_event(kind, data=data, exc_details=exc_details)
|
|
461
|
+
|
|
462
|
+
start_event(kind, data=data)
|
|
463
|
+
yield
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
def _prepare_chrome_trace_data(listener: RecordingListener):
|
|
467
|
+
"""Prepare events in `listener` for serializing as chrome trace data."""
|
|
468
|
+
# The spec for the trace event format can be found at:
|
|
469
|
+
# https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/edit # noqa
|
|
470
|
+
# This code only uses the JSON Array Format for simplicity.
|
|
471
|
+
pid = os.getpid()
|
|
472
|
+
tid = threading.get_native_id()
|
|
473
|
+
evs = []
|
|
474
|
+
for ts, rec in listener.buffer:
|
|
475
|
+
data = rec.data
|
|
476
|
+
cat = str(rec.kind)
|
|
477
|
+
ts_scaled = ts * 1_000_000 # scale to microseconds
|
|
478
|
+
ph = "B" if rec.is_start else "E"
|
|
479
|
+
name = data["name"]
|
|
480
|
+
args = data
|
|
481
|
+
ev = dict(
|
|
482
|
+
cat=cat,
|
|
483
|
+
pid=pid,
|
|
484
|
+
tid=tid,
|
|
485
|
+
ts=ts_scaled,
|
|
486
|
+
ph=ph,
|
|
487
|
+
name=name,
|
|
488
|
+
args=args,
|
|
489
|
+
)
|
|
490
|
+
evs.append(ev)
|
|
491
|
+
return evs
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
def _setup_chrome_trace_exit_handler():
|
|
495
|
+
"""Setup a RecordingListener and an exit handler to write the captured
|
|
496
|
+
events to file.
|
|
497
|
+
"""
|
|
498
|
+
listener = RecordingListener()
|
|
499
|
+
register("numba-cuda:run_pass", listener)
|
|
500
|
+
filename = config.CHROME_TRACE
|
|
501
|
+
|
|
502
|
+
@atexit.register
|
|
503
|
+
def _write_chrome_trace():
|
|
504
|
+
# The following output file is not multi-process safe.
|
|
505
|
+
evs = _prepare_chrome_trace_data(listener)
|
|
506
|
+
with open(filename, "w") as out:
|
|
507
|
+
json.dump(evs, out, cls=utils._LazyJSONEncoder)
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
if config.CHROME_TRACE:
|
|
511
|
+
_setup_chrome_trace_exit_handler()
|