numba-cuda 0.22.0__cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of numba-cuda might be problematic. Click here for more details.

Files changed (487) 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 +580 -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.cpp +159 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpython-312-aarch64-linux-gnu.so +0 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpython-312-aarch64-linux-gnu.so +0 -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.cpython-312-aarch64-linux-gnu.so +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.cpp +206 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpython-312-aarch64-linux-gnu.so +0 -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.cpython-312-aarch64-linux-gnu.so +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 +543 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +954 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3238 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +562 -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 +983 -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 +997 -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 +155 -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/intrinsics.py +531 -0
  161. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  162. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  163. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  164. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  165. numba_cuda/numba/cuda/libdevice.py +3386 -0
  166. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  167. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  168. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  169. numba_cuda/numba/cuda/locks.py +19 -0
  170. numba_cuda/numba/cuda/lowering.py +1980 -0
  171. numba_cuda/numba/cuda/mathimpl.py +374 -0
  172. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  173. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  175. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  178. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  179. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  180. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  181. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  182. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  183. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  184. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  185. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  186. numba_cuda/numba/cuda/misc/literal.py +28 -0
  187. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  188. numba_cuda/numba/cuda/misc/special.py +94 -0
  189. numba_cuda/numba/cuda/models.py +56 -0
  190. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  191. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  192. numba_cuda/numba/cuda/np/extensions.py +11 -0
  193. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  194. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  195. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  196. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  197. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  198. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  199. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  200. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  201. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  202. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  203. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  204. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  206. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  207. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  208. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  209. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  210. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  211. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  212. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  213. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  214. numba_cuda/numba/cuda/printimpl.py +126 -0
  215. numba_cuda/numba/cuda/random.py +308 -0
  216. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  217. numba_cuda/numba/cuda/serialize.py +267 -0
  218. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  219. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  220. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  221. numba_cuda/numba/cuda/simulator/api.py +179 -0
  222. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  223. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  224. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  236. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  237. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  238. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  239. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  241. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  242. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  243. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  244. numba_cuda/numba/cuda/simulator_init.py +18 -0
  245. numba_cuda/numba/cuda/stubs.py +624 -0
  246. numba_cuda/numba/cuda/target.py +505 -0
  247. numba_cuda/numba/cuda/testing.py +347 -0
  248. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  249. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  251. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  252. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  253. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  254. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  255. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +191 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +200 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  285. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  286. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  289. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  290. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  291. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  292. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  293. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  294. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  295. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +978 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +446 -0
  396. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  397. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  399. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  400. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  401. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  402. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  403. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  404. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  406. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  407. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  424. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  425. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +452 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  430. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  431. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  433. numba_cuda/numba/cuda/tests/support.py +900 -0
  434. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  435. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  436. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  437. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  438. numba_cuda/numba/cuda/types/__init__.py +233 -0
  439. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  440. numba_cuda/numba/cuda/types/abstract.py +9 -0
  441. numba_cuda/numba/cuda/types/common.py +9 -0
  442. numba_cuda/numba/cuda/types/containers.py +9 -0
  443. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  444. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  445. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  446. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  447. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  448. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  449. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  450. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  451. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  452. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  453. numba_cuda/numba/cuda/types/function_type.py +11 -0
  454. numba_cuda/numba/cuda/types/functions.py +9 -0
  455. numba_cuda/numba/cuda/types/iterators.py +9 -0
  456. numba_cuda/numba/cuda/types/misc.py +9 -0
  457. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  458. numba_cuda/numba/cuda/types/scalars.py +9 -0
  459. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  460. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  461. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  462. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  463. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  464. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  465. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  466. numba_cuda/numba/cuda/typing/collections.py +138 -0
  467. numba_cuda/numba/cuda/typing/context.py +782 -0
  468. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  469. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  470. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  471. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  472. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  473. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  474. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  475. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  476. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  477. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  478. numba_cuda/numba/cuda/ufuncs.py +746 -0
  479. numba_cuda/numba/cuda/utils.py +724 -0
  480. numba_cuda/numba/cuda/vector_types.py +214 -0
  481. numba_cuda/numba/cuda/vectorizers.py +260 -0
  482. numba_cuda-0.22.0.dist-info/METADATA +109 -0
  483. numba_cuda-0.22.0.dist-info/RECORD +487 -0
  484. numba_cuda-0.22.0.dist-info/WHEEL +6 -0
  485. numba_cuda-0.22.0.dist-info/licenses/LICENSE +26 -0
  486. numba_cuda-0.22.0.dist-info/licenses/LICENSE.numba +24 -0
  487. numba_cuda-0.22.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,724 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import os
