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.
Files changed (488) hide show
  1. _numba_cuda_redirector.pth +4 -0
  2. _numba_cuda_redirector.py +89 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +6 -0
  5. numba_cuda/_version.py +11 -0
  6. numba_cuda/numba/cuda/__init__.py +70 -0
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
  9. numba_cuda/numba/cuda/api.py +577 -0
  10. numba_cuda/numba/cuda/api_util.py +76 -0
  11. numba_cuda/numba/cuda/args.py +72 -0
  12. numba_cuda/numba/cuda/bf16.py +397 -0
  13. numba_cuda/numba/cuda/cache_hints.py +287 -0
  14. numba_cuda/numba/cuda/cext/__init__.py +2 -0
  15. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  20. numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
  21. numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
  22. numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
  23. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  24. numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
  25. numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
  26. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
  28. numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
  29. numba_cuda/numba/cuda/cext/_typeof.h +19 -0
  30. numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
  31. numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
  32. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  33. numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
  34. numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
  35. numba_cuda/numba/cuda/cg.py +67 -0
  36. numba_cuda/numba/cuda/cgutils.py +1294 -0
  37. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  38. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  39. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  40. numba_cuda/numba/cuda/codegen.py +541 -0
  41. numba_cuda/numba/cuda/compiler.py +1396 -0
  42. numba_cuda/numba/cuda/core/analysis.py +758 -0
  43. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  44. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
  45. numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
  46. numba_cuda/numba/cuda/core/base.py +1332 -0
  47. numba_cuda/numba/cuda/core/boxing.py +1411 -0
  48. numba_cuda/numba/cuda/core/bytecode.py +728 -0
  49. numba_cuda/numba/cuda/core/byteflow.py +2346 -0
  50. numba_cuda/numba/cuda/core/caching.py +744 -0
  51. numba_cuda/numba/cuda/core/callconv.py +392 -0
  52. numba_cuda/numba/cuda/core/codegen.py +171 -0
  53. numba_cuda/numba/cuda/core/compiler.py +199 -0
  54. numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
  55. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  56. numba_cuda/numba/cuda/core/config.py +650 -0
  57. numba_cuda/numba/cuda/core/consts.py +124 -0
  58. numba_cuda/numba/cuda/core/controlflow.py +989 -0
  59. numba_cuda/numba/cuda/core/entrypoints.py +57 -0
  60. numba_cuda/numba/cuda/core/environment.py +66 -0
  61. numba_cuda/numba/cuda/core/errors.py +917 -0
  62. numba_cuda/numba/cuda/core/event.py +511 -0
  63. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  64. numba_cuda/numba/cuda/core/generators.py +387 -0
  65. numba_cuda/numba/cuda/core/imputils.py +509 -0
  66. numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
  67. numba_cuda/numba/cuda/core/interpreter.py +3617 -0
  68. numba_cuda/numba/cuda/core/ir.py +1812 -0
  69. numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
  70. numba_cuda/numba/cuda/core/optional.py +129 -0
  71. numba_cuda/numba/cuda/core/options.py +262 -0
  72. numba_cuda/numba/cuda/core/postproc.py +249 -0
  73. numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
  74. numba_cuda/numba/cuda/core/registry.py +46 -0
  75. numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
  76. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  77. numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
  78. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  79. numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
  80. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
  81. numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
  82. numba_cuda/numba/cuda/core/sigutils.py +68 -0
  83. numba_cuda/numba/cuda/core/ssa.py +498 -0
  84. numba_cuda/numba/cuda/core/targetconfig.py +330 -0
  85. numba_cuda/numba/cuda/core/tracing.py +231 -0
  86. numba_cuda/numba/cuda/core/transforms.py +956 -0
  87. numba_cuda/numba/cuda/core/typed_passes.py +867 -0
  88. numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
  89. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  90. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  91. numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
  92. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  93. numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
  94. numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
  95. numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
  96. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  97. numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
  98. numba_cuda/numba/cuda/cpython/iterators.py +167 -0
  99. numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
  100. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  101. numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
  102. numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
  103. numba_cuda/numba/cuda/cpython/slicing.py +322 -0
  104. numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
  105. numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
  106. numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
  107. numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
  108. numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
  109. numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
  110. numba_cuda/numba/cuda/cuda_paths.py +691 -0
  111. numba_cuda/numba/cuda/cudadecl.py +556 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +951 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3222 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +558 -0
  118. numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
  119. numba_cuda/numba/cuda/cudadrv/error.py +48 -0
  120. numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
  121. numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
  122. numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
  123. numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
  124. numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
  125. numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
  126. numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
  127. numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
  128. numba_cuda/numba/cuda/cudaimpl.py +995 -0
  129. numba_cuda/numba/cuda/cudamath.py +149 -0
  130. numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
  131. numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
  132. numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
  133. numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
  134. numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
  135. numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
  136. numba_cuda/numba/cuda/datamodel/manager.py +11 -0
  137. numba_cuda/numba/cuda/datamodel/models.py +9 -0
  138. numba_cuda/numba/cuda/datamodel/packer.py +9 -0
  139. numba_cuda/numba/cuda/datamodel/registry.py +11 -0
  140. numba_cuda/numba/cuda/datamodel/testing.py +11 -0
  141. numba_cuda/numba/cuda/debuginfo.py +903 -0
  142. numba_cuda/numba/cuda/decorators.py +294 -0
  143. numba_cuda/numba/cuda/descriptor.py +35 -0
  144. numba_cuda/numba/cuda/device_init.py +158 -0
  145. numba_cuda/numba/cuda/deviceufunc.py +1021 -0
  146. numba_cuda/numba/cuda/dispatcher.py +2463 -0
  147. numba_cuda/numba/cuda/errors.py +72 -0
  148. numba_cuda/numba/cuda/extending.py +697 -0
  149. numba_cuda/numba/cuda/flags.py +178 -0
  150. numba_cuda/numba/cuda/fp16.py +357 -0
  151. numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
  152. numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
  153. numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
  154. numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
  155. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  156. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  157. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  158. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  159. numba_cuda/numba/cuda/initialize.py +24 -0
  160. numba_cuda/numba/cuda/intrinsic_wrapper.py +41 -0
  161. numba_cuda/numba/cuda/intrinsics.py +382 -0
  162. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  163. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  164. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  165. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  166. numba_cuda/numba/cuda/libdevice.py +3386 -0
  167. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  168. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  169. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  170. numba_cuda/numba/cuda/locks.py +19 -0
  171. numba_cuda/numba/cuda/lowering.py +1951 -0
  172. numba_cuda/numba/cuda/mathimpl.py +374 -0
  173. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  175. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  178. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  179. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  180. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  181. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  182. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  183. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  184. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  185. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  186. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  187. numba_cuda/numba/cuda/misc/literal.py +28 -0
  188. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  189. numba_cuda/numba/cuda/misc/special.py +94 -0
  190. numba_cuda/numba/cuda/models.py +56 -0
  191. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  192. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  193. numba_cuda/numba/cuda/np/extensions.py +11 -0
  194. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  195. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  196. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  197. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  198. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  199. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  200. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  201. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  202. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  203. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  204. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  206. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  207. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  208. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  209. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  210. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  211. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  212. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  213. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  214. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  215. numba_cuda/numba/cuda/printimpl.py +126 -0
  216. numba_cuda/numba/cuda/random.py +308 -0
  217. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  218. numba_cuda/numba/cuda/serialize.py +267 -0
  219. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  220. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  221. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  222. numba_cuda/numba/cuda/simulator/api.py +179 -0
  223. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  224. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  236. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  237. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  238. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  239. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  241. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  242. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  243. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  244. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  245. numba_cuda/numba/cuda/simulator_init.py +18 -0
  246. numba_cuda/numba/cuda/stubs.py +635 -0
  247. numba_cuda/numba/cuda/target.py +505 -0
  248. numba_cuda/numba/cuda/testing.py +347 -0
  249. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  251. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  252. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  253. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  254. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  255. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +187 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +198 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  285. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  286. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  289. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  290. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  291. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  292. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  293. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  294. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  295. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +889 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  396. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +331 -0
  397. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  399. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  400. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  401. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  402. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  403. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  404. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  406. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  407. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  424. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  425. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +391 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  430. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  431. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  433. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  434. numba_cuda/numba/cuda/tests/support.py +900 -0
  435. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  436. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  437. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  438. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  439. numba_cuda/numba/cuda/types/__init__.py +233 -0
  440. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  441. numba_cuda/numba/cuda/types/abstract.py +9 -0
  442. numba_cuda/numba/cuda/types/common.py +9 -0
  443. numba_cuda/numba/cuda/types/containers.py +9 -0
  444. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  445. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  446. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  447. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  448. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  449. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  450. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  451. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  452. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  453. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  454. numba_cuda/numba/cuda/types/function_type.py +11 -0
  455. numba_cuda/numba/cuda/types/functions.py +9 -0
  456. numba_cuda/numba/cuda/types/iterators.py +9 -0
  457. numba_cuda/numba/cuda/types/misc.py +9 -0
  458. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  459. numba_cuda/numba/cuda/types/scalars.py +9 -0
  460. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  461. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  462. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  463. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  464. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  465. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  466. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  467. numba_cuda/numba/cuda/typing/collections.py +138 -0
  468. numba_cuda/numba/cuda/typing/context.py +782 -0
  469. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  470. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  471. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  472. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  473. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  474. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  475. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  476. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  477. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  478. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  479. numba_cuda/numba/cuda/ufuncs.py +746 -0
  480. numba_cuda/numba/cuda/utils.py +724 -0
  481. numba_cuda/numba/cuda/vector_types.py +214 -0
  482. numba_cuda/numba/cuda/vectorizers.py +260 -0
  483. numba_cuda-0.21.1.dist-info/METADATA +109 -0
  484. numba_cuda-0.21.1.dist-info/RECORD +488 -0
  485. numba_cuda-0.21.1.dist-info/WHEEL +5 -0
  486. numba_cuda-0.21.1.dist-info/licenses/LICENSE +26 -0
  487. numba_cuda-0.21.1.dist-info/licenses/LICENSE.numba +24 -0
  488. 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)