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
|
@@ -0,0 +1,782 @@
|
|
|
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
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
import types as pytypes
|
|
7
|
+
import weakref
|
|
8
|
+
import threading
|
|
9
|
+
import contextlib
|
|
10
|
+
import operator
|
|
11
|
+
from importlib.util import find_spec
|
|
12
|
+
|
|
13
|
+
from numba.cuda.core import errors
|
|
14
|
+
from numba.cuda.typeconv import Conversion, rules
|
|
15
|
+
from numba.cuda.typing.typeof import typeof, Purpose
|
|
16
|
+
from numba.cuda.typing import templates
|
|
17
|
+
from numba.cuda import types, utils
|
|
18
|
+
from numba.cuda.utils import order_by_target_specificity
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Rating(object):
|
|
22
|
+
__slots__ = "promote", "safe_convert", "unsafe_convert"
|
|
23
|
+
|
|
24
|
+
def __init__(self):
|
|
25
|
+
self.promote = 0
|
|
26
|
+
self.safe_convert = 0
|
|
27
|
+
self.unsafe_convert = 0
|
|
28
|
+
|
|
29
|
+
def astuple(self):
|
|
30
|
+
"""Returns a tuple suitable for comparing with the worse situation
|
|
31
|
+
start first.
|
|
32
|
+
"""
|
|
33
|
+
return (self.unsafe_convert, self.safe_convert, self.promote)
|
|
34
|
+
|
|
35
|
+
def __add__(self, other):
|
|
36
|
+
if type(self) is not type(other):
|
|
37
|
+
return NotImplemented
|
|
38
|
+
rsum = Rating()
|
|
39
|
+
rsum.promote = self.promote + other.promote
|
|
40
|
+
rsum.safe_convert = self.safe_convert + other.safe_convert
|
|
41
|
+
rsum.unsafe_convert = self.unsafe_convert + other.unsafe_convert
|
|
42
|
+
return rsum
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class CallStack(Sequence):
|
|
46
|
+
"""
|
|
47
|
+
A compile-time call stack
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self):
|
|
51
|
+
self._stack = []
|
|
52
|
+
self._lock = threading.RLock()
|
|
53
|
+
|
|
54
|
+
def __getitem__(self, index):
|
|
55
|
+
"""
|
|
56
|
+
Returns item in the stack where index=0 is the top and index=1 is
|
|
57
|
+
the second item from the top.
|
|
58
|
+
"""
|
|
59
|
+
return self._stack[len(self) - index - 1]
|
|
60
|
+
|
|
61
|
+
def __len__(self):
|
|
62
|
+
return len(self._stack)
|
|
63
|
+
|
|
64
|
+
@contextlib.contextmanager
|
|
65
|
+
def register(self, target, typeinfer, func_id, args):
|
|
66
|
+
# guard compiling the same function with the same signature
|
|
67
|
+
if self.match(func_id.func, args):
|
|
68
|
+
msg = "compiler re-entrant to the same function signature"
|
|
69
|
+
raise errors.NumbaRuntimeError(msg)
|
|
70
|
+
self._lock.acquire()
|
|
71
|
+
self._stack.append(CallFrame(target, typeinfer, func_id, args))
|
|
72
|
+
try:
|
|
73
|
+
yield
|
|
74
|
+
finally:
|
|
75
|
+
self._stack.pop()
|
|
76
|
+
self._lock.release()
|
|
77
|
+
|
|
78
|
+
def finditer(self, py_func):
|
|
79
|
+
"""
|
|
80
|
+
Yields frame that matches the function object starting from the top
|
|
81
|
+
of stack.
|
|
82
|
+
"""
|
|
83
|
+
for frame in self:
|
|
84
|
+
if frame.func_id.func is py_func:
|
|
85
|
+
yield frame
|
|
86
|
+
|
|
87
|
+
def findfirst(self, py_func):
|
|
88
|
+
"""
|
|
89
|
+
Returns the first result from `.finditer(py_func)`; or None if no match.
|
|
90
|
+
"""
|
|
91
|
+
try:
|
|
92
|
+
return next(self.finditer(py_func))
|
|
93
|
+
except StopIteration:
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
def match(self, py_func, args):
|
|
97
|
+
"""
|
|
98
|
+
Returns first function that matches *py_func* and the arguments types in
|
|
99
|
+
*args*; or, None if no match.
|
|
100
|
+
"""
|
|
101
|
+
for frame in self.finditer(py_func):
|
|
102
|
+
if frame.args == args:
|
|
103
|
+
return frame
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class CallFrame(object):
|
|
107
|
+
"""
|
|
108
|
+
A compile-time call frame
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def __init__(self, target, typeinfer, func_id, args):
|
|
112
|
+
self.typeinfer = typeinfer
|
|
113
|
+
self.func_id = func_id
|
|
114
|
+
self.args = args
|
|
115
|
+
self.target = target
|
|
116
|
+
self._inferred_retty = set()
|
|
117
|
+
|
|
118
|
+
def __repr__(self):
|
|
119
|
+
return "CallFrame({}, {})".format(self.func_id, self.args)
|
|
120
|
+
|
|
121
|
+
def add_return_type(self, return_type):
|
|
122
|
+
"""Add *return_type* to the list of inferred return-types.
|
|
123
|
+
If there are too many, raise `TypingError`.
|
|
124
|
+
"""
|
|
125
|
+
# The maximum limit is picked arbitrarily.
|
|
126
|
+
# Don't think that this needs to be user configurable.
|
|
127
|
+
RETTY_LIMIT = 16
|
|
128
|
+
self._inferred_retty.add(return_type)
|
|
129
|
+
if len(self._inferred_retty) >= RETTY_LIMIT:
|
|
130
|
+
m = "Return type of recursive function does not converge"
|
|
131
|
+
raise errors.TypingError(m)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class BaseContext(object):
|
|
135
|
+
"""A typing context for storing function typing constrain template."""
|
|
136
|
+
|
|
137
|
+
def __init__(self):
|
|
138
|
+
# A list of installed registries
|
|
139
|
+
self._registries = {}
|
|
140
|
+
# Typing declarations extracted from the registries or other sources
|
|
141
|
+
self._functions = defaultdict(list)
|
|
142
|
+
self._attributes = defaultdict(list)
|
|
143
|
+
self._globals = utils.UniqueDict()
|
|
144
|
+
self.tm = rules.default_type_manager
|
|
145
|
+
self.callstack = CallStack()
|
|
146
|
+
|
|
147
|
+
# Initialize
|
|
148
|
+
self.init()
|
|
149
|
+
|
|
150
|
+
def init(self):
|
|
151
|
+
"""
|
|
152
|
+
Initialize the typing context. Can be overridden by subclasses.
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
def refresh(self):
|
|
156
|
+
"""
|
|
157
|
+
Refresh context with new declarations from known registries.
|
|
158
|
+
Useful for third-party extensions.
|
|
159
|
+
"""
|
|
160
|
+
self.load_additional_registries()
|
|
161
|
+
# Some extensions may have augmented the builtin registry
|
|
162
|
+
self._load_builtins()
|
|
163
|
+
|
|
164
|
+
def explain_function_type(self, func):
|
|
165
|
+
"""
|
|
166
|
+
Returns a string description of the type of a function
|
|
167
|
+
"""
|
|
168
|
+
desc = []
|
|
169
|
+
defns = []
|
|
170
|
+
param = False
|
|
171
|
+
if isinstance(func, types.Callable):
|
|
172
|
+
sigs, param = func.get_call_signatures()
|
|
173
|
+
defns.extend(sigs)
|
|
174
|
+
|
|
175
|
+
elif func in self._functions:
|
|
176
|
+
for tpl in self._functions[func]:
|
|
177
|
+
param = param or hasattr(tpl, "generic")
|
|
178
|
+
defns.extend(getattr(tpl, "cases", []))
|
|
179
|
+
|
|
180
|
+
else:
|
|
181
|
+
msg = "No type info available for {func!r} as a callable."
|
|
182
|
+
desc.append(msg.format(func=func))
|
|
183
|
+
|
|
184
|
+
if defns:
|
|
185
|
+
desc = ["Known signatures:"]
|
|
186
|
+
for sig in defns:
|
|
187
|
+
desc.append(" * {0}".format(sig))
|
|
188
|
+
|
|
189
|
+
return "\n".join(desc)
|
|
190
|
+
|
|
191
|
+
def resolve_function_type(self, func, args, kws):
|
|
192
|
+
"""
|
|
193
|
+
Resolve function type *func* for argument types *args* and *kws*.
|
|
194
|
+
A signature is returned.
|
|
195
|
+
"""
|
|
196
|
+
# Prefer user definition first
|
|
197
|
+
try:
|
|
198
|
+
res = self._resolve_user_function_type(func, args, kws)
|
|
199
|
+
except errors.TypingError as e:
|
|
200
|
+
# Capture any typing error
|
|
201
|
+
last_exception = e
|
|
202
|
+
res = None
|
|
203
|
+
else:
|
|
204
|
+
last_exception = None
|
|
205
|
+
|
|
206
|
+
# Return early we know there's a working user function
|
|
207
|
+
if res is not None:
|
|
208
|
+
return res
|
|
209
|
+
|
|
210
|
+
# Check builtin functions
|
|
211
|
+
res = self._resolve_builtin_function_type(func, args, kws)
|
|
212
|
+
|
|
213
|
+
# Re-raise last_exception if no function type has been found
|
|
214
|
+
if res is None and last_exception is not None:
|
|
215
|
+
raise last_exception
|
|
216
|
+
|
|
217
|
+
return res
|
|
218
|
+
|
|
219
|
+
def _resolve_builtin_function_type(self, func, args, kws):
|
|
220
|
+
# NOTE: we should reduce usage of this
|
|
221
|
+
if func in self._functions:
|
|
222
|
+
# Note: Duplicating code with types.Function.get_call_type().
|
|
223
|
+
# *defns* are CallTemplates.
|
|
224
|
+
defns = self._functions[func]
|
|
225
|
+
for defn in defns:
|
|
226
|
+
for support_literals in [True, False]:
|
|
227
|
+
if support_literals:
|
|
228
|
+
res = defn.apply(args, kws)
|
|
229
|
+
else:
|
|
230
|
+
fixedargs = [types.unliteral(a) for a in args]
|
|
231
|
+
res = defn.apply(fixedargs, kws)
|
|
232
|
+
if res is not None:
|
|
233
|
+
return res
|
|
234
|
+
|
|
235
|
+
def _resolve_user_function_type(self, func, args, kws, literals=None):
|
|
236
|
+
# It's not a known function type, perhaps it's a global?
|
|
237
|
+
functy = self._lookup_global(func)
|
|
238
|
+
if functy is not None:
|
|
239
|
+
func = functy
|
|
240
|
+
|
|
241
|
+
if isinstance(func, types.Type):
|
|
242
|
+
# If it's a type, it may support a __call__ method
|
|
243
|
+
func_type = self.resolve_getattr(func, "__call__")
|
|
244
|
+
if func_type is not None:
|
|
245
|
+
# The function has a __call__ method, type its call.
|
|
246
|
+
return self.resolve_function_type(func_type, args, kws)
|
|
247
|
+
|
|
248
|
+
if isinstance(func, types.Callable):
|
|
249
|
+
# XXX fold this into the __call__ attribute logic?
|
|
250
|
+
return func.get_call_type(self, args, kws)
|
|
251
|
+
|
|
252
|
+
def _get_attribute_templates(self, typ):
|
|
253
|
+
"""
|
|
254
|
+
Get matching AttributeTemplates for the Numba type.
|
|
255
|
+
"""
|
|
256
|
+
if typ in self._attributes:
|
|
257
|
+
for attrinfo in self._attributes[typ]:
|
|
258
|
+
yield attrinfo
|
|
259
|
+
else:
|
|
260
|
+
for cls in type(typ).__mro__:
|
|
261
|
+
if cls in self._attributes:
|
|
262
|
+
for attrinfo in self._attributes[cls]:
|
|
263
|
+
yield attrinfo
|
|
264
|
+
|
|
265
|
+
def resolve_getattr(self, typ, attr):
|
|
266
|
+
"""
|
|
267
|
+
Resolve getting the attribute *attr* (a string) on the Numba type.
|
|
268
|
+
The attribute's type is returned, or None if resolution failed.
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
def core(typ):
|
|
272
|
+
out = self.find_matching_getattr_template(typ, attr)
|
|
273
|
+
if out:
|
|
274
|
+
return out["return_type"]
|
|
275
|
+
|
|
276
|
+
out = core(typ)
|
|
277
|
+
if out is not None:
|
|
278
|
+
return out
|
|
279
|
+
|
|
280
|
+
# Try again without literals
|
|
281
|
+
out = core(types.unliteral(typ))
|
|
282
|
+
if out is not None:
|
|
283
|
+
return out
|
|
284
|
+
|
|
285
|
+
if isinstance(typ, types.Module):
|
|
286
|
+
attrty = self.resolve_module_constants(typ, attr)
|
|
287
|
+
if attrty is not None:
|
|
288
|
+
return attrty
|
|
289
|
+
|
|
290
|
+
def find_matching_getattr_template(self, typ, attr):
|
|
291
|
+
templates = list(self._get_attribute_templates(typ))
|
|
292
|
+
|
|
293
|
+
order = order_by_target_specificity(templates, fnkey=attr)
|
|
294
|
+
|
|
295
|
+
for template in order:
|
|
296
|
+
return_type = template.resolve(typ, attr)
|
|
297
|
+
if return_type is not None:
|
|
298
|
+
return {
|
|
299
|
+
"template": template,
|
|
300
|
+
"return_type": return_type,
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
def resolve_setattr(self, target, attr, value):
|
|
304
|
+
"""
|
|
305
|
+
Resolve setting the attribute *attr* (a string) on the *target* type
|
|
306
|
+
to the given *value* type.
|
|
307
|
+
A function signature is returned, or None if resolution failed.
|
|
308
|
+
"""
|
|
309
|
+
for attrinfo in self._get_attribute_templates(target):
|
|
310
|
+
expectedty = attrinfo.resolve(target, attr)
|
|
311
|
+
# NOTE: convertibility from *value* to *expectedty* is left to
|
|
312
|
+
# the caller.
|
|
313
|
+
if expectedty is not None:
|
|
314
|
+
return templates.signature(types.void, target, expectedty)
|
|
315
|
+
|
|
316
|
+
def resolve_static_getitem(self, value, index):
|
|
317
|
+
assert not isinstance(index, types.Type), index
|
|
318
|
+
args = value, index
|
|
319
|
+
kws = ()
|
|
320
|
+
return self.resolve_function_type("static_getitem", args, kws)
|
|
321
|
+
|
|
322
|
+
def resolve_static_setitem(self, target, index, value):
|
|
323
|
+
assert not isinstance(index, types.Type), index
|
|
324
|
+
args = target, index, value
|
|
325
|
+
kws = {}
|
|
326
|
+
return self.resolve_function_type("static_setitem", args, kws)
|
|
327
|
+
|
|
328
|
+
def resolve_setitem(self, target, index, value):
|
|
329
|
+
assert isinstance(index, types.Type), index
|
|
330
|
+
fnty = self.resolve_value_type(operator.setitem)
|
|
331
|
+
sig = fnty.get_call_type(self, (target, index, value), {})
|
|
332
|
+
return sig
|
|
333
|
+
|
|
334
|
+
def resolve_delitem(self, target, index):
|
|
335
|
+
args = target, index
|
|
336
|
+
kws = {}
|
|
337
|
+
fnty = self.resolve_value_type(operator.delitem)
|
|
338
|
+
sig = fnty.get_call_type(self, args, kws)
|
|
339
|
+
return sig
|
|
340
|
+
|
|
341
|
+
def resolve_module_constants(self, typ, attr):
|
|
342
|
+
"""
|
|
343
|
+
Resolve module-level global constants.
|
|
344
|
+
Return None or the attribute type
|
|
345
|
+
"""
|
|
346
|
+
assert isinstance(typ, types.Module)
|
|
347
|
+
attrval = getattr(typ.pymod, attr)
|
|
348
|
+
try:
|
|
349
|
+
return self.resolve_value_type(attrval)
|
|
350
|
+
except ValueError:
|
|
351
|
+
pass
|
|
352
|
+
|
|
353
|
+
def resolve_value_type(self, val):
|
|
354
|
+
"""
|
|
355
|
+
Return the numba type of a Python value that is being used
|
|
356
|
+
as a runtime constant.
|
|
357
|
+
ValueError is raised for unsupported types.
|
|
358
|
+
"""
|
|
359
|
+
try:
|
|
360
|
+
ty = typeof(val, Purpose.constant)
|
|
361
|
+
except ValueError as e:
|
|
362
|
+
# Make sure the exception doesn't hold a reference to the user
|
|
363
|
+
# value.
|
|
364
|
+
typeof_exc = utils.erase_traceback(e)
|
|
365
|
+
else:
|
|
366
|
+
return ty
|
|
367
|
+
|
|
368
|
+
if isinstance(val, types.ExternalFunction):
|
|
369
|
+
return val
|
|
370
|
+
|
|
371
|
+
# Try to look up target specific typing information
|
|
372
|
+
ty = self._get_global_type(val)
|
|
373
|
+
if ty is not None:
|
|
374
|
+
return ty
|
|
375
|
+
|
|
376
|
+
raise typeof_exc
|
|
377
|
+
|
|
378
|
+
def resolve_value_type_prefer_literal(self, value):
|
|
379
|
+
"""Resolve value type and prefer Literal types whenever possible."""
|
|
380
|
+
lit = types.maybe_literal(value)
|
|
381
|
+
if lit is None:
|
|
382
|
+
return self.resolve_value_type(value)
|
|
383
|
+
else:
|
|
384
|
+
return lit
|
|
385
|
+
|
|
386
|
+
def _get_global_type(self, gv):
|
|
387
|
+
ty = self._lookup_global(gv)
|
|
388
|
+
if ty is not None:
|
|
389
|
+
return ty
|
|
390
|
+
if isinstance(gv, pytypes.ModuleType):
|
|
391
|
+
return types.Module(gv)
|
|
392
|
+
|
|
393
|
+
def _load_builtins(self):
|
|
394
|
+
# Initialize declarations
|
|
395
|
+
from numba.cuda.typing import (
|
|
396
|
+
builtins,
|
|
397
|
+
arraydecl,
|
|
398
|
+
npdatetime,
|
|
399
|
+
collections,
|
|
400
|
+
)
|
|
401
|
+
from numba.cuda.typing import ctypes_utils, bufproto # noqa: F401, E501
|
|
402
|
+
from numba.cuda.core.unsafe import eh # noqa: F401
|
|
403
|
+
|
|
404
|
+
self.install_registry(builtins.registry)
|
|
405
|
+
self.install_registry(collections.registry)
|
|
406
|
+
self.install_registry(arraydecl.registry)
|
|
407
|
+
self.install_registry(npdatetime.registry)
|
|
408
|
+
self.install_registry(templates.builtin_registry)
|
|
409
|
+
|
|
410
|
+
# Install only third-party declarations from Numba's typing registry
|
|
411
|
+
# if it is available. Exclude Numba's own typing declarations.
|
|
412
|
+
if find_spec("numba.core.typing") is not None:
|
|
413
|
+
from numba.core.typing import templates as core_templates
|
|
414
|
+
|
|
415
|
+
self.install_registry(
|
|
416
|
+
core_templates.builtin_registry, external_defs_only=True
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
def load_additional_registries(self):
|
|
420
|
+
"""
|
|
421
|
+
Load target-specific registries. Can be overridden by subclasses.
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
def install_registry(self, registry, external_defs_only=False):
|
|
425
|
+
"""
|
|
426
|
+
Install a *registry* (a templates.Registry instance) of function,
|
|
427
|
+
attribute and global declarations.
|
|
428
|
+
|
|
429
|
+
Parameters
|
|
430
|
+
----------
|
|
431
|
+
registry : Registry
|
|
432
|
+
The registry to install
|
|
433
|
+
external_defs_only : bool, optional
|
|
434
|
+
If True, only install registrations for types from outside numba.* namespace.
|
|
435
|
+
This is useful when installing third-party registrations from
|
|
436
|
+
a shared registry like Numba's typing registry (builtin_registry).
|
|
437
|
+
|
|
438
|
+
"""
|
|
439
|
+
try:
|
|
440
|
+
loader = self._registries[registry]
|
|
441
|
+
except KeyError:
|
|
442
|
+
loader = templates.RegistryLoader(registry)
|
|
443
|
+
self._registries[registry] = loader
|
|
444
|
+
|
|
445
|
+
def is_for_this_target(ftcls):
|
|
446
|
+
metadata = getattr(ftcls, "metadata", None)
|
|
447
|
+
if metadata is None:
|
|
448
|
+
return True
|
|
449
|
+
|
|
450
|
+
target_str = metadata.get("target")
|
|
451
|
+
if target_str is None:
|
|
452
|
+
return True
|
|
453
|
+
|
|
454
|
+
# Accept both "cuda" and "generic" targets
|
|
455
|
+
if target_str in ("cuda", "generic"):
|
|
456
|
+
return True
|
|
457
|
+
|
|
458
|
+
return False
|
|
459
|
+
|
|
460
|
+
def is_external(obj):
|
|
461
|
+
"""Check if obj is from outside numba.* namespace."""
|
|
462
|
+
try:
|
|
463
|
+
return not obj.__module__.startswith("numba.")
|
|
464
|
+
except AttributeError:
|
|
465
|
+
return True
|
|
466
|
+
|
|
467
|
+
for ftcls in loader.new_registrations("functions"):
|
|
468
|
+
if not is_for_this_target(ftcls):
|
|
469
|
+
continue
|
|
470
|
+
# If external_defs_only, install templates only from external modules
|
|
471
|
+
if external_defs_only and not is_external(ftcls):
|
|
472
|
+
continue
|
|
473
|
+
self.insert_function(ftcls(self))
|
|
474
|
+
for ftcls in loader.new_registrations("attributes"):
|
|
475
|
+
if not is_for_this_target(ftcls):
|
|
476
|
+
continue
|
|
477
|
+
# If external_defs_only, check if the type being registered is external
|
|
478
|
+
if external_defs_only:
|
|
479
|
+
key = getattr(ftcls, "key", None)
|
|
480
|
+
if key is not None and not is_external(key):
|
|
481
|
+
continue
|
|
482
|
+
self.insert_attributes(ftcls(self))
|
|
483
|
+
for gv, gty in loader.new_registrations("globals"):
|
|
484
|
+
# If external_defs_only, check the global value's module
|
|
485
|
+
if external_defs_only:
|
|
486
|
+
if hasattr(gv, "__module__") and not is_external(gv):
|
|
487
|
+
continue
|
|
488
|
+
existing = self._lookup_global(gv)
|
|
489
|
+
if existing is None:
|
|
490
|
+
self.insert_global(gv, gty)
|
|
491
|
+
else:
|
|
492
|
+
# A type was already inserted, see if we can add to it
|
|
493
|
+
newty = existing.augment(gty)
|
|
494
|
+
if newty is None:
|
|
495
|
+
raise TypeError(
|
|
496
|
+
"cannot augment %s with %s" % (existing, gty)
|
|
497
|
+
)
|
|
498
|
+
self._remove_global(gv)
|
|
499
|
+
self._insert_global(gv, newty)
|
|
500
|
+
|
|
501
|
+
def _lookup_global(self, gv):
|
|
502
|
+
"""
|
|
503
|
+
Look up the registered type for global value *gv*.
|
|
504
|
+
"""
|
|
505
|
+
try:
|
|
506
|
+
gv = weakref.ref(gv)
|
|
507
|
+
except TypeError:
|
|
508
|
+
pass
|
|
509
|
+
try:
|
|
510
|
+
return self._globals.get(gv, None)
|
|
511
|
+
except TypeError:
|
|
512
|
+
# Unhashable type
|
|
513
|
+
return None
|
|
514
|
+
|
|
515
|
+
def _insert_global(self, gv, gty):
|
|
516
|
+
"""
|
|
517
|
+
Register type *gty* for value *gv*. Only a weak reference
|
|
518
|
+
to *gv* is kept, if possible.
|
|
519
|
+
"""
|
|
520
|
+
|
|
521
|
+
def on_disposal(wr, pop=self._globals.pop):
|
|
522
|
+
# pop() is pre-looked up to avoid a crash late at shutdown on 3.5
|
|
523
|
+
# (https://bugs.python.org/issue25217)
|
|
524
|
+
pop(wr)
|
|
525
|
+
|
|
526
|
+
try:
|
|
527
|
+
gv = weakref.ref(gv, on_disposal)
|
|
528
|
+
except TypeError:
|
|
529
|
+
pass
|
|
530
|
+
self._globals[gv] = gty
|
|
531
|
+
|
|
532
|
+
def _remove_global(self, gv):
|
|
533
|
+
"""
|
|
534
|
+
Remove the registered type for global value *gv*.
|
|
535
|
+
"""
|
|
536
|
+
try:
|
|
537
|
+
gv = weakref.ref(gv)
|
|
538
|
+
except TypeError:
|
|
539
|
+
pass
|
|
540
|
+
del self._globals[gv]
|
|
541
|
+
|
|
542
|
+
def insert_global(self, gv, gty):
|
|
543
|
+
self._insert_global(gv, gty)
|
|
544
|
+
|
|
545
|
+
def insert_attributes(self, at):
|
|
546
|
+
key = at.key
|
|
547
|
+
self._attributes[key].append(at)
|
|
548
|
+
|
|
549
|
+
def insert_function(self, ft):
|
|
550
|
+
key = ft.key
|
|
551
|
+
self._functions[key].append(ft)
|
|
552
|
+
|
|
553
|
+
def insert_user_function(self, fn, ft):
|
|
554
|
+
"""Insert a user function.
|
|
555
|
+
|
|
556
|
+
Args
|
|
557
|
+
----
|
|
558
|
+
- fn:
|
|
559
|
+
object used as callee
|
|
560
|
+
- ft:
|
|
561
|
+
function template
|
|
562
|
+
"""
|
|
563
|
+
self._insert_global(fn, types.Function(ft))
|
|
564
|
+
|
|
565
|
+
def can_convert(self, fromty, toty):
|
|
566
|
+
"""
|
|
567
|
+
Check whether conversion is possible from *fromty* to *toty*.
|
|
568
|
+
If successful, return a numba.typeconv.Conversion instance;
|
|
569
|
+
otherwise None is returned.
|
|
570
|
+
"""
|
|
571
|
+
if fromty == toty:
|
|
572
|
+
return Conversion.exact
|
|
573
|
+
else:
|
|
574
|
+
# First check with the type manager (some rules are registered
|
|
575
|
+
# at startup there, see numba.typeconv.rules)
|
|
576
|
+
conv = self.tm.check_compatible(fromty, toty)
|
|
577
|
+
if conv is not None:
|
|
578
|
+
return conv
|
|
579
|
+
|
|
580
|
+
# Fall back on type-specific rules
|
|
581
|
+
forward = fromty.can_convert_to(self, toty)
|
|
582
|
+
backward = toty.can_convert_from(self, fromty)
|
|
583
|
+
if backward is None:
|
|
584
|
+
return forward
|
|
585
|
+
elif forward is None:
|
|
586
|
+
return backward
|
|
587
|
+
else:
|
|
588
|
+
return min(forward, backward)
|
|
589
|
+
|
|
590
|
+
def _rate_arguments(
|
|
591
|
+
self,
|
|
592
|
+
actualargs,
|
|
593
|
+
formalargs,
|
|
594
|
+
unsafe_casting=True,
|
|
595
|
+
exact_match_required=False,
|
|
596
|
+
):
|
|
597
|
+
"""
|
|
598
|
+
Rate the actual arguments for compatibility against the formal
|
|
599
|
+
arguments. A Rating instance is returned, or None if incompatible.
|
|
600
|
+
"""
|
|
601
|
+
if len(actualargs) != len(formalargs):
|
|
602
|
+
return None
|
|
603
|
+
rate = Rating()
|
|
604
|
+
for actual, formal in zip(actualargs, formalargs):
|
|
605
|
+
conv = self.can_convert(actual, formal)
|
|
606
|
+
if conv is None:
|
|
607
|
+
return None
|
|
608
|
+
elif not unsafe_casting and conv >= Conversion.unsafe:
|
|
609
|
+
return None
|
|
610
|
+
elif exact_match_required and conv != Conversion.exact:
|
|
611
|
+
return None
|
|
612
|
+
|
|
613
|
+
if conv == Conversion.promote:
|
|
614
|
+
rate.promote += 1
|
|
615
|
+
elif conv == Conversion.safe:
|
|
616
|
+
rate.safe_convert += 1
|
|
617
|
+
elif conv == Conversion.unsafe:
|
|
618
|
+
rate.unsafe_convert += 1
|
|
619
|
+
elif conv == Conversion.exact:
|
|
620
|
+
pass
|
|
621
|
+
else:
|
|
622
|
+
raise AssertionError("unreachable", conv)
|
|
623
|
+
|
|
624
|
+
return rate
|
|
625
|
+
|
|
626
|
+
def install_possible_conversions(self, actualargs, formalargs):
|
|
627
|
+
"""
|
|
628
|
+
Install possible conversions from the actual argument types to
|
|
629
|
+
the formal argument types in the C++ type manager.
|
|
630
|
+
Return True if all arguments can be converted.
|
|
631
|
+
"""
|
|
632
|
+
if len(actualargs) != len(formalargs):
|
|
633
|
+
return False
|
|
634
|
+
for actual, formal in zip(actualargs, formalargs):
|
|
635
|
+
if self.tm.check_compatible(actual, formal) is not None:
|
|
636
|
+
# This conversion is already known
|
|
637
|
+
continue
|
|
638
|
+
conv = self.can_convert(actual, formal)
|
|
639
|
+
if conv is None:
|
|
640
|
+
return False
|
|
641
|
+
assert conv is not Conversion.exact
|
|
642
|
+
self.tm.set_compatible(actual, formal, conv)
|
|
643
|
+
return True
|
|
644
|
+
|
|
645
|
+
def resolve_overload(
|
|
646
|
+
self,
|
|
647
|
+
key,
|
|
648
|
+
cases,
|
|
649
|
+
args,
|
|
650
|
+
kws,
|
|
651
|
+
allow_ambiguous=True,
|
|
652
|
+
unsafe_casting=True,
|
|
653
|
+
exact_match_required=False,
|
|
654
|
+
):
|
|
655
|
+
"""
|
|
656
|
+
Given actual *args* and *kws*, find the best matching
|
|
657
|
+
signature in *cases*, or None if none matches.
|
|
658
|
+
*key* is used for error reporting purposes.
|
|
659
|
+
If *allow_ambiguous* is False, a tie in the best matches
|
|
660
|
+
will raise an error.
|
|
661
|
+
If *unsafe_casting* is False, unsafe casting is forbidden.
|
|
662
|
+
"""
|
|
663
|
+
assert not kws, "Keyword arguments are not supported, yet"
|
|
664
|
+
options = {
|
|
665
|
+
"unsafe_casting": unsafe_casting,
|
|
666
|
+
"exact_match_required": exact_match_required,
|
|
667
|
+
}
|
|
668
|
+
# Rate each case
|
|
669
|
+
candidates = []
|
|
670
|
+
for case in cases:
|
|
671
|
+
if len(args) == len(case.args):
|
|
672
|
+
rating = self._rate_arguments(args, case.args, **options)
|
|
673
|
+
if rating is not None:
|
|
674
|
+
candidates.append((rating.astuple(), case))
|
|
675
|
+
|
|
676
|
+
# Find the best case
|
|
677
|
+
candidates.sort(key=lambda i: i[0])
|
|
678
|
+
if candidates:
|
|
679
|
+
best_rate, best = candidates[0]
|
|
680
|
+
if not allow_ambiguous:
|
|
681
|
+
# Find whether there is a tie and if so, raise an error
|
|
682
|
+
tied = []
|
|
683
|
+
for rate, case in candidates:
|
|
684
|
+
if rate != best_rate:
|
|
685
|
+
break
|
|
686
|
+
tied.append(case)
|
|
687
|
+
if len(tied) > 1:
|
|
688
|
+
args = (key, args, "\n".join(map(str, tied)))
|
|
689
|
+
msg = "Ambiguous overloading for %s %s:\n%s" % args
|
|
690
|
+
raise TypeError(msg)
|
|
691
|
+
# Simply return the best matching candidate in order.
|
|
692
|
+
# If there is a tie, since list.sort() is stable, the first case
|
|
693
|
+
# in the original order is returned.
|
|
694
|
+
# (this can happen if e.g. a function template exposes
|
|
695
|
+
# (int32, int32) -> int32 and (int64, int64) -> int64,
|
|
696
|
+
# and you call it with (int16, int16) arguments)
|
|
697
|
+
return best
|
|
698
|
+
|
|
699
|
+
def unify_types(self, *typelist):
|
|
700
|
+
# Sort the type list according to bit width before doing
|
|
701
|
+
# pairwise unification (with thanks to aterrel).
|
|
702
|
+
def keyfunc(obj):
|
|
703
|
+
"""Uses bitwidth to order numeric-types.
|
|
704
|
+
Fallback to stable, deterministic sort.
|
|
705
|
+
"""
|
|
706
|
+
return getattr(obj, "bitwidth", 0)
|
|
707
|
+
|
|
708
|
+
typelist = sorted(typelist, key=keyfunc)
|
|
709
|
+
unified = typelist[0]
|
|
710
|
+
for tp in typelist[1:]:
|
|
711
|
+
unified = self.unify_pairs(unified, tp)
|
|
712
|
+
if unified is None:
|
|
713
|
+
break
|
|
714
|
+
return unified
|
|
715
|
+
|
|
716
|
+
def unify_pairs(self, first, second):
|
|
717
|
+
"""
|
|
718
|
+
Try to unify the two given types. A third type is returned,
|
|
719
|
+
or None in case of failure.
|
|
720
|
+
"""
|
|
721
|
+
if first == second:
|
|
722
|
+
return first
|
|
723
|
+
|
|
724
|
+
if first is types.undefined:
|
|
725
|
+
return second
|
|
726
|
+
elif second is types.undefined:
|
|
727
|
+
return first
|
|
728
|
+
|
|
729
|
+
# Types with special unification rules
|
|
730
|
+
unified = first.unify(self, second)
|
|
731
|
+
if unified is not None:
|
|
732
|
+
return unified
|
|
733
|
+
|
|
734
|
+
unified = second.unify(self, first)
|
|
735
|
+
if unified is not None:
|
|
736
|
+
return unified
|
|
737
|
+
|
|
738
|
+
# Other types with simple conversion rules
|
|
739
|
+
conv = self.can_convert(fromty=first, toty=second)
|
|
740
|
+
if conv is not None and conv <= Conversion.safe:
|
|
741
|
+
# Can convert from first to second
|
|
742
|
+
return second
|
|
743
|
+
|
|
744
|
+
conv = self.can_convert(fromty=second, toty=first)
|
|
745
|
+
if conv is not None and conv <= Conversion.safe:
|
|
746
|
+
# Can convert from second to first
|
|
747
|
+
return first
|
|
748
|
+
|
|
749
|
+
if isinstance(first, types.Literal) or isinstance(
|
|
750
|
+
second, types.Literal
|
|
751
|
+
):
|
|
752
|
+
first = types.unliteral(first)
|
|
753
|
+
second = types.unliteral(second)
|
|
754
|
+
return self.unify_pairs(first, second)
|
|
755
|
+
|
|
756
|
+
# Cannot unify
|
|
757
|
+
return None
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
class Context(BaseContext):
|
|
761
|
+
# This list will be extended to include all the registries
|
|
762
|
+
# that are needed for CUDA
|
|
763
|
+
def load_additional_registries(self):
|
|
764
|
+
from . import (
|
|
765
|
+
cffi_utils,
|
|
766
|
+
cmathdecl,
|
|
767
|
+
enumdecl,
|
|
768
|
+
listdecl,
|
|
769
|
+
mathdecl,
|
|
770
|
+
npydecl,
|
|
771
|
+
setdecl,
|
|
772
|
+
dictdecl,
|
|
773
|
+
)
|
|
774
|
+
|
|
775
|
+
self.install_registry(cffi_utils.registry)
|
|
776
|
+
self.install_registry(cmathdecl.registry)
|
|
777
|
+
self.install_registry(enumdecl.registry)
|
|
778
|
+
self.install_registry(listdecl.registry)
|
|
779
|
+
self.install_registry(mathdecl.registry)
|
|
780
|
+
self.install_registry(npydecl.registry)
|
|
781
|
+
self.install_registry(setdecl.registry)
|
|
782
|
+
self.install_registry(dictdecl.registry)
|