numba-cuda 0.21.1__cp313-cp313-win_amd64.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 +577 -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.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
- numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -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.cp313-win_amd64.pyd +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.cp313-win_amd64.pyd +0 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -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.cp313-win_amd64.pyd +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 +556 -0
- numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
- numba_cuda/numba/cuda/cudadrv/devicearray.py +951 -0
- numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
- numba_cuda/numba/cuda/cudadrv/driver.py +3222 -0
- numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +558 -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 +995 -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 +903 -0
- numba_cuda/numba/cuda/decorators.py +294 -0
- numba_cuda/numba/cuda/descriptor.py +35 -0
- numba_cuda/numba/cuda/device_init.py +158 -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/intrinsic_wrapper.py +41 -0
- numba_cuda/numba/cuda/intrinsics.py +382 -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 +1951 -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 +635 -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 +187 -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 +198 -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 +889 -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 +331 -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 +391 -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.21.1.dist-info/METADATA +109 -0
- numba_cuda-0.21.1.dist-info/RECORD +488 -0
- numba_cuda-0.21.1.dist-info/WHEEL +5 -0
- numba_cuda-0.21.1.dist-info/licenses/LICENSE +26 -0
- numba_cuda-0.21.1.dist-info/licenses/LICENSE.numba +24 -0
- numba_cuda-0.21.1.dist-info/top_level.txt +1 -0
|
File without changes
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
This module implements code highlighting of numba-cuda function annotations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from warnings import warn
|
|
9
|
+
|
|
10
|
+
warn(
|
|
11
|
+
"The pretty_annotate functionality is experimental and might change API",
|
|
12
|
+
FutureWarning,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def hllines(code, style):
|
|
17
|
+
try:
|
|
18
|
+
from pygments import highlight
|
|
19
|
+
from pygments.lexers import PythonLexer
|
|
20
|
+
from pygments.formatters import HtmlFormatter
|
|
21
|
+
except ImportError:
|
|
22
|
+
raise ImportError("please install the 'pygments' package")
|
|
23
|
+
pylex = PythonLexer()
|
|
24
|
+
"Given a code string, return a list of html-highlighted lines"
|
|
25
|
+
hf = HtmlFormatter(noclasses=True, style=style, nowrap=True)
|
|
26
|
+
res = highlight(code, pylex, hf)
|
|
27
|
+
return res.splitlines()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def htlines(code, style):
|
|
31
|
+
try:
|
|
32
|
+
from pygments import highlight
|
|
33
|
+
from pygments.lexers import PythonLexer
|
|
34
|
+
|
|
35
|
+
# TerminalFormatter does not support themes, Terminal256 should,
|
|
36
|
+
# but seem to not work.
|
|
37
|
+
from pygments.formatters import TerminalFormatter
|
|
38
|
+
except ImportError:
|
|
39
|
+
raise ImportError("please install the 'pygments' package")
|
|
40
|
+
pylex = PythonLexer()
|
|
41
|
+
"Given a code string, return a list of ANSI-highlighted lines"
|
|
42
|
+
hf = TerminalFormatter(style=style)
|
|
43
|
+
res = highlight(code, pylex, hf)
|
|
44
|
+
return res.splitlines()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_ansi_template():
|
|
48
|
+
try:
|
|
49
|
+
from jinja2 import Template
|
|
50
|
+
except ImportError:
|
|
51
|
+
raise ImportError("please install the 'jinja2' package")
|
|
52
|
+
return Template("""
|
|
53
|
+
{%- for func_key in func_data.keys() -%}
|
|
54
|
+
Function name: \x1b[34m{{func_data[func_key]['funcname']}}\x1b[39;49;00m
|
|
55
|
+
{%- if func_data[func_key]['filename'] -%}
|
|
56
|
+
{{'\n'}}In file: \x1b[34m{{func_data[func_key]['filename'] -}}\x1b[39;49;00m
|
|
57
|
+
{%- endif -%}
|
|
58
|
+
{{'\n'}}With signature: \x1b[34m{{func_key[1]}}\x1b[39;49;00m
|
|
59
|
+
{{- "\n" -}}
|
|
60
|
+
{%- for num, line, hl, hc in func_data[func_key]['pygments_lines'] -%}
|
|
61
|
+
{{-'\n'}}{{ num}}: {{hc-}}
|
|
62
|
+
{%- if func_data[func_key]['ir_lines'][num] -%}
|
|
63
|
+
{%- for ir_line, ir_line_type in func_data[func_key]['ir_lines'][num] %}
|
|
64
|
+
{{-'\n'}}--{{- ' '*func_data[func_key]['python_indent'][num]}}
|
|
65
|
+
{{- ' '*(func_data[func_key]['ir_indent'][num][loop.index0]+4)
|
|
66
|
+
}}{{ir_line }}\x1b[41m{{ir_line_type-}}\x1b[39;49;00m
|
|
67
|
+
{%- endfor -%}
|
|
68
|
+
{%- endif -%}
|
|
69
|
+
{%- endfor -%}
|
|
70
|
+
{%- endfor -%}
|
|
71
|
+
""")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_html_template():
|
|
75
|
+
try:
|
|
76
|
+
from jinja2 import Template
|
|
77
|
+
except ImportError:
|
|
78
|
+
raise ImportError("please install the 'jinja2' package")
|
|
79
|
+
return Template("""
|
|
80
|
+
<html>
|
|
81
|
+
<head>
|
|
82
|
+
<style>
|
|
83
|
+
|
|
84
|
+
.annotation_table {
|
|
85
|
+
color: #000000;
|
|
86
|
+
font-family: monospace;
|
|
87
|
+
margin: 5px;
|
|
88
|
+
width: 100%;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* override JupyterLab style */
|
|
92
|
+
.annotation_table td {
|
|
93
|
+
text-align: left;
|
|
94
|
+
background-color: transparent;
|
|
95
|
+
padding: 1px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.annotation_table tbody tr:nth-child(even) {
|
|
99
|
+
background: white;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.annotation_table code
|
|
103
|
+
{
|
|
104
|
+
background-color: transparent;
|
|
105
|
+
white-space: normal;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* End override JupyterLab style */
|
|
109
|
+
|
|
110
|
+
tr:hover {
|
|
111
|
+
background-color: rgba(92, 200, 249, 0.25);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
td.object_tag summary ,
|
|
115
|
+
td.lifted_tag summary{
|
|
116
|
+
font-weight: bold;
|
|
117
|
+
display: list-item;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
span.lifted_tag {
|
|
121
|
+
color: #00cc33;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
span.object_tag {
|
|
125
|
+
color: #cc3300;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
td.lifted_tag {
|
|
130
|
+
background-color: #cdf7d8;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
td.object_tag {
|
|
134
|
+
background-color: #fef5c8;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
code.ir_code {
|
|
138
|
+
color: grey;
|
|
139
|
+
font-style: italic;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.metadata {
|
|
143
|
+
border-bottom: medium solid black;
|
|
144
|
+
display: inline-block;
|
|
145
|
+
padding: 5px;
|
|
146
|
+
width: 100%;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.annotations {
|
|
150
|
+
padding: 5px;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.hidden {
|
|
154
|
+
display: none;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.buttons {
|
|
158
|
+
padding: 10px;
|
|
159
|
+
cursor: pointer;
|
|
160
|
+
}
|
|
161
|
+
</style>
|
|
162
|
+
</head>
|
|
163
|
+
|
|
164
|
+
<body>
|
|
165
|
+
{% for func_key in func_data.keys() %}
|
|
166
|
+
<div class="metadata">
|
|
167
|
+
Function name: {{func_data[func_key]['funcname']}}<br />
|
|
168
|
+
{% if func_data[func_key]['filename'] %}
|
|
169
|
+
in file: {{func_data[func_key]['filename']|escape}}<br />
|
|
170
|
+
{% endif %}
|
|
171
|
+
with signature: {{func_key[1]|e}}
|
|
172
|
+
</div>
|
|
173
|
+
<div class="annotations">
|
|
174
|
+
<table class="annotation_table tex2jax_ignore">
|
|
175
|
+
{%- for num, line, hl, hc in func_data[func_key]['pygments_lines'] -%}
|
|
176
|
+
{%- if func_data[func_key]['ir_lines'][num] %}
|
|
177
|
+
<tr><td style="text-align:left;" class="{{func_data[func_key]['python_tags'][num]}}">
|
|
178
|
+
<details>
|
|
179
|
+
<summary>
|
|
180
|
+
<code>
|
|
181
|
+
{{num}}:
|
|
182
|
+
{{' '*func_data[func_key]['python_indent'][num]}}{{hl}}
|
|
183
|
+
</code>
|
|
184
|
+
</summary>
|
|
185
|
+
<table class="annotation_table">
|
|
186
|
+
<tbody>
|
|
187
|
+
{%- for ir_line, ir_line_type in func_data[func_key]['ir_lines'][num] %}
|
|
188
|
+
<tr class="ir_code">
|
|
189
|
+
<td style="text-align: left;"><code>
|
|
190
|
+
|
|
191
|
+
{{- ' '*func_data[func_key]['python_indent'][num]}}
|
|
192
|
+
{{ ' '*func_data[func_key]['ir_indent'][num][loop.index0]}}{{ir_line|e -}}
|
|
193
|
+
<span class="object_tag">{{ir_line_type}}</span>
|
|
194
|
+
</code>
|
|
195
|
+
</td>
|
|
196
|
+
</tr>
|
|
197
|
+
{%- endfor -%}
|
|
198
|
+
</tbody>
|
|
199
|
+
</table>
|
|
200
|
+
</details>
|
|
201
|
+
</td></tr>
|
|
202
|
+
{% else -%}
|
|
203
|
+
<tr><td style="text-align:left; padding-left: 22px;" class="{{func_data[func_key]['python_tags'][num]}}">
|
|
204
|
+
<code>
|
|
205
|
+
{{num}}:
|
|
206
|
+
{{' '*func_data[func_key]['python_indent'][num]}}{{hl}}
|
|
207
|
+
</code>
|
|
208
|
+
</td></tr>
|
|
209
|
+
{%- endif -%}
|
|
210
|
+
{%- endfor -%}
|
|
211
|
+
</table>
|
|
212
|
+
</div>
|
|
213
|
+
{% endfor %}
|
|
214
|
+
</body>
|
|
215
|
+
</html>
|
|
216
|
+
""")
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def reform_code(annotation):
|
|
220
|
+
"""
|
|
221
|
+
Extract the code from the Numba-cuda annotation datastructure.
|
|
222
|
+
|
|
223
|
+
Pygments can only highlight full multi-line strings, the Numba-cuda
|
|
224
|
+
annotation is list of single lines, with indentation removed.
|
|
225
|
+
"""
|
|
226
|
+
ident_dict = annotation["python_indent"]
|
|
227
|
+
s = ""
|
|
228
|
+
for n, l in annotation["python_lines"]:
|
|
229
|
+
s = s + " " * ident_dict[n] + l + "\n"
|
|
230
|
+
return s
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class Annotate:
|
|
234
|
+
"""
|
|
235
|
+
Construct syntax highlighted annotation for a given jitted function:
|
|
236
|
+
|
|
237
|
+
Example:
|
|
238
|
+
|
|
239
|
+
>>> from numba import cuda
|
|
240
|
+
>>> import numpy as np
|
|
241
|
+
>>> from numba.cuda.core.annotations.pretty_annotate import Annotate
|
|
242
|
+
>>> @cuda.jit
|
|
243
|
+
... def test(a):
|
|
244
|
+
... tid = cuda.grid(1)
|
|
245
|
+
... size = len(a)
|
|
246
|
+
... if tid < size:
|
|
247
|
+
... a[tid] = 1
|
|
248
|
+
>>> test[(4), (16)](np.ones(100))
|
|
249
|
+
>>> Annotate(test)
|
|
250
|
+
|
|
251
|
+
The last line will return an HTML and/or ANSI representation that will be
|
|
252
|
+
displayed accordingly in Jupyter/IPython.
|
|
253
|
+
|
|
254
|
+
Function annotations persist across compilation for newly encountered
|
|
255
|
+
type signatures and as a result annotations are shown for all signatures
|
|
256
|
+
by default.
|
|
257
|
+
|
|
258
|
+
Annotations for a specific signature can be shown by using the
|
|
259
|
+
``signature`` parameter. For the above jitted function:
|
|
260
|
+
|
|
261
|
+
>>> test.signatures
|
|
262
|
+
[(Array(float64, 1, 'C', False, aligned=True),)]
|
|
263
|
+
>>> Annotate(f, signature=f.signatures[0])
|
|
264
|
+
# annotation for Array(float64, 1, 'C', False, aligned=True)
|
|
265
|
+
"""
|
|
266
|
+
|
|
267
|
+
def __init__(self, function, signature=None, **kwargs):
|
|
268
|
+
style = kwargs.get("style", "default")
|
|
269
|
+
if not function.signatures:
|
|
270
|
+
raise ValueError(
|
|
271
|
+
"function need to be jitted for at least one signature"
|
|
272
|
+
)
|
|
273
|
+
ann = function.get_annotation_info(signature=signature)
|
|
274
|
+
self.ann = ann
|
|
275
|
+
|
|
276
|
+
for k, v in ann.items():
|
|
277
|
+
res = hllines(reform_code(v), style)
|
|
278
|
+
rest = htlines(reform_code(v), style)
|
|
279
|
+
v["pygments_lines"] = [
|
|
280
|
+
(a, b, c, d)
|
|
281
|
+
for (a, b), c, d in zip(v["python_lines"], res, rest)
|
|
282
|
+
]
|
|
283
|
+
|
|
284
|
+
def _repr_html_(self):
|
|
285
|
+
return get_html_template().render(func_data=self.ann)
|
|
286
|
+
|
|
287
|
+
def __repr__(self):
|
|
288
|
+
return get_ansi_template().render(func_data=self.ann)
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
from collections import defaultdict, OrderedDict
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
from contextlib import closing
|
|
7
|
+
import copy
|
|
8
|
+
import inspect
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
import textwrap
|
|
12
|
+
from io import StringIO
|
|
13
|
+
|
|
14
|
+
from numba.cuda.core import ir
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SourceLines(Mapping):
|
|
18
|
+
def __init__(self, func):
|
|
19
|
+
try:
|
|
20
|
+
lines, startno = inspect.getsourcelines(func)
|
|
21
|
+
except OSError:
|
|
22
|
+
self.lines = ()
|
|
23
|
+
self.startno = 0
|
|
24
|
+
else:
|
|
25
|
+
self.lines = textwrap.dedent("".join(lines)).splitlines()
|
|
26
|
+
self.startno = startno
|
|
27
|
+
|
|
28
|
+
def __getitem__(self, lineno):
|
|
29
|
+
try:
|
|
30
|
+
return self.lines[lineno - self.startno].rstrip()
|
|
31
|
+
except IndexError:
|
|
32
|
+
return ""
|
|
33
|
+
|
|
34
|
+
def __iter__(self):
|
|
35
|
+
return iter((self.startno + i) for i in range(len(self.lines)))
|
|
36
|
+
|
|
37
|
+
def __len__(self):
|
|
38
|
+
return len(self.lines)
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def avail(self):
|
|
42
|
+
return bool(self.lines)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class TypeAnnotation(object):
|
|
46
|
+
# func_data dict stores annotation data for all functions that are
|
|
47
|
+
# compiled. We store the data in the TypeAnnotation class since a new
|
|
48
|
+
# TypeAnnotation instance is created for each function that is compiled.
|
|
49
|
+
# For every function that is compiled, we add the type annotation data to
|
|
50
|
+
# this dict and write the html annotation file to disk (rewrite the html
|
|
51
|
+
# file for every function since we don't know if this is the last function
|
|
52
|
+
# to be compiled).
|
|
53
|
+
func_data = OrderedDict()
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
func_ir,
|
|
58
|
+
typemap,
|
|
59
|
+
calltypes,
|
|
60
|
+
lifted,
|
|
61
|
+
lifted_from,
|
|
62
|
+
args,
|
|
63
|
+
return_type,
|
|
64
|
+
html_output=None,
|
|
65
|
+
):
|
|
66
|
+
self.func_id = func_ir.func_id
|
|
67
|
+
self.blocks = func_ir.blocks
|
|
68
|
+
self.typemap = typemap
|
|
69
|
+
self.calltypes = calltypes
|
|
70
|
+
self.filename = func_ir.loc.filename
|
|
71
|
+
self.linenum = str(func_ir.loc.line)
|
|
72
|
+
self.signature = str(args) + " -> " + str(return_type)
|
|
73
|
+
|
|
74
|
+
# lifted loop information
|
|
75
|
+
self.lifted = lifted
|
|
76
|
+
self.num_lifted_loops = len(lifted)
|
|
77
|
+
|
|
78
|
+
# If this is a lifted loop function that is being compiled, lifted_from
|
|
79
|
+
# points to annotation data from function that this loop lifted function
|
|
80
|
+
# was lifted from. This is used to stick lifted loop annotations back
|
|
81
|
+
# into original function.
|
|
82
|
+
self.lifted_from = lifted_from
|
|
83
|
+
|
|
84
|
+
def prepare_annotations(self):
|
|
85
|
+
from numba.cuda.dispatcher import LiftedLoop
|
|
86
|
+
|
|
87
|
+
# Prepare annotations
|
|
88
|
+
groupedinst = defaultdict(list)
|
|
89
|
+
found_lifted_loop = False
|
|
90
|
+
# for blkid, blk in self.blocks.items():
|
|
91
|
+
for blkid in sorted(self.blocks.keys()):
|
|
92
|
+
blk = self.blocks[blkid]
|
|
93
|
+
groupedinst[blk.loc.line].append("label %s" % blkid)
|
|
94
|
+
for inst in blk.body:
|
|
95
|
+
lineno = inst.loc.line
|
|
96
|
+
|
|
97
|
+
if isinstance(inst, ir.Assign):
|
|
98
|
+
if found_lifted_loop:
|
|
99
|
+
atype = "XXX Lifted Loop XXX"
|
|
100
|
+
found_lifted_loop = False
|
|
101
|
+
elif (
|
|
102
|
+
isinstance(inst.value, ir.Expr)
|
|
103
|
+
and inst.value.op == "call"
|
|
104
|
+
):
|
|
105
|
+
atype = self.calltypes[inst.value]
|
|
106
|
+
elif isinstance(inst.value, ir.Const) and isinstance(
|
|
107
|
+
inst.value.value, LiftedLoop
|
|
108
|
+
):
|
|
109
|
+
atype = "XXX Lifted Loop XXX"
|
|
110
|
+
found_lifted_loop = True
|
|
111
|
+
else:
|
|
112
|
+
# TODO: fix parfor lowering so that typemap is valid.
|
|
113
|
+
atype = self.typemap.get(inst.target.name, "<missing>")
|
|
114
|
+
|
|
115
|
+
aline = "%s = %s :: %s" % (inst.target, inst.value, atype)
|
|
116
|
+
elif isinstance(inst, ir.SetItem):
|
|
117
|
+
atype = self.calltypes[inst]
|
|
118
|
+
aline = "%s :: %s" % (inst, atype)
|
|
119
|
+
else:
|
|
120
|
+
aline = "%s" % inst
|
|
121
|
+
groupedinst[lineno].append(" %s" % aline)
|
|
122
|
+
return groupedinst
|
|
123
|
+
|
|
124
|
+
def annotate(self):
|
|
125
|
+
source = SourceLines(self.func_id.func)
|
|
126
|
+
# if not source.avail:
|
|
127
|
+
# return "Source code unavailable"
|
|
128
|
+
|
|
129
|
+
groupedinst = self.prepare_annotations()
|
|
130
|
+
|
|
131
|
+
# Format annotations
|
|
132
|
+
io = StringIO()
|
|
133
|
+
with closing(io):
|
|
134
|
+
if source.avail:
|
|
135
|
+
print("# File: %s" % self.filename, file=io)
|
|
136
|
+
for num in source:
|
|
137
|
+
srcline = source[num]
|
|
138
|
+
ind = _getindent(srcline)
|
|
139
|
+
print("%s# --- LINE %d --- " % (ind, num), file=io)
|
|
140
|
+
for inst in groupedinst[num]:
|
|
141
|
+
print("%s# %s" % (ind, inst), file=io)
|
|
142
|
+
print(file=io)
|
|
143
|
+
print(srcline, file=io)
|
|
144
|
+
print(file=io)
|
|
145
|
+
if self.lifted:
|
|
146
|
+
print("# The function contains lifted loops", file=io)
|
|
147
|
+
for loop in self.lifted:
|
|
148
|
+
print(
|
|
149
|
+
"# Loop at line %d" % loop.get_source_location(),
|
|
150
|
+
file=io,
|
|
151
|
+
)
|
|
152
|
+
print(
|
|
153
|
+
"# Has %d overloads" % len(loop.overloads), file=io
|
|
154
|
+
)
|
|
155
|
+
for cres in loop.overloads.values():
|
|
156
|
+
print(cres.type_annotation, file=io)
|
|
157
|
+
else:
|
|
158
|
+
print("# Source code unavailable", file=io)
|
|
159
|
+
for num in groupedinst:
|
|
160
|
+
for inst in groupedinst[num]:
|
|
161
|
+
print("%s" % (inst,), file=io)
|
|
162
|
+
print(file=io)
|
|
163
|
+
|
|
164
|
+
return io.getvalue()
|
|
165
|
+
|
|
166
|
+
def html_annotate(self, outfile):
|
|
167
|
+
# ensure that annotation information is assembled
|
|
168
|
+
self.annotate_raw()
|
|
169
|
+
# make a deep copy ahead of the pending mutations
|
|
170
|
+
func_data = copy.deepcopy(self.func_data)
|
|
171
|
+
|
|
172
|
+
key = "python_indent"
|
|
173
|
+
for this_func in func_data.values():
|
|
174
|
+
if key in this_func:
|
|
175
|
+
idents = {}
|
|
176
|
+
for line, amount in this_func[key].items():
|
|
177
|
+
idents[line] = " " * amount
|
|
178
|
+
this_func[key] = idents
|
|
179
|
+
|
|
180
|
+
key = "ir_indent"
|
|
181
|
+
for this_func in func_data.values():
|
|
182
|
+
if key in this_func:
|
|
183
|
+
idents = {}
|
|
184
|
+
for line, ir_id in this_func[key].items():
|
|
185
|
+
idents[line] = [" " * amount for amount in ir_id]
|
|
186
|
+
this_func[key] = idents
|
|
187
|
+
|
|
188
|
+
try:
|
|
189
|
+
from jinja2 import Template
|
|
190
|
+
except ImportError:
|
|
191
|
+
raise ImportError("please install the 'jinja2' package")
|
|
192
|
+
|
|
193
|
+
root = os.path.join(os.path.dirname(__file__))
|
|
194
|
+
template_filename = os.path.join(root, "template.html")
|
|
195
|
+
with open(template_filename, "r") as template:
|
|
196
|
+
html = template.read()
|
|
197
|
+
|
|
198
|
+
template = Template(html)
|
|
199
|
+
rendered = template.render(func_data=func_data)
|
|
200
|
+
outfile.write(rendered)
|
|
201
|
+
|
|
202
|
+
def annotate_raw(self):
|
|
203
|
+
"""
|
|
204
|
+
This returns "raw" annotation information i.e. it has no output format
|
|
205
|
+
specific markup included.
|
|
206
|
+
"""
|
|
207
|
+
python_source = SourceLines(self.func_id.func)
|
|
208
|
+
ir_lines = self.prepare_annotations()
|
|
209
|
+
line_nums = [num for num in python_source]
|
|
210
|
+
lifted_lines = [l.get_source_location() for l in self.lifted]
|
|
211
|
+
|
|
212
|
+
def add_ir_line(func_data, line):
|
|
213
|
+
line_str = line.strip()
|
|
214
|
+
line_type = ""
|
|
215
|
+
if line_str.endswith("pyobject"):
|
|
216
|
+
line_str = line_str.replace("pyobject", "")
|
|
217
|
+
line_type = "pyobject"
|
|
218
|
+
func_data["ir_lines"][num].append((line_str, line_type))
|
|
219
|
+
indent_len = len(_getindent(line))
|
|
220
|
+
func_data["ir_indent"][num].append(indent_len)
|
|
221
|
+
|
|
222
|
+
func_key = (
|
|
223
|
+
self.func_id.filename + ":" + str(self.func_id.firstlineno + 1),
|
|
224
|
+
self.signature,
|
|
225
|
+
)
|
|
226
|
+
if (
|
|
227
|
+
self.lifted_from is not None
|
|
228
|
+
and self.lifted_from[1]["num_lifted_loops"] > 0
|
|
229
|
+
):
|
|
230
|
+
# This is a lifted loop function that is being compiled. Get the
|
|
231
|
+
# numba ir for lines in loop function to use for annotating
|
|
232
|
+
# original python function that the loop was lifted from.
|
|
233
|
+
func_data = self.lifted_from[1]
|
|
234
|
+
for num in line_nums:
|
|
235
|
+
if num not in ir_lines.keys():
|
|
236
|
+
continue
|
|
237
|
+
func_data["ir_lines"][num] = []
|
|
238
|
+
func_data["ir_indent"][num] = []
|
|
239
|
+
for line in ir_lines[num]:
|
|
240
|
+
add_ir_line(func_data, line)
|
|
241
|
+
if line.strip().endswith("pyobject"):
|
|
242
|
+
func_data["python_tags"][num] = "object_tag"
|
|
243
|
+
# If any pyobject line is found, make sure original python
|
|
244
|
+
# line that was marked as a lifted loop start line is tagged
|
|
245
|
+
# as an object line instead. Lifted loop start lines should
|
|
246
|
+
# only be marked as lifted loop lines if the lifted loop
|
|
247
|
+
# was successfully compiled in nopython mode.
|
|
248
|
+
func_data["python_tags"][self.lifted_from[0]] = (
|
|
249
|
+
"object_tag"
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# We're done with this lifted loop, so decrement lifted loop counter.
|
|
253
|
+
# When lifted loop counter hits zero, that means we're ready to write
|
|
254
|
+
# out annotations to html file.
|
|
255
|
+
self.lifted_from[1]["num_lifted_loops"] -= 1
|
|
256
|
+
|
|
257
|
+
elif func_key not in TypeAnnotation.func_data.keys():
|
|
258
|
+
TypeAnnotation.func_data[func_key] = {}
|
|
259
|
+
func_data = TypeAnnotation.func_data[func_key]
|
|
260
|
+
|
|
261
|
+
for i, loop in enumerate(self.lifted):
|
|
262
|
+
# Make sure that when we process each lifted loop function later,
|
|
263
|
+
# we'll know where it originally came from.
|
|
264
|
+
loop.lifted_from = (lifted_lines[i], func_data)
|
|
265
|
+
func_data["num_lifted_loops"] = self.num_lifted_loops
|
|
266
|
+
|
|
267
|
+
func_data["filename"] = self.filename
|
|
268
|
+
func_data["funcname"] = self.func_id.func_name
|
|
269
|
+
func_data["python_lines"] = []
|
|
270
|
+
func_data["python_indent"] = {}
|
|
271
|
+
func_data["python_tags"] = {}
|
|
272
|
+
func_data["ir_lines"] = {}
|
|
273
|
+
func_data["ir_indent"] = {}
|
|
274
|
+
|
|
275
|
+
for num in line_nums:
|
|
276
|
+
func_data["python_lines"].append(
|
|
277
|
+
(num, python_source[num].strip())
|
|
278
|
+
)
|
|
279
|
+
indent_len = len(_getindent(python_source[num]))
|
|
280
|
+
func_data["python_indent"][num] = indent_len
|
|
281
|
+
func_data["python_tags"][num] = ""
|
|
282
|
+
func_data["ir_lines"][num] = []
|
|
283
|
+
func_data["ir_indent"][num] = []
|
|
284
|
+
|
|
285
|
+
for line in ir_lines[num]:
|
|
286
|
+
add_ir_line(func_data, line)
|
|
287
|
+
if num in lifted_lines:
|
|
288
|
+
func_data["python_tags"][num] = "lifted_tag"
|
|
289
|
+
elif line.strip().endswith("pyobject"):
|
|
290
|
+
func_data["python_tags"][num] = "object_tag"
|
|
291
|
+
return self.func_data
|
|
292
|
+
|
|
293
|
+
def __str__(self):
|
|
294
|
+
return self.annotate()
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
re_longest_white_prefix = re.compile(r"^\s*")
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _getindent(text):
|
|
301
|
+
m = re_longest_white_prefix.match(text)
|
|
302
|
+
if not m:
|
|
303
|
+
return ""
|
|
304
|
+
else:
|
|
305
|
+
return " " * len(m.group(0))
|