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,247 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ from contextlib import contextmanager
5
+
6
+ import numpy as np
7
+
8
+ from numba import cuda
9
+ from numba.cuda.testing import (
10
+ unittest,
11
+ skip_on_cudasim,
12
+ skip_if_external_memmgr,
13
+ CUDATestCase,
14
+ )
15
+ from numba.cuda.tests.support import captured_stderr
16
+ from numba.cuda.core import config
17
+
18
+
19
+ @skip_on_cudasim("not supported on CUDASIM")
20
+ class TestDeallocation(CUDATestCase):
21
+ @skip_if_external_memmgr("Deallocation specific to Numba memory management")
22
+ def test_max_pending_count(self):
23
+ # get deallocation manager and flush it
24
+ deallocs = cuda.current_context().memory_manager.deallocations
25
+ deallocs.clear()
26
+ self.assertEqual(len(deallocs), 0)
27
+ # deallocate to maximum count
28
+ for i in range(config.CUDA_DEALLOCS_COUNT):
29
+ cuda.to_device(np.arange(1))
30
+ self.assertEqual(len(deallocs), i + 1)
31
+ # one more to trigger .clear()
32
+ cuda.to_device(np.arange(1))
33
+ self.assertEqual(len(deallocs), 0)
34
+
35
+ @skip_if_external_memmgr("Deallocation specific to Numba memory management")
36
+ def test_max_pending_bytes(self):
37
+ # get deallocation manager and flush it
38
+ ctx = cuda.current_context()
39
+ deallocs = ctx.memory_manager.deallocations
40
+ deallocs.clear()
41
+ self.assertEqual(len(deallocs), 0)
42
+
43
+ mi = ctx.get_memory_info()
44
+
45
+ max_pending = 10**6 # 1MB
46
+ old_ratio = config.CUDA_DEALLOCS_RATIO
47
+ try:
48
+ # change to a smaller ratio
49
+ config.CUDA_DEALLOCS_RATIO = max_pending / mi.total
50
+ # due to round off error (floor is used in calculating
51
+ # _max_pending_bytes) it can be off by 1.
52
+ self.assertAlmostEqual(
53
+ deallocs._max_pending_bytes, max_pending, delta=1
54
+ )
55
+
56
+ # allocate half the max size
57
+ # this will not trigger deallocation
58
+ cuda.to_device(np.ones(max_pending // 2, dtype=np.int8))
59
+ self.assertEqual(len(deallocs), 1)
60
+
61
+ # allocate another remaining
62
+ # this will not trigger deallocation
63
+ cuda.to_device(
64
+ np.ones(
65
+ deallocs._max_pending_bytes - deallocs._size, dtype=np.int8
66
+ )
67
+ )
68
+ self.assertEqual(len(deallocs), 2)
69
+
70
+ # another byte to trigger .clear()
71
+ cuda.to_device(np.ones(1, dtype=np.int8))
72
+ self.assertEqual(len(deallocs), 0)
73
+ finally:
74
+ # restore old ratio
75
+ config.CUDA_DEALLOCS_RATIO = old_ratio
76
+
77
+ @skip_if_external_memmgr("Deallocation specific to Numba memory management")
78
+ def test_defer_cleanup(self):
79
+ harr = np.arange(5)
80
+ darr1 = cuda.to_device(harr)
81
+ deallocs = cuda.current_context().memory_manager.deallocations
82
+ deallocs.clear()
83
+ self.assertEqual(len(deallocs), 0)
84
+ with cuda.defer_cleanup():
85
+ darr2 = cuda.to_device(harr)
86
+ del darr1
87
+ self.assertEqual(len(deallocs), 1)
88
+ del darr2
89
+ self.assertEqual(len(deallocs), 2)
90
+ deallocs.clear()
91
+ self.assertEqual(len(deallocs), 2)
92
+
93
+ deallocs.clear()
94
+ self.assertEqual(len(deallocs), 0)
95
+
96
+ @skip_if_external_memmgr("Deallocation specific to Numba memory management")
97
+ def test_nested_defer_cleanup(self):
98
+ harr = np.arange(5)
99
+ darr1 = cuda.to_device(harr)
100
+ deallocs = cuda.current_context().memory_manager.deallocations
101
+ deallocs.clear()
102
+ self.assertEqual(len(deallocs), 0)
103
+ with cuda.defer_cleanup():
104
+ with cuda.defer_cleanup():
105
+ darr2 = cuda.to_device(harr)
106
+ del darr1
107
+ self.assertEqual(len(deallocs), 1)
108
+ del darr2
109
+ self.assertEqual(len(deallocs), 2)
110
+ deallocs.clear()
111
+ self.assertEqual(len(deallocs), 2)
112
+ deallocs.clear()
113
+ self.assertEqual(len(deallocs), 2)
114
+
115
+ deallocs.clear()
116
+ self.assertEqual(len(deallocs), 0)
117
+
118
+ @skip_if_external_memmgr("Deallocation specific to Numba memory management")
119
+ def test_exception(self):
120
+ harr = np.arange(5)
121
+ darr1 = cuda.to_device(harr)
122
+ deallocs = cuda.current_context().memory_manager.deallocations
123
+ deallocs.clear()
124
+ self.assertEqual(len(deallocs), 0)
125
+
126
+ class CustomError(Exception):
127
+ pass
128
+
129
+ with self.assertRaises(CustomError):
130
+ with cuda.defer_cleanup():
131
+ darr2 = cuda.to_device(harr)
132
+ del darr2
133
+ self.assertEqual(len(deallocs), 1)
134
+ deallocs.clear()
135
+ self.assertEqual(len(deallocs), 1)
136
+ raise CustomError
137
+ deallocs.clear()
138
+ self.assertEqual(len(deallocs), 0)
139
+ del darr1
140
+ self.assertEqual(len(deallocs), 1)
141
+ deallocs.clear()
142
+ self.assertEqual(len(deallocs), 0)
143
+
144
+ @contextmanager
145
+ def check_ignored_exception(self, ctx):
146
+ with captured_stderr() as cap:
147
+ yield
148
+ ctx.deallocations.clear()
149
+ self.assertFalse(cap.getvalue())
150
+
151
+ def test_del_stream(self):
152
+ ctx = cuda.current_context()
153
+ stream = ctx.create_stream()
154
+ with self.check_ignored_exception(ctx):
155
+ del stream
156
+
157
+ def test_del_event(self):
158
+ ctx = cuda.current_context()
159
+ event = ctx.create_event()
160
+ with self.check_ignored_exception(ctx):
161
+ del event
162
+
163
+ def test_del_pinned_memory(self):
164
+ ctx = cuda.current_context()
165
+ mem = ctx.memhostalloc(32)
166
+ with self.check_ignored_exception(ctx):
167
+ del mem
168
+
169
+ def test_del_mapped_memory(self):
170
+ ctx = cuda.current_context()
171
+ mem = ctx.memhostalloc(32, mapped=True)
172
+ with self.check_ignored_exception(ctx):
173
+ del mem
174
+
175
+ def test_del_device_memory(self):
176
+ ctx = cuda.current_context()
177
+ mem = ctx.memalloc(32)
178
+ with self.check_ignored_exception(ctx):
179
+ del mem
180
+
181
+ def test_del_managed_memory(self):
182
+ ctx = cuda.current_context()
183
+ mem = ctx.memallocmanaged(32)
184
+ with self.check_ignored_exception(ctx):
185
+ del mem
186
+
187
+ def test_del_pinned_contextmanager(self):
188
+ # Check that temporarily pinned memory is unregistered immediately,
189
+ # such that it can be re-pinned at any time
190
+ class PinnedException(Exception):
191
+ pass
192
+
193
+ arr = np.zeros(1)
194
+ ctx = cuda.current_context()
195
+ ctx.deallocations.clear()
196
+ with self.check_ignored_exception(ctx):
197
+ with cuda.pinned(arr):
198
+ pass
199
+ with cuda.pinned(arr):
200
+ pass
201
+ # Should also work inside a `defer_cleanup` block
202
+ with cuda.defer_cleanup():
203
+ with cuda.pinned(arr):
204
+ pass
205
+ with cuda.pinned(arr):
206
+ pass
207
+ # Should also work when breaking out of the block due to an
208
+ # exception
209
+ try:
210
+ with cuda.pinned(arr):
211
+ raise PinnedException
212
+ except PinnedException:
213
+ with cuda.pinned(arr):
214
+ pass
215
+
216
+ def test_del_mapped_contextmanager(self):
217
+ # Check that temporarily mapped memory is unregistered immediately,
218
+ # such that it can be re-mapped at any time
219
+ class MappedException(Exception):
220
+ pass
221
+
222
+ arr = np.zeros(1)
223
+ ctx = cuda.current_context()
224
+ ctx.deallocations.clear()
225
+ with self.check_ignored_exception(ctx):
226
+ with cuda.mapped(arr):
227
+ pass
228
+ with cuda.mapped(arr):
229
+ pass
230
+ # Should also work inside a `defer_cleanup` block
231
+ with cuda.defer_cleanup():
232
+ with cuda.mapped(arr):
233
+ pass
234
+ with cuda.mapped(arr):
235
+ pass
236
+ # Should also work when breaking out of the block due to an
237
+ # exception
238
+ try:
239
+ with cuda.mapped(arr):
240
+ raise MappedException
241
+ except MappedException:
242
+ with cuda.mapped(arr):
243
+ pass
244
+
245
+
246
+ if __name__ == "__main__":
247
+ unittest.main()
@@ -0,0 +1,100 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import os
5
+ import sys
6
+ import subprocess
7
+ import threading
8
+ from numba import cuda
9
+ from numba.cuda.testing import (
10
+ unittest,
11
+ CUDATestCase,
12
+ skip_on_cudasim,
13
+ skip_under_cuda_memcheck,
14
+ )
15
+ from numba.cuda.tests.support import captured_stdout
16
+
17
+
18
+ class TestCudaDetect(CUDATestCase):
19
+ def test_cuda_detect(self):
20
+ # exercise the code path
21
+ with captured_stdout() as out:
22
+ cuda.detect()
23
+ output = out.getvalue()
24
+ self.assertIn("Found", output)
25
+ self.assertIn("CUDA devices", output)
26
+
27
+
28
+ class TestSupportedVersion(CUDATestCase):
29
+ def test_is_supported_version(self):
30
+ # Exercise the `cuda.is_supported_version()` API.
31
+ #
32
+ # Assume for the purpose of the test that we're running on a supported
33
+ # toolkit version; if not, there's not much point in running the test
34
+ # suite.
35
+ self.assertTrue(cuda.is_supported_version())
36
+
37
+
38
+ @skip_under_cuda_memcheck("Hangs cuda-memcheck")
39
+ class TestCUDAFindLibs(CUDATestCase):
40
+ def run_cmd(self, cmdline, env):
41
+ popen = subprocess.Popen(
42
+ cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env
43
+ )
44
+
45
+ # finish in 5 minutes or kill it
46
+ timeout = threading.Timer(5 * 60.0, popen.kill)
47
+ try:
48
+ timeout.start()
49
+ out, err = popen.communicate()
50
+ # the process should exit with an error
51
+ return out.decode(), err.decode()
52
+ finally:
53
+ timeout.cancel()
54
+ return None, None
55
+
56
+ def run_test_in_separate_process(self, envvar, envvar_value):
57
+ env_copy = os.environ.copy()
58
+ env_copy[envvar] = str(envvar_value)
59
+ code = """if 1:
60
+ from numba import cuda
61
+ @cuda.jit('(int64,)')
62
+ def kernel(x):
63
+ pass
64
+ kernel(1,)
65
+ """
66
+ cmdline = [sys.executable, "-c", code]
67
+ return self.run_cmd(cmdline, env_copy)
68
+
69
+ @skip_on_cudasim("Simulator does not hit device library search code path")
70
+ @unittest.skipIf(not sys.platform.startswith("linux"), "linux only")
71
+ def test_cuda_find_lib_errors(self):
72
+ """
73
+ This tests that driver discovery attempts to load from typical system
74
+ locations and fails gracefully if pointed at an invalid directory.
75
+ """
76
+ # one of these is likely to exist on linux, it's also unlikely that
77
+ # someone has extracted the contents of libdevice into here!
78
+ locs = ["lib", "lib64"]
79
+
80
+ looking_for = None
81
+ for l in locs:
82
+ looking_for = os.path.join(os.path.sep, l)
83
+ if os.path.exists(looking_for):
84
+ break
85
+
86
+ # This is the testing part, the test will only run if there's a valid
87
+ # path in which to look
88
+ if looking_for is not None:
89
+ # We no longer support NUMBA_CUDA_DRIVER. Still run the subprocess
90
+ # to ensure importing and a trivial kernel launch path work, but
91
+ # do not set any Numba-specific driver env vars.
92
+ out, err = self.run_test_in_separate_process(
93
+ "DUMMY_UNUSED", looking_for
94
+ )
95
+ self.assertTrue(out is not None)
96
+ self.assertTrue(err is not None)
97
+
98
+
99
+ if __name__ == "__main__":
100
+ unittest.main()
@@ -0,0 +1,198 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import ctypes
5
+ import numpy as np
6
+
7
+ from numba import cuda
8
+ from numba.cuda.core import config
9
+ from numba.cuda.testing import unittest, CUDATestCase, skip_on_cudasim
10
+ from numba.cuda.tests.support import linux_only
11
+
12
+ if not config.ENABLE_CUDASIM:
13
+
14
+ class DeviceOnlyEMMPlugin(cuda.HostOnlyCUDAMemoryManager):
15
+ """
16
+ Dummy EMM Plugin implementation for testing. It memorises which plugin
17
+ API methods have been called so that the tests can check that Numba
18
+ called into the plugin as expected.
19
+ """
20
+
21
+ def __init__(self, *args, **kwargs):
22
+ super().__init__(*args, **kwargs)
23
+
24
+ # For tracking our dummy allocations
25
+ self.allocations = {}
26
+ self.count = 0
27
+
28
+ # For tracking which methods have been called
29
+ self.initialized = False
30
+ self.memalloc_called = False
31
+ self.reset_called = False
32
+ self.get_memory_info_called = False
33
+ self.get_ipc_handle_called = False
34
+
35
+ def memalloc(self, size):
36
+ # We maintain a list of allocations and keep track of them, so that
37
+ # we can test that the finalizers of objects returned by memalloc
38
+ # get called.
39
+
40
+ # Numba should have initialized the memory manager when preparing
41
+ # the context for use, prior to any memalloc call.
42
+ if not self.initialized:
43
+ raise RuntimeError("memalloc called before initialize")
44
+ self.memalloc_called = True
45
+
46
+ # Create an allocation and record it
47
+ self.count += 1
48
+ alloc_count = self.count
49
+ self.allocations[alloc_count] = size
50
+
51
+ # The finalizer deletes the record from our internal dict of
52
+ # allocations.
53
+ finalizer_allocs = self.allocations
54
+
55
+ def finalizer():
56
+ del finalizer_allocs[alloc_count]
57
+
58
+ # We use an AutoFreePointer so that the finalizer will be run when
59
+ # the reference count drops to zero.
60
+ ptr = ctypes.c_void_p(alloc_count)
61
+ return cuda.cudadrv.driver.AutoFreePointer(
62
+ ptr, size, finalizer=finalizer
63
+ )
64
+
65
+ def initialize(self):
66
+ # No special initialization needed.
67
+ self.initialized = True
68
+
69
+ def reset(self):
70
+ # We remove all allocations on reset, just as a real EMM Plugin
71
+ # would do. Note that our finalizers in memalloc don't check
72
+ # whether the allocations are still alive, so running them after
73
+ # reset will detect any allocations that are floating around at
74
+ # exit time; however, the atexit finalizer for weakref will only
75
+ # print a traceback, not terminate the interpreter abnormally.
76
+ self.reset_called = True
77
+
78
+ def get_memory_info(self):
79
+ # Return some dummy memory information
80
+ self.get_memory_info_called = True
81
+ return cuda.MemoryInfo(free=32, total=64)
82
+
83
+ def get_ipc_handle(self, memory):
84
+ # The dummy IPC handle is only a string, so it is important that
85
+ # the tests don't try to do too much with it (e.g. open / close
86
+ # it).
87
+ self.get_ipc_handle_called = True
88
+ return "Dummy IPC handle for alloc %s" % memory.device_pointer_value
89
+
90
+ @property
91
+ def interface_version(self):
92
+ # The expected version for an EMM Plugin.
93
+ return 1
94
+
95
+ class BadVersionEMMPlugin(DeviceOnlyEMMPlugin):
96
+ """A plugin that claims to implement a different interface version"""
97
+
98
+ @property
99
+ def interface_version(self):
100
+ return 2
101
+
102
+
103
+ @skip_on_cudasim("EMM Plugins not supported on CUDA simulator")
104
+ class TestDeviceOnlyEMMPlugin(CUDATestCase):
105
+ """
106
+ Tests that the API of an EMM Plugin that implements device allocations
107
+ only is used correctly by Numba.
108
+ """
109
+
110
+ def setUp(self):
111
+ super().setUp()
112
+ # Always start afresh with a new context and memory manager
113
+ ctx = cuda.current_context()
114
+ ctx.reset()
115
+ self._initial_memory_manager = ctx.memory_manager
116
+ ctx.memory_manager = DeviceOnlyEMMPlugin(context=ctx)
117
+
118
+ def tearDown(self):
119
+ super().tearDown()
120
+ ctx = cuda.current_context()
121
+ ctx.reset()
122
+ ctx.memory_manager = self._initial_memory_manager
123
+
124
+ def test_memalloc(self):
125
+ mgr = cuda.current_context().memory_manager
126
+
127
+ # Allocate an array and check that memalloc was called with the correct
128
+ # size.
129
+ arr_1 = np.arange(10)
130
+ d_arr_1 = cuda.device_array_like(arr_1)
131
+ self.assertTrue(mgr.memalloc_called)
132
+
133
+ self.assertEqual(mgr.count, 1)
134
+ self.assertEqual(mgr.allocations[1], arr_1.nbytes)
135
+
136
+ # Allocate again, with a different size, and check that it is also
137
+ # correct.
138
+ arr_2 = np.arange(5)
139
+ d_arr_2 = cuda.device_array_like(arr_2)
140
+ self.assertEqual(mgr.count, 2)
141
+ self.assertEqual(mgr.allocations[2], arr_2.nbytes)
142
+
143
+ # Remove the first array, and check that our finalizer was called for
144
+ # the first array only.
145
+ del d_arr_1
146
+ self.assertNotIn(1, mgr.allocations)
147
+ self.assertIn(2, mgr.allocations)
148
+
149
+ # Remove the second array and check that its finalizer was also
150
+ # called.
151
+ del d_arr_2
152
+ self.assertNotIn(2, mgr.allocations)
153
+
154
+ def test_initialized_in_context(self):
155
+ # If we have a CUDA context, it should already have initialized its
156
+ # memory manager.
157
+ self.assertTrue(cuda.current_context().memory_manager.initialized)
158
+
159
+ def test_reset(self):
160
+ ctx = cuda.current_context()
161
+ ctx.reset()
162
+ self.assertTrue(ctx.memory_manager.reset_called)
163
+
164
+ def test_get_memory_info(self):
165
+ ctx = cuda.current_context()
166
+ meminfo = ctx.get_memory_info()
167
+ self.assertTrue(ctx.memory_manager.get_memory_info_called)
168
+ self.assertEqual(meminfo.free, 32)
169
+ self.assertEqual(meminfo.total, 64)
170
+
171
+ @linux_only
172
+ def test_get_ipc_handle(self):
173
+ # We don't attempt to close the IPC handle in this test because Numba
174
+ # will be expecting a real IpcHandle object to have been returned from
175
+ # get_ipc_handle, and it would cause problems to do so.
176
+ arr = np.arange(2)
177
+ d_arr = cuda.device_array_like(arr)
178
+ ipch = d_arr.get_ipc_handle()
179
+ ctx = cuda.current_context()
180
+ self.assertTrue(ctx.memory_manager.get_ipc_handle_called)
181
+ self.assertIn("Dummy IPC handle for alloc 1", ipch._ipc_handle)
182
+
183
+
184
+ @skip_on_cudasim("EMM Plugins not supported on CUDA simulator")
185
+ class TestBadEMMPluginVersion(CUDATestCase):
186
+ """
187
+ Ensure that Numba rejects EMM Plugins with incompatible version
188
+ numbers.
189
+ """
190
+
191
+ def test_bad_plugin_version(self):
192
+ with self.assertRaises(RuntimeError) as raises:
193
+ cuda.set_memory_manager(BadVersionEMMPlugin)
194
+ self.assertIn("version 1 required", str(raises.exception))
195
+
196
+
197
+ if __name__ == "__main__":
198
+ unittest.main()
@@ -0,0 +1,53 @@
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
+ from cuda.core.experimental import Device
8
+ from numba.cuda.testing import skip_on_cudasim
9
+
10
+
11
+ class TestCudaEvent(CUDATestCase):
12
+ def test_event_elapsed(self):
13
+ N = 32
14
+ dary = cuda.device_array(N, dtype=np.double)
15
+ evtstart = cuda.event()
16
+ evtend = cuda.event()
17
+
18
+ evtstart.record()
19
+ cuda.to_device(np.arange(N, dtype=np.double), to=dary)
20
+ evtend.record()
21
+ evtend.wait()
22
+ evtend.synchronize()
23
+ # Exercise the code path
24
+ evtstart.elapsed_time(evtend)
25
+
26
+ def test_event_elapsed_stream(self):
27
+ stream = cuda.stream()
28
+ self.event_elapsed_inner(stream)
29
+
30
+ @skip_on_cudasim("Testing cuda.core events requires driver")
31
+ def test_event_elapsed_cuda_core_stream(self):
32
+ dev = Device()
33
+ dev.set_current()
34
+ stream = dev.create_stream()
35
+ self.event_elapsed_inner(stream)
36
+
37
+ def event_elapsed_inner(self, stream):
38
+ N = 32
39
+ dary = cuda.device_array(N, dtype=np.double)
40
+ evtstart = cuda.event()
41
+ evtend = cuda.event()
42
+
43
+ evtstart.record(stream=stream)
44
+ cuda.to_device(np.arange(N, dtype=np.double), to=dary, stream=stream)
45
+ evtend.record(stream=stream)
46
+ evtend.wait(stream=stream)
47
+ evtend.synchronize()
48
+ # Exercise the code path
49
+ evtstart.elapsed_time(evtend)
50
+
51
+
52
+ if __name__ == "__main__":
53
+ unittest.main()
@@ -0,0 +1,72 @@
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.cuda.cudadrv import driver
6
+ from numba import cuda
7
+ from numba.cuda.testing import unittest, CUDATestCase
8
+
9
+
10
+ class TestHostAlloc(CUDATestCase):
11
+ def tearDown(self):
12
+ cuda.current_context().reset()
13
+
14
+ def test_host_alloc_driver(self):
15
+ n = 32
16
+ mem = cuda.current_context().memhostalloc(n, mapped=True)
17
+
18
+ dtype = np.dtype(np.uint8)
19
+ ary = np.ndarray(shape=n // dtype.itemsize, dtype=dtype, buffer=mem)
20
+
21
+ magic = 0xAB
22
+ driver.device_memset(mem, magic, n)
23
+
24
+ self.assertTrue(np.all(ary == magic))
25
+
26
+ ary.fill(n)
27
+
28
+ recv = np.empty_like(ary)
29
+
30
+ driver.device_to_host(recv, mem, ary.size)
31
+
32
+ self.assertTrue(np.all(ary == recv))
33
+ self.assertTrue(np.all(recv == n))
34
+
35
+ def test_host_alloc_pinned(self):
36
+ ary = cuda.pinned_array(10, dtype=np.uint32)
37
+ ary.fill(123)
38
+ self.assertTrue(all(ary == 123))
39
+ devary = cuda.to_device(ary)
40
+ driver.device_memset(devary, 0, driver.device_memory_size(devary))
41
+ self.assertTrue(all(ary == 123))
42
+ devary.copy_to_host(ary)
43
+ self.assertTrue(all(ary == 0))
44
+
45
+ def test_host_alloc_mapped(self):
46
+ ary = cuda.mapped_array(10, dtype=np.uint32)
47
+ ary.fill(123)
48
+ self.assertTrue(all(ary == 123))
49
+ driver.device_memset(ary, 0, driver.device_memory_size(ary))
50
+ self.assertTrue(all(ary == 0))
51
+ self.assertTrue(sum(ary != 0) == 0)
52
+
53
+ def test_host_operators(self):
54
+ for ary in [
55
+ cuda.mapped_array(10, dtype=np.uint32),
56
+ cuda.pinned_array(10, dtype=np.uint32),
57
+ ]:
58
+ ary[:] = range(10)
59
+ self.assertTrue(sum(ary + 1) == 55)
60
+ self.assertTrue(sum((ary + 1) * 2 - 1) == 100)
61
+ self.assertTrue(sum(ary < 5) == 5)
62
+ self.assertTrue(sum(ary <= 5) == 6)
63
+ self.assertTrue(sum(ary > 6) == 3)
64
+ self.assertTrue(sum(ary >= 6) == 4)
65
+ self.assertTrue(sum(ary**2) == 285)
66
+ self.assertTrue(sum(ary // 2) == 20)
67
+ self.assertTrue(sum(ary / 2.0) == 22.5)
68
+ self.assertTrue(sum(ary % 2) == 5)
69
+
70
+
71
+ if __name__ == "__main__":
72
+ unittest.main()