5
+ import warnings
6
+ import traceback
7
+ import functools
8
+
9
+ import atexit
10
+ import builtins
11
+ import importlib
12
+ import inspect
13
+ import operator
14
+ import timeit
15
+ import math
16
+ import sys
17
+ import weakref
18
+ import threading
19
+ import contextlib
20
+ import json
21
+ from pprint import pformat
22
+
23
+ from types import ModuleType
24
+ from importlib import import_module
25
+ from importlib.util import find_spec
26
+ import numpy as np
27
+
28
+ from inspect import signature as pysignature # noqa: F401
29
+ from inspect import Signature as pySignature # noqa: F401
30
+ from inspect import Parameter as pyParameter # noqa: F401
31
+
32
+ from numba.cuda.core.config import (
33
+ MACHINE_BITS, # noqa: F401
34
+ DEVELOPER_MODE,
35
+ ) # noqa: F401
36
+
37
+ from numba.cuda.core import config
38
+
39
+ from collections.abc import Sequence
40
+
41
+ PYVERSION = config.PYVERSION
42
+
43
+
44
+ def erase_traceback(exc_value):
45
+ """
46
+ Erase the traceback and hanging locals from the given exception instance.
47
+ """
48
+ if exc_value.__traceback__ is not None:
49
+ traceback.clear_frames(exc_value.__traceback__)
50
+ return exc_value.with_traceback(None)
51
+
52
+
53
+ def safe_relpath(path, start=os.curdir):
54
+ """
55
+ Produces a "safe" relative path, on windows relpath doesn't work across
56
+ drives as technically they don't share the same root.
57
+ See: https://bugs.python.org/issue7195 for details.
58
+ """
59
+ # find the drive letters for path and start and if they are not the same
60
+ # then don't use relpath!
61
+ drive_letter = lambda x: os.path.splitdrive(os.path.abspath(x))[0]
62
+ drive_path = drive_letter(path)
63
+ drive_start = drive_letter(start)
64
+ if drive_path != drive_start:
65
+ return os.path.abspath(path)
66
+ else:
67
+ return os.path.relpath(path, start=start)
68
+
69
+
70
+ # Mapping between operator module functions and the corresponding built-in
71
+ # operators.
72
+
73
+ BINOPS_TO_OPERATORS = {
74
+ "+": operator.add,
75
+ "-": operator.sub,
76
+ "*": operator.mul,
77
+ "//": operator.floordiv,
78
+ "/": operator.truediv,
79
+ "%": operator.mod,
80
+ "**": operator.pow,
81
+ "&": operator.and_,
82
+ "|": operator.or_,
83
+ "^": operator.xor,
84
+ "<<": operator.lshift,
85
+ ">>": operator.rshift,
86
+ "==": operator.eq,
87
+ "!=": operator.ne,
88
+ "<": operator.lt,
89
+ "<=": operator.le,
90
+ ">": operator.gt,
91
+ ">=": operator.ge,
92
+ "is": operator.is_,
93
+ "is not": operator.is_not,
94
+ # This one has its args reversed!
95
+ "in": operator.contains,
96
+ "@": operator.matmul,
97
+ }
98
+
99
+ INPLACE_BINOPS_TO_OPERATORS = {
100
+ "+=": operator.iadd,
101
+ "-=": operator.isub,
102
+ "*=": operator.imul,
103
+ "//=": operator.ifloordiv,
104
+ "/=": operator.itruediv,
105
+ "%=": operator.imod,
106
+ "**=": operator.ipow,
107
+ "&=": operator.iand,
108
+ "|=": operator.ior,
109
+ "^=": operator.ixor,
110
+ "<<=": operator.ilshift,
111
+ ">>=": operator.irshift,
112
+ "@=": operator.imatmul,
113
+ }
114
+
115
+
116
+ ALL_BINOPS_TO_OPERATORS = {**BINOPS_TO_OPERATORS, **INPLACE_BINOPS_TO_OPERATORS}
117
+
118
+
119
+ UNARY_BUILTINS_TO_OPERATORS = {
120
+ "+": operator.pos,
121
+ "-": operator.neg,
122
+ "~": operator.invert,
123
+ "not": operator.not_,
124
+ "is_true": operator.truth,
125
+ }
126
+
127
+ OPERATORS_TO_BUILTINS = {
128
+ operator.add: "+",
129
+ operator.iadd: "+=",
130
+ operator.sub: "-",
131
+ operator.isub: "-=",
132
+ operator.mul: "*",
133
+ operator.imul: "*=",
134
+ operator.floordiv: "//",
135
+ operator.ifloordiv: "//=",
136
+ operator.truediv: "/",
137
+ operator.itruediv: "/=",
138
+ operator.mod: "%",
139
+ operator.imod: "%=",
140
+ operator.pow: "**",
141
+ operator.ipow: "**=",
142
+ operator.and_: "&",
143
+ operator.iand: "&=",
144
+ operator.or_: "|",
145
+ operator.ior: "|=",
146
+ operator.xor: "^",
147
+ operator.ixor: "^=",
148
+ operator.lshift: "<<",
149
+ operator.ilshift: "<<=",
150
+ operator.rshift: ">>",
151
+ operator.irshift: ">>=",
152
+ operator.eq: "==",
153
+ operator.ne: "!=",
154
+ operator.lt: "<",
155
+ operator.le: "<=",
156
+ operator.gt: ">",
157
+ operator.ge: ">=",
158
+ operator.is_: "is",
159
+ operator.is_not: "is not",
160
+ # This one has its args reversed!
161
+ operator.contains: "in",
162
+ # Unary
163
+ operator.pos: "+",
164
+ operator.neg: "-",
165
+ operator.invert: "~",
166
+ operator.not_: "not",
167
+ operator.truth: "is_true",
168
+ }
169
+
170
+
171
+ _shutting_down = False
172
+
173
+
174
+ def _at_shutdown():
175
+ global _shutting_down
176
+ _shutting_down = True
177
+
178
+
179
+ def shutting_down(globals=globals):
180
+ """
181
+ Whether the interpreter is currently shutting down.
182
+ For use in finalizers, __del__ methods, and similar; it is advised
183
+ to early bind this function rather than look it up when calling it,
184
+ since at shutdown module globals may be cleared.
185
+ """
186
+ # At shutdown, the attribute may have been cleared or set to None.
187
+ v = globals().get("_shutting_down")
188
+ return v is True or v is None
189
+
190
+
191
+ # weakref.finalize registers an exit function that runs all finalizers for
192
+ # which atexit is True. Some of these finalizers may call shutting_down() to
193
+ # check whether the interpreter is shutting down. For this to behave correctly,
194
+ # we need to make sure that _at_shutdown is called before the finalizer exit
195
+ # function. Since atexit operates as a LIFO stack, we first construct a dummy
196
+ # finalizer then register atexit to ensure this ordering.
197
+ weakref.finalize(lambda: None, lambda: None)
198
+ atexit.register(_at_shutdown)
199
+
200
+
201
+ class ThreadLocalStack:
202
+ """A TLS stack container.
203
+
204
+ Uses the BORG pattern and stores states in threadlocal storage.
205
+ """
206
+
207
+ _tls = threading.local()
208
+ stack_name: str
209
+ _registered = {}
210
+
211
+ def __init_subclass__(cls, *, stack_name, **kwargs):
212
+ super().__init_subclass__(**kwargs)
213
+ # Register stack_name mapping to the new subclass
214
+ assert stack_name not in cls._registered, (
215
+ f"stack_name: '{stack_name}' already in use"
216
+ )
217
+ cls.stack_name = stack_name
218
+ cls._registered[stack_name] = cls
219
+
220
+ def __init__(self):
221
+ # This class must not be used directly.
222
+ assert type(self) is not ThreadLocalStack
223
+ tls = self._tls
224
+ attr = f"stack_{self.stack_name}"
225
+ try:
226
+ tls_stack = getattr(tls, attr)
227
+ except AttributeError:
228
+ tls_stack = list()
229
+ setattr(tls, attr, tls_stack)
230
+
231
+ self._stack = tls_stack
232
+
233
+ def push(self, state):
234
+ """Push to the stack"""
235
+ self._stack.append(state)
236
+
237
+ def pop(self):
238
+ """Pop from the stack"""
239
+ return self._stack.pop()
240
+
241
+ def top(self):
242
+ """Get the top item on the stack.
243
+
244
+ Raises IndexError if the stack is empty. Users should check the size
245
+ of the stack beforehand.
246
+ """
247
+ return self._stack[-1]
248
+
249
+ def __len__(self):
250
+ return len(self._stack)
251
+
252
+ @contextlib.contextmanager
253
+ def enter(self, state):
254
+ """A contextmanager that pushes ``state`` for the duration of the
255
+ context.
256
+ """
257
+ self.push(state)
258
+ try:
259
+ yield
260
+ finally:
261
+ self.pop()
262
+
263
+
264
+ class ConfigOptions(object):
265
+ OPTIONS = {}
266
+
267
+ def __init__(self):
268
+ self._values = self.OPTIONS.copy()
269
+
270
+ def set(self, name, value=True):
271
+ if name not in self.OPTIONS:
272
+ raise NameError("Invalid flag: %s" % name)
273
+ self._values[name] = value
274
+
275
+ def unset(self, name):
276
+ self.set(name, False)
277
+
278
+ def _check_attr(self, name):
279
+ if name not in self.OPTIONS:
280
+ raise AttributeError("Invalid flag: %s" % name)
281
+
282
+ def __getattr__(self, name):
283
+ self._check_attr(name)
284
+ return self._values[name]
285
+
286
+ def __setattr__(self, name, value):
287
+ if name.startswith("_"):
288
+ super(ConfigOptions, self).__setattr__(name, value)
289
+ else:
290
+ self._check_attr(name)
291
+ self._values[name] = value
292
+
293
+ def __repr__(self):
294
+ return "Flags(%s)" % ", ".join(
295
+ "%s=%s" % (k, v) for k, v in self._values.items() if v is not False
296
+ )
297
+
298
+ def copy(self):
299
+ copy = type(self)()
300
+ copy._values = self._values.copy()
301
+ return copy
302
+
303
+ def __eq__(self, other):
304
+ return (
305
+ isinstance(other, ConfigOptions) and other._values == self._values
306
+ )
307
+
308
+ def __ne__(self, other):
309
+ return not self == other
310
+
311
+ def __hash__(self):
312
+ return hash(tuple(sorted(self._values.items())))
313
+
314
+
315
+ def order_by_target_specificity(templates, fnkey=""):
316
+ """This orders the given templates from most to least specific against the
317
+ current "target". "fnkey" is an indicative typing key for use in the
318
+ exception message in the case that there's no usable templates for the
319
+ current "target".
320
+ """
321
+ # No templates... return early!
322
+ if templates == []:
323
+ return []
324
+
325
+ # fish out templates that are specific to the target if a target is
326
+ # specified
327
+ DEFAULT_TARGET = "generic"
328
+ usable = []
329
+ for ix, temp_cls in enumerate(templates):
330
+ # ? Need to do something about this next line
331
+ md = getattr(temp_cls, "metadata", {})
332
+ hw = md.get("target", DEFAULT_TARGET)
333
+ if hw is not None:
334
+ if hw in ("generic", "cuda"):
335
+ usable.append((temp_cls, ix))
336
+
337
+ # sort templates based on target specificity
338
+ # cuda-specific templates get priority before generic ones
339
+ def key(x):
340
+ md = getattr(x[0], "metadata", {})
341
+ hw = md.get("target", DEFAULT_TARGET)
342
+ return (0 if hw == "cuda" else 1, x[1])
343
+
344
+ order = [x[0] for x in sorted(usable, key=key)]
345
+
346
+ if not order:
347
+ msg = (
348
+ f"Function resolution cannot find any matches for function "
349
+ f"'{fnkey}'."
350
+ )
351
+ from numba.cuda.core.errors import UnsupportedError
352
+
353
+ raise UnsupportedError(msg)
354
+
355
+ return order
356
+
357
+
358
+ class UniqueDict(dict):
359
+ def __setitem__(self, key, value):
360
+ if key in self:
361
+ raise AssertionError("key already in dictionary: %r" % (key,))
362
+ super(UniqueDict, self).__setitem__(key, value)
363
+
364
+
365
+ def runonce(fn):
366
+ @functools.wraps(fn)
367
+ def inner():
368
+ if not inner._ran:
369
+ res = fn()
370
+ inner._result = res
371
+ inner._ran = True
372
+ return inner._result
373
+
374
+ inner._ran = False
375
+ return inner
376
+
377
+
378
+ def bit_length(intval):
379
+ """
380
+ Return the number of bits necessary to represent integer `intval`.
381
+ """
382
+ assert isinstance(intval, int)
383
+ if intval >= 0:
384
+ return len(bin(intval)) - 2
385
+ else:
386
+ return len(bin(-intval - 1)) - 2
387
+
388
+
389
+ def stream_list(lst):
390
+ """
391
+ Given a list, return an infinite iterator of iterators.
392
+ Each iterator iterates over the list from the last seen point up to
393
+ the current end-of-list.
394
+
395
+ In effect, each iterator will give the newly appended elements from the
396
+ previous iterator instantiation time.
397
+ """
398
+
399
+ def sublist_iterator(start, stop):
400
+ return iter(lst[start:stop])
401
+
402
+ start = 0
403
+ while True:
404
+ stop = len(lst)
405
+ yield sublist_iterator(start, stop)
406
+ start = stop
407
+
408
+
409
+ class BenchmarkResult(object):
410
+ def __init__(self, func, records, loop):
411
+ self.func = func
412
+ self.loop = loop
413
+ self.records = np.array(records) / loop
414
+ self.best = np.min(self.records)
415
+
416
+ def __repr__(self):
417
+ name = getattr(self.func, "__name__", self.func)
418
+ args = (name, self.loop, self.records.size, format_time(self.best))
419
+ return "%20s: %10d loops, best of %d: %s per loop" % args
420
+
421
+
422
+ def format_time(tm):
423
+ units = "s ms us ns ps".split()
424
+ base = 1
425
+ for unit in units[:-1]:
426
+ if tm >= base:
427
+ break
428
+ base /= 1000
429
+ else:
430
+ unit = units[-1]
431
+ return "%.1f%s" % (tm / base, unit)
432
+
433
+
434
+ def benchmark(func, maxsec=1):
435
+ timer = timeit.Timer(func)
436
+ number = 1
437
+ result = timer.repeat(1, number)
438
+ # Too fast to be measured
439
+ while min(result) / number == 0:
440
+ number *= 10
441
+ result = timer.repeat(3, number)
442
+ best = min(result) / number
443
+ if best >= maxsec:
444
+ return BenchmarkResult(func, result, number)
445
+ # Scale it up to make it close the maximum time
446
+ max_per_run_time = maxsec / 3 / number
447
+ number = max(max_per_run_time / best / 3, 1)
448
+ # Round to the next power of 10
449
+ number = int(10 ** math.ceil(math.log10(number)))
450
+ records = timer.repeat(3, number)
451
+ return BenchmarkResult(func, records, number)
452
+
453
+
454
+ # A dummy module for dynamically-generated functions
455
+ _dynamic_modname = "<dynamic>"
456
+ _dynamic_module = ModuleType(_dynamic_modname)
457
+ _dynamic_module.__builtins__ = builtins
458
+
459
+
460
+ def chain_exception(new_exc, old_exc):
461
+ """Set the __cause__ attribute on *new_exc* for explicit exception
462
+ chaining. Returns the inplace modified *new_exc*.
463
+ """
464
+ if DEVELOPER_MODE:
465
+ new_exc.__cause__ = old_exc
466
+ return new_exc
467
+
468
+
469
+ def get_nargs_range(pyfunc):
470
+ """Return the minimal and maximal number of Python function
471
+ positional arguments.
472
+ """
473
+ sig = pysignature(pyfunc)
474
+ min_nargs = 0
475
+ max_nargs = 0
476
+ for p in sig.parameters.values():
477
+ max_nargs += 1
478
+ if p.default == inspect._empty:
479
+ min_nargs += 1
480
+ return min_nargs, max_nargs
481
+
482
+
483
+ def unified_function_type(numba_types, require_precise=True):
484
+ """Returns a unified Numba function type if possible.
485
+
486
+ Parameters
487
+ ----------
488
+ numba_types : Sequence of numba Type instances.
489
+ require_precise : bool
490
+ If True, the returned Numba function type must be precise.
491
+
492
+ Returns
493
+ -------
494
+ typ : {numba.cuda.types.Type, None}
495
+ A unified Numba function type. Or ``None`` when the Numba types
496
+ cannot be unified, e.g. when the ``numba_types`` contains at
497
+ least two different Numba function type instances.
498
+
499
+ If ``numba_types`` contains a Numba dispatcher type, the unified
500
+ Numba function type will be an imprecise ``UndefinedFunctionType``
501
+ instance, or None when ``require_precise=True`` is specified.
502
+
503
+ Specifying ``require_precise=False`` enables unifying imprecise
504
+ Numba dispatcher instances when used in tuples or if-then branches
505
+ when the precise Numba function cannot be determined on the first
506
+ occurrence that is not a call expression.
507
+ """
508
+ from numba.cuda.core.errors import NumbaExperimentalFeatureWarning
509
+ from numba.cuda import types
510
+
511
+ if not (
512
+ isinstance(numba_types, Sequence)
513
+ and len(numba_types) > 0
514
+ and isinstance(numba_types[0], (types.Dispatcher, types.FunctionType))
515
+ ):
516
+ return
517
+
518
+ warnings.warn(
519
+ "First-class function type feature is experimental",
520
+ category=NumbaExperimentalFeatureWarning,
521
+ )
522
+
523
+ mnargs, mxargs = None, None
524
+ dispatchers = set()
525
+ function = None
526
+ undefined_function = None
527
+
528
+ for t in numba_types:
529
+ if isinstance(t, types.Dispatcher):
530
+ mnargs1, mxargs1 = get_nargs_range(t.dispatcher.py_func)
531
+ if mnargs is None:
532
+ mnargs, mxargs = mnargs1, mxargs1
533
+ elif not (mnargs, mxargs) == (mnargs1, mxargs1):
534
+ return
535
+ dispatchers.add(t.dispatcher)
536
+ t = t.dispatcher.get_function_type()
537
+ if t is None:
538
+ continue
539
+ if isinstance(t, types.FunctionType):
540
+ if mnargs is None:
541
+ mnargs = mxargs = t.nargs
542
+ elif not (mnargs == mxargs == t.nargs):
543
+ return
544
+ if isinstance(t, types.UndefinedFunctionType):
545
+ if undefined_function is None:
546
+ undefined_function = t
547
+ else:
548
+ # Refuse to unify using function type
549
+ return
550
+ dispatchers.update(t.dispatchers)
551
+ else:
552
+ if function is None:
553
+ function = t
554
+ else:
555
+ assert function == t
556
+ else:
557
+ return
558
+ if require_precise and (function is None or undefined_function is not None):
559
+ return
560
+ if function is not None:
561
+ if undefined_function is not None:
562
+ assert function.nargs == undefined_function.nargs
563
+ function = undefined_function
564
+ elif undefined_function is not None:
565
+ undefined_function.dispatchers.update(dispatchers)
566
+ function = undefined_function
567
+ else:
568
+ function = types.UndefinedFunctionType(mnargs, dispatchers)
569
+
570
+ return function
571
+
572
+
573
+ class _RedirectSubpackage(ModuleType):
574
+ """Redirect a subpackage to a subpackage.
575
+
576
+ This allows all references like:
577
+
578
+ >>> from numba.old_subpackage import module
579
+ >>> module.item
580
+
581
+ >>> import numba.old_subpackage.module
582
+ >>> numba.old_subpackage.module.item
583
+
584
+ >>> from numba.old_subpackage.module import item
585
+ """
586
+
587
+ def __init__(self, old_module_locals, new_module):
588
+ old_module = old_module_locals["__name__"]
589
+ super().__init__(old_module)
590
+
591
+ self.__old_module_states = {}
592
+ self.__new_module = new_module
593
+
594
+ new_mod_obj = import_module(new_module)
595
+
596
+ # Map all sub-modules over
597
+ for k, v in new_mod_obj.__dict__.items():
598
+ # Get attributes so that `subpackage.xyz` and
599
+ # `from subpackage import xyz` work
600
+ setattr(self, k, v)
601
+ if isinstance(v, ModuleType):
602
+ # Map modules into the interpreter so that
603
+ # `import subpackage.xyz` works
604
+ sys.modules[f"{old_module}.{k}"] = sys.modules[v.__name__]
605
+
606
+ # copy across dunders so that package imports work too
607
+ for attr, value in old_module_locals.items():
608
+ if attr.startswith("__") and attr.endswith("__"):
609
+ if attr != "__builtins__":
610
+ setattr(self, attr, value)
611
+ self.__old_module_states[attr] = value
612
+
613
+ def __reduce__(self):
614
+ args = (self.__old_module_states, self.__new_module)
615
+ return _RedirectSubpackage, args
616
+
617
+
618
+ def redirect_numba_module(old_module_locals, numba_module, numba_cuda_module):
619
+ if find_spec("numba"):
620
+ return _RedirectSubpackage(old_module_locals, numba_module)
621
+ else:
622
+ return _RedirectSubpackage(old_module_locals, numba_cuda_module)
623
+
624
+
625
+ def get_hashable_key(value):
626
+ """
627
+ Given a value, returns a key that can be used
628
+ as a hash. If the value is hashable, we return
629
+ the value, otherwise we return id(value).
630
+
631
+ See discussion in gh #6957
632
+ """
633
+ try:
634
+ hash(value)
635
+ except TypeError:
636
+ return id(value)
637
+ else:
638
+ return value
639
+
640
+
641
+ class threadsafe_cached_property(functools.cached_property):
642
+ def __init__(self, *args, **kwargs):
643
+ super().__init__(*args, **kwargs)
644
+ self._lock = threading.RLock()
645
+
646
+ def __get__(self, *args, **kwargs):
647
+ with self._lock:
648
+ return super().__get__(*args, **kwargs)
649
+
650
+
651
+ def dump_llvm(fndesc, module):
652
+ print(("LLVM DUMP %s" % fndesc).center(80, "-"))
653
+ if config.HIGHLIGHT_DUMPS:
654
+ try:
655
+ from pygments import highlight
656
+ from pygments.lexers import LlvmLexer as lexer
657
+ from pygments.formatters import Terminal256Formatter
658
+ from numba.cuda.misc.dump_style import by_colorscheme
659
+
660
+ print(
661
+ highlight(
662
+ module.__repr__(),
663
+ lexer(),
664
+ Terminal256Formatter(style=by_colorscheme()),
665
+ )
666
+ )
667
+ except ImportError:
668
+ msg = "Please install pygments to see highlighted dumps"
669
+ raise ValueError(msg)
670
+ else:
671
+ print(module)
672
+ print("=" * 80)
673
+
674
+
675
+ class _lazy_pformat(object):
676
+ def __init__(self, *args, **kwargs):
677
+ self.args = args
678
+ self.kwargs = kwargs
679
+
680
+ def __str__(self):
681
+ return pformat(*self.args, **self.kwargs)
682
+
683
+
684
+ class _LazyJSONEncoder(json.JSONEncoder):
685
+ def default(self, obj):
686
+ if isinstance(obj, _lazy_pformat):
687
+ return str(obj)
688
+ return super().default(obj)
689
+
690
+
691
+ def _readenv(name, ctor, default):
692
+ value = os.environ.get(name)
693
+ if value is None:
694
+ return default() if callable(default) else default
695
+ try:
696
+ if ctor is bool:
697
+ return value.lower() in {"1", "true"}
698
+ return ctor(value)
699
+ except Exception:
700
+ warnings.warn(
701
+ f"Environment variable '{name}' is defined but its associated "
702
+ f"value '{value}' could not be parsed.\n"
703
+ "The parse failed with exception:\n"
704
+ f"{traceback.format_exc()}",
705
+ RuntimeWarning,
706
+ )
707
+ return default
708
+
709
+
710
+ @functools.lru_cache(maxsize=None)
711
+ def cached_file_read(filepath, how="r"):
712
+ with open(filepath, how) as f:
713
+ return f.read()
714
+
715
+
716
+ @contextlib.contextmanager
717
+ def numba_target_override():
718
+ if importlib.util.find_spec("numba"):
719
+ from numba.core.target_extension import target_override
720
+
721
+ with target_override("cuda"):
722
+ yield
723
+ else:
724
+ yield