numba-cuda 0.21.1__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. _numba_cuda_redirector.pth +4 -0
  2. _numba_cuda_redirector.py +89 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +6 -0
  5. numba_cuda/_version.py +11 -0
  6. numba_cuda/numba/cuda/__init__.py +70 -0
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
  9. numba_cuda/numba/cuda/api.py +577 -0
  10. numba_cuda/numba/cuda/api_util.py +76 -0
  11. numba_cuda/numba/cuda/args.py +72 -0
  12. numba_cuda/numba/cuda/bf16.py +397 -0
  13. numba_cuda/numba/cuda/cache_hints.py +287 -0
  14. numba_cuda/numba/cuda/cext/__init__.py +2 -0
  15. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  20. numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
  21. numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
  22. numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
  23. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  24. numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
  25. numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
  26. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
  28. numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
  29. numba_cuda/numba/cuda/cext/_typeof.h +19 -0
  30. numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
  31. numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
  32. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  33. numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
  34. numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
  35. numba_cuda/numba/cuda/cg.py +67 -0
  36. numba_cuda/numba/cuda/cgutils.py +1294 -0
  37. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  38. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  39. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  40. numba_cuda/numba/cuda/codegen.py +541 -0
  41. numba_cuda/numba/cuda/compiler.py +1396 -0
  42. numba_cuda/numba/cuda/core/analysis.py +758 -0
  43. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  44. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
  45. numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
  46. numba_cuda/numba/cuda/core/base.py +1332 -0
  47. numba_cuda/numba/cuda/core/boxing.py +1411 -0
  48. numba_cuda/numba/cuda/core/bytecode.py +728 -0
  49. numba_cuda/numba/cuda/core/byteflow.py +2346 -0
  50. numba_cuda/numba/cuda/core/caching.py +744 -0
  51. numba_cuda/numba/cuda/core/callconv.py +392 -0
  52. numba_cuda/numba/cuda/core/codegen.py +171 -0
  53. numba_cuda/numba/cuda/core/compiler.py +199 -0
  54. numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
  55. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  56. numba_cuda/numba/cuda/core/config.py +650 -0
  57. numba_cuda/numba/cuda/core/consts.py +124 -0
  58. numba_cuda/numba/cuda/core/controlflow.py +989 -0
  59. numba_cuda/numba/cuda/core/entrypoints.py +57 -0
  60. numba_cuda/numba/cuda/core/environment.py +66 -0
  61. numba_cuda/numba/cuda/core/errors.py +917 -0
  62. numba_cuda/numba/cuda/core/event.py +511 -0
  63. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  64. numba_cuda/numba/cuda/core/generators.py +387 -0
  65. numba_cuda/numba/cuda/core/imputils.py +509 -0
  66. numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
  67. numba_cuda/numba/cuda/core/interpreter.py +3617 -0
  68. numba_cuda/numba/cuda/core/ir.py +1812 -0
  69. numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
  70. numba_cuda/numba/cuda/core/optional.py +129 -0
  71. numba_cuda/numba/cuda/core/options.py +262 -0
  72. numba_cuda/numba/cuda/core/postproc.py +249 -0
  73. numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
  74. numba_cuda/numba/cuda/core/registry.py +46 -0
  75. numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
  76. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  77. numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
  78. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  79. numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
  80. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
  81. numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
  82. numba_cuda/numba/cuda/core/sigutils.py +68 -0
  83. numba_cuda/numba/cuda/core/ssa.py +498 -0
  84. numba_cuda/numba/cuda/core/targetconfig.py +330 -0
  85. numba_cuda/numba/cuda/core/tracing.py +231 -0
  86. numba_cuda/numba/cuda/core/transforms.py +956 -0
  87. numba_cuda/numba/cuda/core/typed_passes.py +867 -0
  88. numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
  89. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  90. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  91. numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
  92. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  93. numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
  94. numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
  95. numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
  96. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  97. numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
  98. numba_cuda/numba/cuda/cpython/iterators.py +167 -0
  99. numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
  100. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  101. numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
  102. numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
  103. numba_cuda/numba/cuda/cpython/slicing.py +322 -0
  104. numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
  105. numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
  106. numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
  107. numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
  108. numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
  109. numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
  110. numba_cuda/numba/cuda/cuda_paths.py +691 -0
  111. numba_cuda/numba/cuda/cudadecl.py +556 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +951 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3222 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +558 -0
  118. numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
  119. numba_cuda/numba/cuda/cudadrv/error.py +48 -0
  120. numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
  121. numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
  122. numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
  123. numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
  124. numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
  125. numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
  126. numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
  127. numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
  128. numba_cuda/numba/cuda/cudaimpl.py +995 -0
  129. numba_cuda/numba/cuda/cudamath.py +149 -0
  130. numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
  131. numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
  132. numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
  133. numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
  134. numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
  135. numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
  136. numba_cuda/numba/cuda/datamodel/manager.py +11 -0
  137. numba_cuda/numba/cuda/datamodel/models.py +9 -0
  138. numba_cuda/numba/cuda/datamodel/packer.py +9 -0
  139. numba_cuda/numba/cuda/datamodel/registry.py +11 -0
  140. numba_cuda/numba/cuda/datamodel/testing.py +11 -0
  141. numba_cuda/numba/cuda/debuginfo.py +903 -0
  142. numba_cuda/numba/cuda/decorators.py +294 -0
  143. numba_cuda/numba/cuda/descriptor.py +35 -0
  144. numba_cuda/numba/cuda/device_init.py +158 -0
  145. numba_cuda/numba/cuda/deviceufunc.py +1021 -0
  146. numba_cuda/numba/cuda/dispatcher.py +2463 -0
  147. numba_cuda/numba/cuda/errors.py +72 -0
  148. numba_cuda/numba/cuda/extending.py +697 -0
  149. numba_cuda/numba/cuda/flags.py +178 -0
  150. numba_cuda/numba/cuda/fp16.py +357 -0
  151. numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
  152. numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
  153. numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
  154. numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
  155. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  156. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  157. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  158. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  159. numba_cuda/numba/cuda/initialize.py +24 -0
  160. numba_cuda/numba/cuda/intrinsic_wrapper.py +41 -0
  161. numba_cuda/numba/cuda/intrinsics.py +382 -0
  162. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  163. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  164. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  165. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  166. numba_cuda/numba/cuda/libdevice.py +3386 -0
  167. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  168. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  169. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  170. numba_cuda/numba/cuda/locks.py +19 -0
  171. numba_cuda/numba/cuda/lowering.py +1951 -0
  172. numba_cuda/numba/cuda/mathimpl.py +374 -0
  173. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  175. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  178. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  179. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  180. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  181. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  182. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  183. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  184. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  185. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  186. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  187. numba_cuda/numba/cuda/misc/literal.py +28 -0
  188. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  189. numba_cuda/numba/cuda/misc/special.py +94 -0
  190. numba_cuda/numba/cuda/models.py +56 -0
  191. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  192. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  193. numba_cuda/numba/cuda/np/extensions.py +11 -0
  194. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  195. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  196. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  197. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  198. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  199. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  200. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  201. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  202. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  203. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  204. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  206. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  207. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  208. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  209. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  210. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  211. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  212. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  213. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  214. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  215. numba_cuda/numba/cuda/printimpl.py +126 -0
  216. numba_cuda/numba/cuda/random.py +308 -0
  217. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  218. numba_cuda/numba/cuda/serialize.py +267 -0
  219. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  220. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  221. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  222. numba_cuda/numba/cuda/simulator/api.py +179 -0
  223. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  224. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  236. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  237. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  238. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  239. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  241. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  242. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  243. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  244. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  245. numba_cuda/numba/cuda/simulator_init.py +18 -0
  246. numba_cuda/numba/cuda/stubs.py +635 -0
  247. numba_cuda/numba/cuda/target.py +505 -0
  248. numba_cuda/numba/cuda/testing.py +347 -0
  249. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  251. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  252. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  253. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  254. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  255. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +187 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +198 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  285. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  286. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  289. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  290. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  291. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  292. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  293. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  294. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  295. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +889 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  396. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +331 -0
  397. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  399. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  400. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  401. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  402. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  403. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  404. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  406. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  407. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  424. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  425. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +391 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  430. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  431. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  433. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  434. numba_cuda/numba/cuda/tests/support.py +900 -0
  435. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  436. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  437. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  438. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  439. numba_cuda/numba/cuda/types/__init__.py +233 -0
  440. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  441. numba_cuda/numba/cuda/types/abstract.py +9 -0
  442. numba_cuda/numba/cuda/types/common.py +9 -0
  443. numba_cuda/numba/cuda/types/containers.py +9 -0
  444. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  445. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  446. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  447. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  448. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  449. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  450. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  451. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  452. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  453. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  454. numba_cuda/numba/cuda/types/function_type.py +11 -0
  455. numba_cuda/numba/cuda/types/functions.py +9 -0
  456. numba_cuda/numba/cuda/types/iterators.py +9 -0
  457. numba_cuda/numba/cuda/types/misc.py +9 -0
  458. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  459. numba_cuda/numba/cuda/types/scalars.py +9 -0
  460. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  461. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  462. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  463. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  464. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  465. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  466. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  467. numba_cuda/numba/cuda/typing/collections.py +138 -0
  468. numba_cuda/numba/cuda/typing/context.py +782 -0
  469. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  470. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  471. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  472. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  473. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  474. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  475. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  476. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  477. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  478. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  479. numba_cuda/numba/cuda/ufuncs.py +746 -0
  480. numba_cuda/numba/cuda/utils.py +724 -0
  481. numba_cuda/numba/cuda/vector_types.py +214 -0
  482. numba_cuda/numba/cuda/vectorizers.py +260 -0
  483. numba_cuda-0.21.1.dist-info/METADATA +109 -0
  484. numba_cuda-0.21.1.dist-info/RECORD +488 -0
  485. numba_cuda-0.21.1.dist-info/WHEEL +5 -0
  486. numba_cuda-0.21.1.dist-info/licenses/LICENSE +26 -0
  487. numba_cuda-0.21.1.dist-info/licenses/LICENSE.numba +24 -0
  488. numba_cuda-0.21.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,161 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import numbers
