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,289 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ """
5
+ Implementation of the range object for fixed-size integers.
6
+ """
7
+
8
+ import operator
9
+
10
+ from numba.cuda import types
11
+ from numba.cuda import cgutils
12
+ from numba.cuda.core.imputils import (
13
+ Registry,
14
+ RefType,
15
+ iternext_impl,
16
+ impl_ret_untracked,
17
+ )
18
+ from numba.cuda.typing import signature
19
+ from numba.cuda.extending import (
20
+ intrinsic,
21
+ overload,
22
+ overload_attribute,
23
+ register_jitable,
24
+ )
25
+
26
+
27
+ registry = Registry("rangeobj")
28
+ lower = registry.lower
29
+ lower_cast = registry.lower_cast
30
+
31
+
32
+ def iterator_impl(iterable_type, iterator_type):
33
+ """
34
+ Decorator a given class as implementing *iterator_type*
35
+ (by providing an `iternext()` method).
36
+ """
37
+
38
+ def wrapper(cls):
39
+ # These are unbound methods
40
+ iternext = cls.iternext
41
+
42
+ @iternext_impl(RefType.BORROWED)
43
+ def iternext_wrapper(context, builder, sig, args, result):
44
+ (value,) = args
45
+ iterobj = cls(context, builder, value)
46
+ return iternext(iterobj, context, builder, result)
47
+
48
+ lower("iternext", iterator_type)(iternext_wrapper)
49
+ return cls
50
+
51
+ return wrapper
52
+
53
+
54
+ def make_range_iterator(typ):
55
+ """
56
+ Return the Structure representation of the given *typ* (an
57
+ instance of types.RangeIteratorType).
58
+ """
59
+ return cgutils.create_struct_proxy(typ)
60
+
61
+
62
+ def make_range_impl(int_type, range_state_type, range_iter_type):
63
+ RangeState = cgutils.create_struct_proxy(range_state_type)
64
+
65
+ @lower(range, int_type)
66
+ def range1_impl(context, builder, sig, args):
67
+ """
68
+ range(stop: int) -> range object
69
+ """
70
+ [stop] = args
71
+ state = RangeState(context, builder)
72
+ state.start = context.get_constant(int_type, 0)
73
+ state.stop = stop
74
+ state.step = context.get_constant(int_type, 1)
75
+ return impl_ret_untracked(
76
+ context, builder, range_state_type, state._getvalue()
77
+ )
78
+
79
+ @lower(range, int_type, int_type)
80
+ def range2_impl(context, builder, sig, args):
81
+ """
82
+ range(start: int, stop: int) -> range object
83
+ """
84
+ start, stop = args
85
+ state = RangeState(context, builder)
86
+ state.start = start
87
+ state.stop = stop
88
+ state.step = context.get_constant(int_type, 1)
89
+ return impl_ret_untracked(
90
+ context, builder, range_state_type, state._getvalue()
91
+ )
92
+
93
+ @lower(range, int_type, int_type, int_type)
94
+ def range3_impl(context, builder, sig, args):
95
+ """
96
+ range(start: int, stop: int, step: int) -> range object
97
+ """
98
+ [start, stop, step] = args
99
+ state = RangeState(context, builder)
100
+ state.start = start
101
+ state.stop = stop
102
+ state.step = step
103
+ return impl_ret_untracked(
104
+ context, builder, range_state_type, state._getvalue()
105
+ )
106
+
107
+ @lower(len, range_state_type)
108
+ def range_len(context, builder, sig, args):
109
+ """
110
+ len(range)
111
+ """
112
+ (value,) = args
113
+ state = RangeState(context, builder, value)
114
+ res = RangeIter.from_range_state(context, builder, state)
115
+ return impl_ret_untracked(
116
+ context, builder, int_type, builder.load(res.count)
117
+ )
118
+
119
+ @lower("getiter", range_state_type)
120
+ def getiter_range32_impl(context, builder, sig, args):
121
+ """
122
+ range.__iter__
123
+ """
124
+ (value,) = args
125
+ state = RangeState(context, builder, value)
126
+ res = RangeIter.from_range_state(context, builder, state)._getvalue()
127
+ return impl_ret_untracked(context, builder, range_iter_type, res)
128
+
129
+ @iterator_impl(range_state_type, range_iter_type)
130
+ class RangeIter(make_range_iterator(range_iter_type)):
131
+ @classmethod
132
+ def from_range_state(cls, context, builder, state):
133
+ """
134
+ Create a RangeIter initialized from the given RangeState *state*.
135
+ """
136
+ self = cls(context, builder)
137
+ start = state.start
138
+ stop = state.stop
139
+ step = state.step
140
+
141
+ startptr = cgutils.alloca_once(builder, start.type)
142
+ builder.store(start, startptr)
143
+
144
+ countptr = cgutils.alloca_once(builder, start.type)
145
+
146
+ self.iter = startptr
147
+ self.stop = stop
148
+ self.step = step
149
+ self.count = countptr
150
+
151
+ diff = builder.sub(stop, start)
152
+ zero = context.get_constant(int_type, 0)
153
+ one = context.get_constant(int_type, 1)
154
+ pos_diff = builder.icmp_signed(">", diff, zero)
155
+ pos_step = builder.icmp_signed(">", step, zero)
156
+ sign_differs = builder.xor(pos_diff, pos_step)
157
+ zero_step = builder.icmp_unsigned("==", step, zero)
158
+
159
+ with cgutils.if_unlikely(builder, zero_step):
160
+ # step shouldn't be zero
161
+ context.call_conv.return_user_exc(
162
+ builder, ValueError, ("range() arg 3 must not be zero",)
163
+ )
164
+
165
+ with builder.if_else(sign_differs) as (then, orelse):
166
+ with then:
167
+ builder.store(zero, self.count)
168
+
169
+ with orelse:
170
+ rem = builder.srem(diff, step)
171
+ rem = builder.select(pos_diff, rem, builder.neg(rem))
172
+ uneven = builder.icmp_signed(">", rem, zero)
173
+ newcount = builder.add(
174
+ builder.sdiv(diff, step),
175
+ builder.select(uneven, one, zero),
176
+ )
177
+ builder.store(newcount, self.count)
178
+
179
+ return self
180
+
181
+ def iternext(self, context, builder, result):
182
+ zero = context.get_constant(int_type, 0)
183
+ countptr = self.count
184
+ count = builder.load(countptr)
185
+ is_valid = builder.icmp_signed(">", count, zero)
186
+ result.set_valid(is_valid)
187
+
188
+ with builder.if_then(is_valid):
189
+ value = builder.load(self.iter)
190
+ result.yield_(value)
191
+ one = context.get_constant(int_type, 1)
192
+
193
+ builder.store(builder.sub(count, one, flags=["nsw"]), countptr)
194
+ builder.store(builder.add(value, self.step), self.iter)
195
+
196
+
197
+ range_impl_map = {
198
+ types.int32: (types.range_state32_type, types.range_iter32_type),
199
+ types.int64: (types.range_state64_type, types.range_iter64_type),
200
+ types.uint64: (
201
+ types.unsigned_range_state64_type,
202
+ types.unsigned_range_iter64_type,
203
+ ),
204
+ }
205
+
206
+ for int_type, state_types in range_impl_map.items():
207
+ make_range_impl(int_type, *state_types)
208
+
209
+
210
+ @lower_cast(types.RangeType, types.RangeType)
211
+ def range_to_range(context, builder, fromty, toty, val):
212
+ olditems = cgutils.unpack_tuple(builder, val, 3)
213
+ items = [
214
+ context.cast(builder, v, fromty.dtype, toty.dtype) for v in olditems
215
+ ]
216
+ return cgutils.make_anonymous_struct(builder, items)
217
+
218
+
219
+ def make_range_attr(index, attribute):
220
+ @intrinsic
221
+ def rangetype_attr_getter(typingctx, a):
222
+ if isinstance(a, types.RangeType):
223
+
224
+ def codegen(context, builder, sig, args):
225
+ (val,) = args
226
+ items = cgutils.unpack_tuple(builder, val, 3)
227
+ return impl_ret_untracked(
228
+ context, builder, sig.return_type, items[index]
229
+ )
230
+
231
+ return signature(a.dtype, a), codegen
232
+
233
+ @overload_attribute(types.RangeType, attribute)
234
+ def range_attr(rnge):
235
+ def get(rnge):
236
+ return rangetype_attr_getter(rnge)
237
+
238
+ return get
239
+
240
+
241
+ @register_jitable
242
+ def impl_contains_helper(robj, val):
243
+ if robj.step > 0 and (val < robj.start or val >= robj.stop):
244
+ return False
245
+ elif robj.step < 0 and (val <= robj.stop or val > robj.start):
246
+ return False
247
+
248
+ return ((val - robj.start) % robj.step) == 0
249
+
250
+
251
+ @overload(operator.contains)
252
+ def impl_contains(robj, val):
253
+ def impl_false(robj, val):
254
+ return False
255
+
256
+ if not isinstance(robj, types.RangeType):
257
+ return
258
+
259
+ elif isinstance(val, (types.Integer, types.Boolean)):
260
+ return impl_contains_helper
261
+
262
+ elif isinstance(val, types.Float):
263
+
264
+ def impl(robj, val):
265
+ if val % 1 != 0:
266
+ return False
267
+ else:
268
+ return impl_contains_helper(robj, int(val))
269
+
270
+ return impl
271
+
272
+ elif isinstance(val, types.Complex):
273
+
274
+ def impl(robj, val):
275
+ if val.imag != 0:
276
+ return False
277
+ elif val.real % 1 != 0:
278
+ return False
279
+ else:
280
+ return impl_contains_helper(robj, int(val.real))
281
+
282
+ return impl
283
+
284
+ elif not isinstance(val, types.Number):
285
+ return impl_false
286
+
287
+
288
+ for ix, attr in enumerate(("start", "stop", "step")):
289
+ make_range_attr(index=ix, attribute=attr)
@@ -0,0 +1,322 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ """
5
+ Implement slices and various slice computations.
6
+ """
7
+
8
+ from llvmlite import ir
9
+ from numba.cuda import types
10
+ from numba.cuda import cgutils
11
+ from numba.cuda.core.imputils import impl_ret_untracked, Registry
12
+
13
+ registry = Registry("slicing")
14
+ lower = registry.lower
15
+ lower_getattr = registry.lower_getattr
16
+ lower_cast = registry.lower_cast
17
+ lower_constant = registry.lower_constant
18
+
19
+
20
+ def fix_index(builder, idx, size):
21
+ """
22
+ Fix negative index by adding *size* to it. Positive
23
+ indices are left untouched.
24
+ """
25
+ is_negative = builder.icmp_signed("<", idx, ir.Constant(size.type, 0))
26
+ wrapped_index = builder.add(idx, size)
27
+ return builder.select(is_negative, wrapped_index, idx)
28
+
29
+
30
+ def fix_slice(builder, slice, size):
31
+ """
32
+ Fix *slice* start and stop to be valid (inclusive and exclusive, resp)
33
+ indexing bounds for a sequence of the given *size*.
34
+ """
35
+ # See PySlice_GetIndicesEx()
36
+ zero = ir.Constant(size.type, 0)
37
+ minus_one = ir.Constant(size.type, -1)
38
+
39
+ def fix_bound(bound_name, lower_repl, upper_repl):
40
+ bound = getattr(slice, bound_name)
41
+ bound = fix_index(builder, bound, size)
42
+ # Store value
43
+ setattr(slice, bound_name, bound)
44
+ # Still negative? => clamp to lower_repl
45
+ underflow = builder.icmp_signed("<", bound, zero)
46
+ with builder.if_then(underflow, likely=False):
47
+ setattr(slice, bound_name, lower_repl)
48
+ # Greater than size? => clamp to upper_repl
49
+ overflow = builder.icmp_signed(">=", bound, size)
50
+ with builder.if_then(overflow, likely=False):
51
+ setattr(slice, bound_name, upper_repl)
52
+
53
+ with builder.if_else(cgutils.is_neg_int(builder, slice.step)) as (
54
+ if_neg_step,
55
+ if_pos_step,
56
+ ):
57
+ with if_pos_step:
58
+ # < 0 => 0; >= size => size
59
+ fix_bound("start", zero, size)
60
+ fix_bound("stop", zero, size)
61
+ with if_neg_step:
62
+ # < 0 => -1; >= size => size - 1
63
+ lower = minus_one
64
+ upper = builder.add(size, minus_one)
65
+ fix_bound("start", lower, upper)
66
+ fix_bound("stop", lower, upper)
67
+
68
+
69
+ def get_slice_length(builder, slicestruct):
70
+ """
71
+ Given a slice, compute the number of indices it spans, i.e. the
72
+ number of iterations that for_range_slice() will execute.
73
+
74
+ Pseudo-code:
75
+ assert step != 0
76
+ if step > 0:
77
+ if stop <= start:
78
+ return 0
79
+ else:
80
+ return (stop - start - 1) // step + 1
81
+ else:
82
+ if stop >= start:
83
+ return 0
84
+ else:
85
+ return (stop - start + 1) // step + 1
86
+
87
+ (see PySlice_GetIndicesEx() in CPython)
88
+ """
89
+ start = slicestruct.start
90
+ stop = slicestruct.stop
91
+ step = slicestruct.step
92
+ one = ir.Constant(start.type, 1)
93
+ zero = ir.Constant(start.type, 0)
94
+
95
+ is_step_negative = cgutils.is_neg_int(builder, step)
96
+ delta = builder.sub(stop, start)
97
+
98
+ # Nominal case
99
+ pos_dividend = builder.sub(delta, one)
100
+ neg_dividend = builder.add(delta, one)
101
+ dividend = builder.select(is_step_negative, neg_dividend, pos_dividend)
102
+ nominal_length = builder.add(one, builder.sdiv(dividend, step))
103
+
104
+ # Catch zero length
105
+ is_zero_length = builder.select(
106
+ is_step_negative,
107
+ builder.icmp_signed(">=", delta, zero),
108
+ builder.icmp_signed("<=", delta, zero),
109
+ )
110
+
111
+ # Clamp to 0 if is_zero_length
112
+ return builder.select(is_zero_length, zero, nominal_length)
113
+
114
+
115
+ def get_slice_bounds(builder, slicestruct):
116
+ """
117
+ Return the [lower, upper) indexing bounds of a slice.
118
+ """
119
+ start = slicestruct.start
120
+ stop = slicestruct.stop
121
+ zero = start.type(0)
122
+ one = start.type(1)
123
+ # This is a bit pessimal, e.g. it will return [1, 5) instead
124
+ # of [1, 4) for `1:5:2`
125
+ is_step_negative = builder.icmp_signed("<", slicestruct.step, zero)
126
+ lower = builder.select(is_step_negative, builder.add(stop, one), start)
127
+ upper = builder.select(is_step_negative, builder.add(start, one), stop)
128
+ return lower, upper
129
+
130
+
131
+ def fix_stride(builder, slice, stride):
132
+ """
133
+ Fix the given stride for the slice's step.
134
+ """
135
+ return builder.mul(slice.step, stride)
136
+
137
+
138
+ def guard_invalid_slice(context, builder, typ, slicestruct):
139
+ """
140
+ Guard against *slicestruct* having a zero step (and raise ValueError).
141
+ """
142
+ if typ.has_step:
143
+ cgutils.guard_null(
144
+ context,
145
+ builder,
146
+ slicestruct.step,
147
+ (ValueError, "slice step cannot be zero"),
148
+ )
149
+
150
+
151
+ def get_defaults(context):
152
+ """
153
+ Get the default values for a slice's members:
154
+ (start for positive step, start for negative step,
155
+ stop for positive step, stop for negative step, step)
156
+ """
157
+ maxint = (1 << (context.address_size - 1)) - 1
158
+ return (0, maxint, maxint, -maxint - 1, 1)
159
+
160
+
161
+ # ---------------------------------------------------------------------------
162
+ # The slice structure
163
+
164
+
165
+ @lower(slice, types.VarArg(types.Any))
166
+ def slice_constructor_impl(context, builder, sig, args):
167
+ (
168
+ default_start_pos,
169
+ default_start_neg,
170
+ default_stop_pos,
171
+ default_stop_neg,
172
+ default_step,
173
+ ) = [context.get_constant(types.intp, x) for x in get_defaults(context)]
174
+
175
+ slice_args = [None] * 3
176
+
177
+ # Fetch non-None arguments
178
+ if len(args) == 1 and sig.args[0] is not types.none:
179
+ slice_args[1] = args[0]
180
+ else:
181
+ for i, (ty, val) in enumerate(zip(sig.args, args)):
182
+ if ty is not types.none:
183
+ slice_args[i] = val
184
+
185
+ # Fill omitted arguments
186
+ def get_arg_value(i, default):
187
+ val = slice_args[i]
188
+ if val is None:
189
+ return default
190
+ else:
191
+ return val
192
+
193
+ step = get_arg_value(2, default_step)
194
+ is_step_negative = builder.icmp_signed(
195
+ "<", step, context.get_constant(types.intp, 0)
196
+ )
197
+ default_stop = builder.select(
198
+ is_step_negative, default_stop_neg, default_stop_pos
199
+ )
200
+ default_start = builder.select(
201
+ is_step_negative, default_start_neg, default_start_pos
202
+ )
203
+ stop = get_arg_value(1, default_stop)
204
+ start = get_arg_value(0, default_start)
205
+
206
+ ty = sig.return_type
207
+ sli = context.make_helper(builder, sig.return_type)
208
+ sli.start = start
209
+ sli.stop = stop
210
+ sli.step = step
211
+
212
+ res = sli._getvalue()
213
+ return impl_ret_untracked(context, builder, sig.return_type, res)
214
+
215
+
216
+ @lower_getattr(types.SliceType, "start")
217
+ def slice_start_impl(context, builder, typ, value):
218
+ sli = context.make_helper(builder, typ, value)
219
+ return sli.start
220
+
221
+
222
+ @lower_getattr(types.SliceType, "stop")
223
+ def slice_stop_impl(context, builder, typ, value):
224
+ sli = context.make_helper(builder, typ, value)
225
+ return sli.stop
226
+
227
+
228
+ @lower_getattr(types.SliceType, "step")
229
+ def slice_step_impl(context, builder, typ, value):
230
+ if typ.has_step:
231
+ sli = context.make_helper(builder, typ, value)
232
+ return sli.step
233
+ else:
234
+ return context.get_constant(types.intp, 1)
235
+
236
+
237
+ @lower("slice.indices", types.SliceType, types.Integer)
238
+ def slice_indices(context, builder, sig, args):
239
+ length = args[1]
240
+ sli = context.make_helper(builder, sig.args[0], args[0])
241
+
242
+ with builder.if_then(cgutils.is_neg_int(builder, length), likely=False):
243
+ context.call_conv.return_user_exc(
244
+ builder, ValueError, ("length should not be negative",)
245
+ )
246
+ with builder.if_then(
247
+ cgutils.is_scalar_zero(builder, sli.step), likely=False
248
+ ):
249
+ context.call_conv.return_user_exc(
250
+ builder, ValueError, ("slice step cannot be zero",)
251
+ )
252
+
253
+ fix_slice(builder, sli, length)
254
+
255
+ return context.make_tuple(
256
+ builder, sig.return_type, (sli.start, sli.stop, sli.step)
257
+ )
258
+
259
+
260
+ def make_slice_from_constant(context, builder, ty, pyval):
261
+ sli = context.make_helper(builder, ty)
262
+ lty = context.get_value_type(types.intp)
263
+
264
+ (
265
+ default_start_pos,
266
+ default_start_neg,
267
+ default_stop_pos,
268
+ default_stop_neg,
269
+ default_step,
270
+ ) = [context.get_constant(types.intp, x) for x in get_defaults(context)]
271
+
272
+ step = pyval.step
273
+ if step is None:
274
+ step_is_neg = False
275
+ step = default_step
276
+ else:
277
+ step_is_neg = step < 0
278
+ step = lty(step)
279
+
280
+ start = pyval.start
281
+ if start is None:
282
+ if step_is_neg:
283
+ start = default_start_neg
284
+ else:
285
+ start = default_start_pos
286
+ else:
287
+ start = lty(start)
288
+
289
+ stop = pyval.stop
290
+ if stop is None:
291
+ if step_is_neg:
292
+ stop = default_stop_neg
293
+ else:
294
+ stop = default_stop_pos
295
+ else:
296
+ stop = lty(stop)
297
+
298
+ sli.start = start
299
+ sli.stop = stop
300
+ sli.step = step
301
+
302
+ return sli._getvalue()
303
+
304
+
305
+ @lower_constant(types.SliceType)
306
+ def constant_slice(context, builder, ty, pyval):
307
+ if isinstance(ty, types.Literal):
308
+ typ = ty.literal_type
309
+ else:
310
+ typ = ty
311
+
312
+ return make_slice_from_constant(context, builder, typ, pyval)
313
+
314
+
315
+ @lower_cast(types.misc.SliceLiteral, types.SliceType)
316
+ def cast_from_literal(context, builder, fromty, toty, val):
317
+ return make_slice_from_constant(
318
+ context,
319
+ builder,
320
+ toty,
321
+ fromty.literal_value,
322
+ )