5
+ import weakref
6
+
7
+ from numba import cuda
8
+ from numba.cuda.testing import unittest, CUDATestCase, skip_on_cudasim
9
+ from numba.cuda.cudadrv import driver
10
+
11
+
12
+ class TestContextStack(CUDATestCase):
13
+ def setUp(self):
14
+ super().setUp()
15
+ # Reset before testing
16
+ cuda.current_context().reset()
17
+
18
+ def test_gpus_len(self):
19
+ self.assertGreater(len(cuda.gpus), 0)
20
+
21
+ def test_gpus_iter(self):
22
+ gpulist = list(cuda.gpus)
23
+ self.assertGreater(len(gpulist), 0)
24
+
25
+ def test_gpus_cudevice_indexing(self):
26
+ """Test that CUdevice objects can be used to index into cuda.gpus"""
27
+ # When using the CUDA Python bindings, the device ids are CUdevice
28
+ # objects, otherwise they are integers. We test that the device id is
29
+ # usable as an index into cuda.gpus.
30
+ device_ids = [device.id for device in cuda.list_devices()]
31
+ for device_id in device_ids:
32
+ with cuda.gpus[device_id]:
33
+ self.assertEqual(cuda.gpus.current.id, device_id)
34
+
35
+
36
+ class TestContextAPI(CUDATestCase):
37
+ def tearDown(self):
38
+ super().tearDown()
39
+ cuda.current_context().reset()
40
+
41
+ def test_context_memory(self):
42
+ try:
43
+ mem = cuda.current_context().get_memory_info()
44
+ except NotImplementedError:
45
+ self.skipTest("EMM Plugin does not implement get_memory_info()")
46
+
47
+ self.assertIsInstance(mem.free, numbers.Number)
48
+ self.assertEqual(mem.free, mem[0])
49
+
50
+ self.assertIsInstance(mem.total, numbers.Number)
51
+ self.assertEqual(mem.total, mem[1])
52
+
53
+ self.assertLessEqual(mem.free, mem.total)
54
+
55
+ @unittest.skipIf(len(cuda.gpus) < 2, "need more than 1 gpus")
56
+ @skip_on_cudasim("CUDA HW required")
57
+ def test_forbidden_context_switch(self):
58
+ # Cannot switch context inside a `cuda.require_context`
59
+ @cuda.require_context
60
+ def switch_gpu():
61
+ with cuda.gpus[1]:
62
+ pass
63
+
64
+ with cuda.gpus[0]:
65
+ with self.assertRaises(RuntimeError) as raises:
66
+ switch_gpu()
67
+
68
+ self.assertIn("Cannot switch CUDA-context.", str(raises.exception))
69
+
70
+ @unittest.skipIf(len(cuda.gpus) < 2, "need more than 1 gpus")
71
+ def test_accepted_context_switch(self):
72
+ def switch_gpu():
73
+ with cuda.gpus[1]:
74
+ return cuda.current_context().device.id
75
+
76
+ with cuda.gpus[0]:
77
+ devid = switch_gpu()
78
+ self.assertEqual(int(devid), 1)
79
+
80
+
81
+ @skip_on_cudasim("CUDA HW required")
82
+ class Test3rdPartyContext(CUDATestCase):
83
+ def tearDown(self):
84
+ super().tearDown()
85
+ cuda.current_context().reset()
86
+
87
+ def test_attached_primary(self, extra_work=lambda: None):
88
+ # Emulate primary context creation by 3rd party
89
+ the_driver = driver.driver
90
+ dev = driver.binding.CUdevice(0)
91
+ binding_hctx = the_driver.cuDevicePrimaryCtxRetain(dev)
92
+ hctx = driver.drvapi.cu_context(int(binding_hctx))
93
+ try:
94
+ ctx = driver.Context(weakref.proxy(self), hctx)
95
+ ctx.push()
96
+ # Check that the context from numba matches the created primary
97
+ # context.
98
+ my_ctx = cuda.current_context()
99
+ self.assertEqual(my_ctx.handle.value, ctx.handle.value)
100
+
101
+ extra_work()
102
+ finally:
103
+ ctx.pop()
104
+ the_driver.cuDevicePrimaryCtxRelease(dev)
105
+
106
+ def test_attached_non_primary(self):
107
+ # Emulate non-primary context creation by 3rd party
108
+ the_driver = driver.driver
109
+ flags = 0
110
+ dev = driver.binding.CUdevice(0)
111
+
112
+ result, version = driver.binding.cuDriverGetVersion()
113
+ self.assertEqual(
114
+ result,
115
+ driver.binding.CUresult.CUDA_SUCCESS,
116
+ "Error getting CUDA driver version",
117
+ )
118
+
119
+ # CUDA 13's cuCtxCreate has an optional parameter prepended. The
120
+ # version of cuCtxCreate in use depends on the cuda.bindings major
121
+ # version rather than the installed driver version on the machine
122
+ # we're running on.
123
+ from cuda import bindings
124
+
125
+ bindings_version = int(bindings.__version__.split(".")[0])
126
+ if bindings_version in (11, 12):
127
+ args = (flags, dev)
128
+ else:
129
+ args = (None, flags, dev)
130
+
131
+ hctx = the_driver.cuCtxCreate(*args)
132
+ try:
133
+ cuda.current_context()
134
+ except RuntimeError as e:
135
+ # Expecting an error about non-primary CUDA context
136
+ self.assertIn(
137
+ "Numba cannot operate on non-primary CUDA context ", str(e)
138
+ )
139
+ else:
140
+ self.fail("No RuntimeError raised")
141
+ finally:
142
+ the_driver.cuCtxDestroy(hctx)
143
+
144
+ def test_cudajit_in_attached_primary_context(self):
145
+ def do():
146
+ from numba import cuda
147
+
148
+ @cuda.jit
149
+ def foo(a):
150
+ for i in range(a.size):
151
+ a[i] = i
152
+
153
+ a = cuda.device_array(10)
154
+ foo[1, 1](a)
155
+ self.assertEqual(list(a.copy_to_host()), list(range(10)))
156
+
157
+ self.test_attached_primary(do)
158
+
159
+
160
+ if __name__ == "__main__":
161
+ unittest.main()
@@ -0,0 +1,397 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ from itertools import product
5
+
6
+ import numpy as np
7
+
8
+ from numba import cuda
9
+ from numba.cuda.testing import unittest, CUDATestCase, skip_on_cudasim
10
+ from unittest.mock import patch
11
+
12
+
13
+ class CudaArrayIndexing(CUDATestCase):
14
+ def test_index_1d(self):
15
+ arr = np.arange(10)
16
+ darr = cuda.to_device(arr)
17
+ (x,) = arr.shape
18
+ for i in range(-x, x):
19
+ self.assertEqual(arr[i], darr[i])
20
+ with self.assertRaises(IndexError):
21
+ darr[-x - 1]
22
+ with self.assertRaises(IndexError):
23
+ darr[x]
24
+
25
+ def test_index_2d(self):
26
+ arr = np.arange(3 * 4).reshape(3, 4)
27
+ darr = cuda.to_device(arr)
28
+ x, y = arr.shape
29
+ for i in range(-x, x):
30
+ for j in range(-y, y):
31
+ self.assertEqual(arr[i, j], darr[i, j])
32
+ with self.assertRaises(IndexError):
33
+ darr[-x - 1, 0]
34
+ with self.assertRaises(IndexError):
35
+ darr[x, 0]
36
+ with self.assertRaises(IndexError):
37
+ darr[0, -y - 1]
38
+ with self.assertRaises(IndexError):
39
+ darr[0, y]
40
+
41
+ def test_index_3d(self):
42
+ arr = np.arange(3 * 4 * 5).reshape(3, 4, 5)
43
+ darr = cuda.to_device(arr)
44
+ x, y, z = arr.shape
45
+ for i in range(-x, x):
46
+ for j in range(-y, y):
47
+ for k in range(-z, z):
48
+ self.assertEqual(arr[i, j, k], darr[i, j, k])
49
+ with self.assertRaises(IndexError):
50
+ darr[-x - 1, 0, 0]
51
+ with self.assertRaises(IndexError):
52
+ darr[x, 0, 0]
53
+ with self.assertRaises(IndexError):
54
+ darr[0, -y - 1, 0]
55
+ with self.assertRaises(IndexError):
56
+ darr[0, y, 0]
57
+ with self.assertRaises(IndexError):
58
+ darr[0, 0, -z - 1]
59
+ with self.assertRaises(IndexError):
60
+ darr[0, 0, z]
61
+
62
+
63
+ class CudaArrayStridedSlice(CUDATestCase):
64
+ def test_strided_index_1d(self):
65
+ arr = np.arange(10)
66
+ darr = cuda.to_device(arr)
67
+ for i in range(arr.size):
68
+ np.testing.assert_equal(arr[i::2], darr[i::2].copy_to_host())
69
+
70
+ def test_strided_index_2d(self):
71
+ arr = np.arange(6 * 7).reshape(6, 7)
72
+ darr = cuda.to_device(arr)
73
+
74
+ for i in range(arr.shape[0]):
75
+ for j in range(arr.shape[1]):
76
+ np.testing.assert_equal(
77
+ arr[i::2, j::2], darr[i::2, j::2].copy_to_host()
78
+ )
79
+
80
+ def test_strided_index_3d(self):
81
+ arr = np.arange(6 * 7 * 8).reshape(6, 7, 8)
82
+ darr = cuda.to_device(arr)
83
+
84
+ for i in range(arr.shape[0]):
85
+ for j in range(arr.shape[1]):
86
+ for k in range(arr.shape[2]):
87
+ np.testing.assert_equal(
88
+ arr[i::2, j::2, k::2],
89
+ darr[i::2, j::2, k::2].copy_to_host(),
90
+ )
91
+
92
+
93
+ class CudaArraySlicing(CUDATestCase):
94
+ def test_prefix_1d(self):
95
+ arr = np.arange(5)
96
+ darr = cuda.to_device(arr)
97
+ for i in range(arr.size):
98
+ expect = arr[i:]
99
+ got = darr[i:].copy_to_host()
100
+ self.assertTrue(np.all(expect == got))
101
+
102
+ def test_prefix_2d(self):
103
+ arr = np.arange(3**2).reshape(3, 3)
104
+ darr = cuda.to_device(arr)
105
+ for i in range(arr.shape[0]):
106
+ for j in range(arr.shape[1]):
107
+ expect = arr[i:, j:]
108
+ sliced = darr[i:, j:]
109
+ self.assertEqual(expect.shape, sliced.shape)
110
+ self.assertEqual(expect.strides, sliced.strides)
111
+ got = sliced.copy_to_host()
112
+ self.assertTrue(np.all(expect == got))
113
+
114
+ def test_select_3d_first_two_dim(self):
115
+ arr = np.arange(3 * 4 * 5).reshape(3, 4, 5)
116
+ darr = cuda.to_device(arr)
117
+ # Select first dimension
118
+ for i in range(arr.shape[0]):
119
+ expect = arr[i]
120
+ sliced = darr[i]
121
+ self.assertEqual(expect.shape, sliced.shape)
122
+ self.assertEqual(expect.strides, sliced.strides)
123
+ got = sliced.copy_to_host()
124
+ self.assertTrue(np.all(expect == got))
125
+ # Select second dimension
126
+ for i in range(arr.shape[0]):
127
+ for j in range(arr.shape[1]):
128
+ expect = arr[i, j]
129
+ sliced = darr[i, j]
130
+ self.assertEqual(expect.shape, sliced.shape)
131
+ self.assertEqual(expect.strides, sliced.strides)
132
+ got = sliced.copy_to_host()
133
+ self.assertTrue(np.all(expect == got))
134
+
135
+ def test_select_f(self):
136
+ a = np.arange(5 * 6 * 7).reshape(5, 6, 7, order="F")
137
+ da = cuda.to_device(a)
138
+
139
+ for i in range(a.shape[0]):
140
+ for j in range(a.shape[1]):
141
+ self.assertTrue(
142
+ np.array_equal(da[i, j, :].copy_to_host(), a[i, j, :])
143
+ )
144
+ for j in range(a.shape[2]):
145
+ self.assertTrue(
146
+ np.array_equal(da[i, :, j].copy_to_host(), a[i, :, j])
147
+ )
148
+ for i in range(a.shape[1]):
149
+ for j in range(a.shape[2]):
150
+ self.assertTrue(
151
+ np.array_equal(da[:, i, j].copy_to_host(), a[:, i, j])
152
+ )
153
+
154
+ def test_select_c(self):
155
+ a = np.arange(5 * 6 * 7).reshape(5, 6, 7, order="C")
156
+ da = cuda.to_device(a)
157
+
158
+ for i in range(a.shape[0]):
159
+ for j in range(a.shape[1]):
160
+ self.assertTrue(
161
+ np.array_equal(da[i, j, :].copy_to_host(), a[i, j, :])
162
+ )
163
+ for j in range(a.shape[2]):
164
+ self.assertTrue(
165
+ np.array_equal(da[i, :, j].copy_to_host(), a[i, :, j])
166
+ )
167
+ for i in range(a.shape[1]):
168
+ for j in range(a.shape[2]):
169
+ self.assertTrue(
170
+ np.array_equal(da[:, i, j].copy_to_host(), a[:, i, j])
171
+ )
172
+
173
+ def test_prefix_select(self):
174
+ arr = np.arange(5 * 7).reshape(5, 7, order="F")
175
+
176
+ darr = cuda.to_device(arr)
177
+ self.assertTrue(np.all(darr[:1, 1].copy_to_host() == arr[:1, 1]))
178
+
179
+ def test_negative_slicing_1d(self):
180
+ arr = np.arange(10)
181
+ darr = cuda.to_device(arr)
182
+ for i, j in product(range(-10, 10), repeat=2):
183
+ np.testing.assert_array_equal(arr[i:j], darr[i:j].copy_to_host())
184
+
185
+ def test_negative_slicing_2d(self):
186
+ arr = np.arange(12).reshape(3, 4)
187
+ darr = cuda.to_device(arr)
188
+ for x, y, w, s in product(range(-4, 4), repeat=4):
189
+ np.testing.assert_array_equal(
190
+ arr[x:y, w:s], darr[x:y, w:s].copy_to_host()
191
+ )
192
+
193
+ def test_empty_slice_1d(self):
194
+ arr = np.arange(5)
195
+ darr = cuda.to_device(arr)
196
+ for i in range(darr.shape[0]):
197
+ np.testing.assert_array_equal(darr[i:i].copy_to_host(), arr[i:i])
198
+ # empty slice of empty slice
199
+ self.assertFalse(darr[:0][:0].copy_to_host().size > 0)
200
+ # out-of-bound slice just produces empty slices
201
+ np.testing.assert_array_equal(darr[:0][:1].copy_to_host(), arr[:0][:1])
202
+ np.testing.assert_array_equal(
203
+ darr[:0][-1:].copy_to_host(), arr[:0][-1:]
204
+ )
205
+
206
+ def test_empty_slice_2d(self):
207
+ arr = np.arange(5 * 7).reshape(5, 7)
208
+ darr = cuda.to_device(arr)
209
+ np.testing.assert_array_equal(darr[:0].copy_to_host(), arr[:0])
210
+ np.testing.assert_array_equal(darr[3, :0].copy_to_host(), arr[3, :0])
211
+ # empty slice of empty slice
212
+ self.assertFalse(darr[:0][:0].copy_to_host().size > 0)
213
+ # out-of-bound slice just produces empty slices
214
+ np.testing.assert_array_equal(darr[:0][:1].copy_to_host(), arr[:0][:1])
215
+ np.testing.assert_array_equal(
216
+ darr[:0][-1:].copy_to_host(), arr[:0][-1:]
217
+ )
218
+
219
+
220
+ class CudaArraySetting(CUDATestCase):
221
+ """
222
+ Most of the slicing logic is tested in the cases above, so these
223
+ tests focus on the setting logic.
224
+ """
225
+
226
+ def test_scalar(self):
227
+ arr = np.arange(5 * 7).reshape(5, 7)
228
+ darr = cuda.to_device(arr)
229
+ arr[2, 2] = 500
230
+ darr[2, 2] = 500
231
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
232
+
233
+ def test_rank(self):
234
+ arr = np.arange(5 * 7).reshape(5, 7)
235
+ darr = cuda.to_device(arr)
236
+ arr[2] = 500
237
+ darr[2] = 500
238
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
239
+
240
+ def test_broadcast(self):
241
+ arr = np.arange(5 * 7).reshape(5, 7)
242
+ darr = cuda.to_device(arr)
243
+ arr[:, 2] = 500
244
+ darr[:, 2] = 500
245
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
246
+
247
+ def test_array_assign_column(self):
248
+ arr = np.arange(5 * 7).reshape(5, 7)
249
+ darr = cuda.to_device(arr)
250
+ _400 = np.full(shape=7, fill_value=400)
251
+ arr[2] = _400
252
+ darr[2] = _400
253
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
254
+
255
+ def test_array_assign_row(self):
256
+ arr = np.arange(5 * 7).reshape(5, 7)
257
+ darr = cuda.to_device(arr)
258
+ _400 = np.full(shape=5, fill_value=400)
259
+ arr[:, 2] = _400
260
+ darr[:, 2] = _400
261
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
262
+
263
+ def test_array_assign_subarray(self):
264
+ arr = np.arange(5 * 6 * 7).reshape(5, 6, 7)
265
+ darr = cuda.to_device(arr)
266
+ _400 = np.full(shape=(6, 7), fill_value=400)
267
+ arr[2] = _400
268
+ darr[2] = _400
269
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
270
+
271
+ def test_array_assign_deep_subarray(self):
272
+ arr = np.arange(5 * 6 * 7 * 8).reshape(5, 6, 7, 8)
273
+ darr = cuda.to_device(arr)
274
+ _400 = np.full(shape=(5, 6, 8), fill_value=400)
275
+ arr[:, :, 2] = _400
276
+ darr[:, :, 2] = _400
277
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
278
+
279
+ def test_array_assign_all(self):
280
+ arr = np.arange(5 * 7).reshape(5, 7)
281
+ darr = cuda.to_device(arr)
282
+ _400 = np.full(shape=(5, 7), fill_value=400)
283
+ arr[:] = _400
284
+ darr[:] = _400
285
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
286
+
287
+ def test_strides(self):
288
+ arr = np.ones(20)
289
+ darr = cuda.to_device(arr)
290
+ arr[::2] = 500
291
+ darr[::2] = 500
292
+ np.testing.assert_array_equal(darr.copy_to_host(), arr)
293
+
294
+ def test_incompatible_highdim(self):
295
+ darr = cuda.to_device(np.arange(5 * 7))
296
+
297
+ with self.assertRaises(ValueError) as e:
298
+ darr[:] = np.ones(shape=(1, 2, 3))
299
+
300
+ self.assertIn(
301
+ member=str(e.exception),
302
+ container=[
303
+ "Can't assign 3-D array to 1-D self", # device
304
+ "could not broadcast input array from shape (2,3) "
305
+ "into shape (35,)", # simulator, NP >= 1.20
306
+ ],
307
+ )
308
+
309
+ def test_incompatible_shape(self):
310
+ darr = cuda.to_device(np.arange(5))
311
+
312
+ with self.assertRaises(ValueError) as e:
313
+ darr[:] = [1, 3]
314
+
315
+ self.assertIn(
316
+ member=str(e.exception),
317
+ container=[
318
+ "Can't copy sequence with size 2 to array axis 0 with "
319
+ "dimension 5", # device
320
+ "could not broadcast input array from shape (2,) into "
321
+ "shape (5,)", # simulator, NP >= 1.20
322
+ ],
323
+ )
324
+
325
+ @skip_on_cudasim("cudasim does not use streams and operates synchronously")
326
+ def test_sync(self):
327
+ # There should be a synchronization when no stream is supplied
328
+ darr = cuda.to_device(np.arange(5))
329
+
330
+ with patch.object(
331
+ cuda.cudadrv.driver.Stream, "synchronize", return_value=None
332
+ ) as mock_sync:
333
+ darr[0] = 10
334
+
335
+ mock_sync.assert_called_once()
336
+
337
+ @skip_on_cudasim("cudasim does not use streams and operates synchronously")
338
+ def test_no_sync_default_stream(self):
339
+ # There should not be a synchronization when the array has a default
340
+ # stream, whether it is the default stream, the legacy default stream,
341
+ # the per-thread default stream, or another stream.
342
+ streams = (
343
+ cuda.stream(),
344
+ cuda.default_stream(),
345
+ cuda.legacy_default_stream(),
346
+ cuda.per_thread_default_stream(),
347
+ )
348
+
349
+ for stream in streams:
350
+ darr = cuda.to_device(np.arange(5), stream=stream)
351
+
352
+ with patch.object(
353
+ cuda.cudadrv.driver.Stream, "synchronize", return_value=None
354
+ ) as mock_sync:
355
+ darr[0] = 10
356
+
357
+ mock_sync.assert_not_called()
358
+
359
+ @skip_on_cudasim("cudasim does not use streams and operates synchronously")
360
+ def test_no_sync_supplied_stream(self):
361
+ # There should not be a synchronization when a stream is supplied for
362
+ # the setitem call, whether it is the default stream, the legacy default
363
+ # stream, the per-thread default stream, or another stream.
364
+ streams = (
365
+ cuda.stream(),
366
+ cuda.default_stream(),
367
+ cuda.legacy_default_stream(),
368
+ cuda.per_thread_default_stream(),
369
+ )
370
+
371
+ for stream in streams:
372
+ darr = cuda.to_device(np.arange(5))
373
+
374
+ with patch.object(
375
+ cuda.cudadrv.driver.Stream, "synchronize", return_value=None
376
+ ) as mock_sync:
377
+ darr.setitem(0, 10, stream=stream)
378
+
379
+ mock_sync.assert_not_called()
380
+
381
+ @unittest.skip("Requires PR #6367")
382
+ def test_issue_6505(self):
383
+ # On Windows, the writes to ary_v would not be visible prior to the
384
+ # assertion, due to the assignment being done with a kernel launch that
385
+ # returns asynchronously - there should now be a sync after the kernel
386
+ # launch to ensure that the writes are always visible.
387
+ ary = cuda.mapped_array(2, dtype=np.int32)
388
+ ary[:] = 0
389
+
390
+ ary_v = ary.view("u1")
391
+ ary_v[1] = 1
392
+ ary_v[5] = 1
393
+ self.assertEqual(sum(ary), 512)
394
+
395
+
396
+ if __name__ == "__main__":
397
+ unittest.main()
@@ -0,0 +1,24 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import numpy as np
5
+ from numba import cuda
6
+ from numba.cuda.testing import unittest, CUDATestCase
7
+
8
+
9
+ class TestCudaAutoContext(CUDATestCase):
10
+ def test_auto_context(self):
11
+ """A problem was revealed by a customer that the use cuda.to_device
12
+ does not create a CUDA context.
13
+ This tests the problem
14
+ """
15
+ A = np.arange(10, dtype=np.float32)
16
+ newA = np.empty_like(A)
17
+ dA = cuda.to_device(A)
18
+
19
+ dA.copy_to_host(newA)
20
+ self.assertTrue(np.allclose(A, newA))
21
+
22
+
23
+ if __name__ == "__main__":
24
+ unittest.main()