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,370 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import math
5
+ import itertools
6
+
7
+ import numpy as np
8
+
9
+ from numba.cuda.testing import unittest, CUDATestCase
10
+ from numba.cuda import types
11
+ from numba import cuda
12
+ from numba.cuda.tests.cudapy.complex_usecases import (
13
+ real_usecase,
14
+ imag_usecase,
15
+ conjugate_usecase,
16
+ phase_usecase,
17
+ polar_as_complex_usecase,
18
+ rect_usecase,
19
+ isnan_usecase,
20
+ isinf_usecase,
21
+ isfinite_usecase,
22
+ exp_usecase,
23
+ log_usecase,
24
+ log_base_usecase,
25
+ log10_usecase,
26
+ sqrt_usecase,
27
+ asin_usecase,
28
+ acos_usecase,
29
+ atan_usecase,
30
+ cos_usecase,
31
+ sin_usecase,
32
+ tan_usecase,
33
+ acosh_usecase,
34
+ asinh_usecase,
35
+ atanh_usecase,
36
+ cosh_usecase,
37
+ sinh_usecase,
38
+ tanh_usecase,
39
+ )
40
+ from numba.cuda.np import numpy_support
41
+
42
+
43
+ def compile_scalar_func(pyfunc, argtypes, restype):
44
+ # First compile a scalar device function
45
+ assert not any(isinstance(tp, types.Array) for tp in argtypes)
46
+ assert not isinstance(restype, types.Array)
47
+ device_func = cuda.jit(restype(*argtypes), device=True)(pyfunc)
48
+
49
+ kernel_types = [
50
+ types.Array(tp, 1, "C") for tp in [restype] + list(argtypes)
51
+ ]
52
+
53
+ if len(argtypes) == 1:
54
+
55
+ def kernel_func(out, a):
56
+ i = cuda.grid(1)
57
+ if i < out.shape[0]:
58
+ out[i] = device_func(a[i])
59
+ elif len(argtypes) == 2:
60
+
61
+ def kernel_func(out, a, b):
62
+ i = cuda.grid(1)
63
+ if i < out.shape[0]:
64
+ out[i] = device_func(a[i], b[i])
65
+ else:
66
+ assert 0
67
+
68
+ kernel = cuda.jit(tuple(kernel_types))(kernel_func)
69
+
70
+ def kernel_wrapper(values):
71
+ n = len(values)
72
+ inputs = [
73
+ np.empty(n, dtype=numpy_support.as_dtype(tp)) for tp in argtypes
74
+ ]
75
+ output = np.empty(n, dtype=numpy_support.as_dtype(restype))
76
+ for i, vs in enumerate(values):
77
+ for v, inp in zip(vs, inputs):
78
+ inp[i] = v
79
+ args = [output] + inputs
80
+ kernel[int(math.ceil(n / 256)), 256](*args)
81
+ return list(output)
82
+
83
+ return kernel_wrapper
84
+
85
+
86
+ class BaseComplexTest(CUDATestCase):
87
+ def basic_values(self):
88
+ reals = [
89
+ -0.0,
90
+ +0.0,
91
+ 1,
92
+ -1,
93
+ +1.5,
94
+ -3.5,
95
+ float("-inf"),
96
+ float("+inf"),
97
+ float("nan"),
98
+ ]
99
+ return [complex(x, y) for x, y in itertools.product(reals, reals)]
100
+
101
+ def more_values(self):
102
+ reals = [
103
+ 0.0,
104
+ +0.0,
105
+ 1,
106
+ -1,
107
+ -math.pi,
108
+ +math.pi,
109
+ float("-inf"),
110
+ float("+inf"),
111
+ float("nan"),
112
+ ]
113
+ return [complex(x, y) for x, y in itertools.product(reals, reals)]
114
+
115
+ def non_nan_values(self):
116
+ reals = [
117
+ -0.0,
118
+ +0.0,
119
+ 1,
120
+ -1,
121
+ -math.pi,
122
+ +math.pi,
123
+ float("inf"),
124
+ float("-inf"),
125
+ ]
126
+ return [complex(x, y) for x, y in itertools.product(reals, reals)]
127
+
128
+ def run_func(self, pyfunc, sigs, values, ulps=1, ignore_sign_on_zero=False):
129
+ for sig in sigs:
130
+ if isinstance(sig, types.Type):
131
+ sig = (sig,)
132
+ if isinstance(sig, tuple):
133
+ # Assume return type is the type of first argument
134
+ sig = sig[0](*sig)
135
+ prec = (
136
+ "single"
137
+ if sig.args[0] in (types.float32, types.complex64)
138
+ else "double"
139
+ )
140
+ cudafunc = compile_scalar_func(pyfunc, sig.args, sig.return_type)
141
+ ok_values = []
142
+ expected_list = []
143
+ for args in values:
144
+ if not isinstance(args, (list, tuple)):
145
+ args = (args,)
146
+ try:
147
+ expected_list.append(pyfunc(*args))
148
+ ok_values.append(args)
149
+ except ValueError as e:
150
+ self.assertIn("math domain error", str(e))
151
+ continue
152
+ got_list = cudafunc(ok_values)
153
+ for got, expected, args in zip(got_list, expected_list, ok_values):
154
+ msg = "for input %r with prec %r" % (args, prec)
155
+ self.assertPreciseEqual(
156
+ got,
157
+ expected,
158
+ prec=prec,
159
+ ulps=ulps,
160
+ ignore_sign_on_zero=ignore_sign_on_zero,
161
+ msg=msg,
162
+ )
163
+
164
+ run_unary = run_func
165
+ run_binary = run_func
166
+
167
+
168
+ class TestComplex(BaseComplexTest):
169
+ def check_real_image(self, pyfunc):
170
+ values = self.basic_values()
171
+ self.run_unary(
172
+ pyfunc,
173
+ [
174
+ tp.underlying_float(tp)
175
+ for tp in (types.complex64, types.complex128)
176
+ ],
177
+ values,
178
+ )
179
+
180
+ def test_real(self):
181
+ self.check_real_image(real_usecase)
182
+
183
+ def test_imag(self):
184
+ self.check_real_image(imag_usecase)
185
+
186
+ def test_conjugate(self):
187
+ pyfunc = conjugate_usecase
188
+ values = self.basic_values()
189
+ self.run_unary(pyfunc, [types.complex64, types.complex128], values)
190
+
191
+
192
+ class TestCMath(BaseComplexTest):
193
+ """
194
+ Tests for cmath module support.
195
+ """
196
+
197
+ def check_predicate_func(self, pyfunc):
198
+ self.run_unary(
199
+ pyfunc,
200
+ [types.boolean(tp) for tp in (types.complex128, types.complex64)],
201
+ self.basic_values(),
202
+ )
203
+
204
+ def check_unary_func(
205
+ self,
206
+ pyfunc,
207
+ ulps=1,
208
+ values=None,
209
+ returns_float=False,
210
+ ignore_sign_on_zero=False,
211
+ ):
212
+ if returns_float:
213
+
214
+ def sig(tp):
215
+ return tp.underlying_float(tp)
216
+ else:
217
+
218
+ def sig(tp):
219
+ return tp(tp)
220
+
221
+ self.run_unary(
222
+ pyfunc,
223
+ [sig(types.complex128)],
224
+ values or self.more_values(),
225
+ ulps=ulps,
226
+ ignore_sign_on_zero=ignore_sign_on_zero,
227
+ )
228
+ # Avoid discontinuities around pi when in single precision.
229
+ self.run_unary(
230
+ pyfunc,
231
+ [sig(types.complex64)],
232
+ values or self.basic_values(),
233
+ ulps=ulps,
234
+ ignore_sign_on_zero=ignore_sign_on_zero,
235
+ )
236
+
237
+ # Conversions
238
+
239
+ def test_phase(self):
240
+ self.check_unary_func(phase_usecase, returns_float=True)
241
+
242
+ def test_polar(self):
243
+ self.check_unary_func(polar_as_complex_usecase)
244
+
245
+ def test_rect(self):
246
+ def do_test(tp, seed_values):
247
+ values = [
248
+ (z.real, z.imag)
249
+ for z in seed_values
250
+ if not math.isinf(z.imag) or z.real == 0
251
+ ]
252
+ float_type = tp.underlying_float
253
+ self.run_binary(rect_usecase, [tp(float_type, float_type)], values)
254
+
255
+ do_test(types.complex128, self.more_values())
256
+ # Avoid discontinuities around pi when in single precision.
257
+ do_test(types.complex64, self.basic_values())
258
+
259
+ # Classification
260
+
261
+ def test_isnan(self):
262
+ self.check_predicate_func(isnan_usecase)
263
+
264
+ def test_isinf(self):
265
+ self.check_predicate_func(isinf_usecase)
266
+
267
+ def test_isfinite(self):
268
+ self.check_predicate_func(isfinite_usecase)
269
+
270
+ # Power and logarithms
271
+
272
+ def test_exp(self):
273
+ self.check_unary_func(exp_usecase, ulps=2)
274
+
275
+ def test_log(self):
276
+ self.check_unary_func(log_usecase)
277
+
278
+ def test_log_base(self):
279
+ values = list(itertools.product(self.more_values(), self.more_values()))
280
+ value_types = [
281
+ (types.complex128, types.complex128),
282
+ (types.complex64, types.complex64),
283
+ ]
284
+ self.run_binary(log_base_usecase, value_types, values, ulps=3)
285
+
286
+ def test_log10(self):
287
+ self.check_unary_func(log10_usecase)
288
+
289
+ def test_sqrt(self):
290
+ self.check_unary_func(sqrt_usecase)
291
+
292
+ # Trigonometric functions
293
+
294
+ def test_acos(self):
295
+ self.check_unary_func(acos_usecase, ulps=2)
296
+
297
+ def test_asin(self):
298
+ self.check_unary_func(asin_usecase, ulps=2)
299
+
300
+ def test_atan(self):
301
+ self.check_unary_func(
302
+ atan_usecase, ulps=2, values=self.non_nan_values()
303
+ )
304
+
305
+ def test_cos(self):
306
+ self.check_unary_func(cos_usecase, ulps=2)
307
+
308
+ def test_sin(self):
309
+ # See test_sinh.
310
+ self.check_unary_func(sin_usecase, ulps=2)
311
+
312
+ def test_tan(self):
313
+ self.check_unary_func(tan_usecase, ulps=2, ignore_sign_on_zero=True)
314
+
315
+ # Hyperbolic functions
316
+
317
+ def test_acosh(self):
318
+ self.check_unary_func(acosh_usecase)
319
+
320
+ def test_asinh(self):
321
+ self.check_unary_func(asinh_usecase, ulps=2)
322
+
323
+ def test_atanh(self):
324
+ self.check_unary_func(atanh_usecase, ulps=2, ignore_sign_on_zero=True)
325
+
326
+ def test_cosh(self):
327
+ self.check_unary_func(cosh_usecase, ulps=2)
328
+
329
+ def test_sinh(self):
330
+ self.check_unary_func(sinh_usecase, ulps=2)
331
+
332
+ def test_tanh(self):
333
+ self.check_unary_func(tanh_usecase, ulps=2, ignore_sign_on_zero=True)
334
+
335
+
336
+ class TestAtomicOnComplexComponents(CUDATestCase):
337
+ # Based on the reproducer from Issue #8309. array.real and array.imag could
338
+ # not be used because they required returning an array from a generated
339
+ # function, and even if this was permitted, they could not be resolved from
340
+ # the atomic lowering when they were overloads.
341
+ #
342
+ # See https://github.com/numba/numba/issues/8309
343
+
344
+ def test_atomic_on_real(self):
345
+ @cuda.jit
346
+ def atomic_add_one(values):
347
+ i = cuda.grid(1)
348
+ cuda.atomic.add(values.real, i, 1)
349
+
350
+ N = 32
351
+ arr1 = np.arange(N) + np.arange(N) * 1j
352
+ arr2 = arr1.copy()
353
+ atomic_add_one[1, N](arr2)
354
+ np.testing.assert_equal(arr1 + 1, arr2)
355
+
356
+ def test_atomic_on_imag(self):
357
+ @cuda.jit
358
+ def atomic_add_one_j(values):
359
+ i = cuda.grid(1)
360
+ cuda.atomic.add(values.imag, i, 1)
361
+
362
+ N = 32
363
+ arr1 = np.arange(N) + np.arange(N) * 1j
364
+ arr2 = arr1.copy()
365
+ atomic_add_one_j[1, N](arr2)
366
+ np.testing.assert_equal(arr1 + 1j, arr2)
367
+
368
+
369
+ if __name__ == "__main__":
370
+ unittest.main()
@@ -0,0 +1,23 @@
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 TestCudaComplex(CUDATestCase):
10
+ def test_cuda_complex_arg(self):
11
+ @cuda.jit("void(complex128[:], complex128)")
12
+ def foo(a, b):
13
+ i = cuda.grid(1)
14
+ a[i] += b
15
+
16
+ a = np.arange(5, dtype=np.complex128)
17
+ a0 = a.copy()
18
+ foo[1, a.shape](a, 2j)
19
+ self.assertTrue(np.allclose(a, a0 + 2j))
20
+
21
+
22
+ if __name__ == "__main__":
23
+ unittest.main()
@@ -0,0 +1,142 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ import re
5
+ import numpy as np
6
+ from numba import cuda
7
+ from numba.cuda.testing import unittest, skip_on_cudasim, CUDATestCase
8
+ from llvmlite import ir
9
+
10
+
11
+ @skip_on_cudasim("This is testing CUDA backend code generation")
12
+ class TestConstStringCodegen(unittest.TestCase):
13
+ def test_const_string(self):
14
+ # These imports are incompatible with CUDASIM
15
+ from numba.cuda.descriptor import cuda_target
16
+ from numba.cuda.cudadrv.nvvm import compile_ir
17
+
18
+ targetctx = cuda_target.target_context
19
+ mod = targetctx.create_module("")
20
+ textstring = "A Little Brown Fox"
21
+ gv0 = targetctx.insert_const_string(mod, textstring)
22
+ # Insert the same const string a second time - the first should be
23
+ # reused.
24
+ targetctx.insert_const_string(mod, textstring)
25
+
26
+ res = re.findall(
27
+ r"@\"__conststring__.*internal.*constant.*\["
28
+ r"19\s+x\s+i8\]",
29
+ str(mod),
30
+ )
31
+ # Ensure that the const string was only inserted once
32
+ self.assertEqual(len(res), 1)
33
+
34
+ fnty = ir.FunctionType(ir.IntType(8).as_pointer(), [])
35
+
36
+ # Using insert_const_string
37
+ fn = ir.Function(mod, fnty, "test_insert_const_string")
38
+ builder = ir.IRBuilder(fn.append_basic_block())
39
+ res = builder.addrspacecast(
40
+ gv0, ir.PointerType(ir.IntType(8)), "generic"
41
+ )
42
+ builder.ret(res)
43
+
44
+ matches = re.findall(
45
+ r"@\"__conststring__.*internal.*constant.*\["
46
+ r"19\s+x\s+i8\]",
47
+ str(mod),
48
+ )
49
+ self.assertEqual(len(matches), 1)
50
+
51
+ # Using insert_string_const_addrspace
52
+ fn = ir.Function(mod, fnty, "test_insert_string_const_addrspace")
53
+ builder = ir.IRBuilder(fn.append_basic_block())
54
+ res = targetctx.insert_string_const_addrspace(builder, textstring)
55
+ builder.ret(res)
56
+
57
+ matches = re.findall(
58
+ r"@\"__conststring__.*internal.*constant.*\["
59
+ r"19\s+x\s+i8\]",
60
+ str(mod),
61
+ )
62
+ self.assertEqual(len(matches), 1)
63
+
64
+ ptx = compile_ir(str(mod)).decode("ascii")
65
+ matches = list(re.findall(r"\.const.*__conststring__", ptx))
66
+
67
+ self.assertEqual(len(matches), 1)
68
+
69
+
70
+ # Inspired by the reproducer from Issue #7041.
71
+ class TestConstString(CUDATestCase):
72
+ def test_assign_const_unicode_string(self):
73
+ @cuda.jit
74
+ def str_assign(arr):
75
+ i = cuda.grid(1)
76
+ if i < len(arr):
77
+ arr[i] = "XYZ"
78
+
79
+ n_strings = 8
80
+ arr = np.zeros(n_strings + 1, dtype="<U12")
81
+ str_assign[1, n_strings](arr)
82
+
83
+ # Expected result, e.g.:
84
+ # ['XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' '']
85
+ expected = np.zeros_like(arr)
86
+ expected[:-1] = "XYZ"
87
+ expected[-1] = ""
88
+ np.testing.assert_equal(arr, expected)
89
+
90
+ def test_assign_const_byte_string(self):
91
+ @cuda.jit
92
+ def bytes_assign(arr):
93
+ i = cuda.grid(1)
94
+ if i < len(arr):
95
+ arr[i] = b"XYZ"
96
+
97
+ n_strings = 8
98
+ arr = np.zeros(n_strings + 1, dtype="S12")
99
+ bytes_assign[1, n_strings](arr)
100
+
101
+ # Expected result, e.g.:
102
+ # [b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'']
103
+ expected = np.zeros_like(arr)
104
+ expected[:-1] = b"XYZ"
105
+ expected[-1] = b""
106
+ np.testing.assert_equal(arr, expected)
107
+
108
+ def test_assign_const_string_in_record(self):
109
+ @cuda.jit
110
+ def f(a):
111
+ a[0]["x"] = 1
112
+ a[0]["y"] = "ABC"
113
+ a[1]["x"] = 2
114
+ a[1]["y"] = "XYZ"
115
+
116
+ dt = np.dtype([("x", np.int32), ("y", np.dtype("<U12"))])
117
+ a = np.zeros(2, dt)
118
+
119
+ f[1, 1](a)
120
+
121
+ reference = np.asarray([(1, "ABC"), (2, "XYZ")], dtype=dt)
122
+ np.testing.assert_array_equal(reference, a)
123
+
124
+ def test_assign_const_bytes_in_record(self):
125
+ @cuda.jit
126
+ def f(a):
127
+ a[0]["x"] = 1
128
+ a[0]["y"] = b"ABC"
129
+ a[1]["x"] = 2
130
+ a[1]["y"] = b"XYZ"
131
+
132
+ dt = np.dtype([("x", np.float32), ("y", np.dtype("S12"))])
133
+ a = np.zeros(2, dt)
134
+
135
+ f[1, 1](a)
136
+
137
+ reference = np.asarray([(1, b"ABC"), (2, b"XYZ")], dtype=dt)
138
+ np.testing.assert_array_equal(reference, a)
139
+
140
+
141
+ if __name__ == "__main__":
142
+ unittest.main()
@@ -0,0 +1,178 @@
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
+
6
+ from numba import cuda
7
+ from numba.cuda import complex64, int32, float64
8
+ from numba.cuda.testing import unittest, CUDATestCase
9
+ from numba.cuda.core.config import ENABLE_CUDASIM
10
+
11
+ CONST_EMPTY = np.array([])
12
+ CONST1D = np.arange(10, dtype=np.float64) / 2.0
13
+ CONST2D = np.asfortranarray(np.arange(100, dtype=np.int32).reshape(10, 10))
14
+ CONST3D = (np.arange(5 * 5 * 5, dtype=np.complex64).reshape(5, 5, 5) + 1j) / 2j
15
+ CONST3BYTES = np.arange(3, dtype=np.uint8)
16
+
17
+ CONST_RECORD_EMPTY = np.array([], dtype=[("x", float), ("y", int)])
18
+ CONST_RECORD = np.array([(1.0, 2), (3.0, 4)], dtype=[("x", float), ("y", int)])
19
+ CONST_RECORD_ALIGN = np.array(
20
+ [(1, 2, 3, 0xDEADBEEF, 8), (4, 5, 6, 0xBEEFDEAD, 10)],
21
+ dtype=np.dtype(
22
+ dtype=[
23
+ ("a", np.uint8),
24
+ ("b", np.uint8),
25
+ ("x", np.uint8),
26
+ ("y", np.uint32),
27
+ ("z", np.uint8),
28
+ ],
29
+ align=True,
30
+ ),
31
+ )
32
+
33
+
34
+ def cuconstEmpty(A):
35
+ C = cuda.const.array_like(CONST_EMPTY)
36
+ i = cuda.grid(1)
37
+ A[i] = len(C)
38
+
39
+
40
+ def cuconst(A):
41
+ C = cuda.const.array_like(CONST1D)
42
+ i = cuda.grid(1)
43
+
44
+ # +1 or it'll be loaded & stored as a u32
45
+ A[i] = C[i] + 1.0
46
+
47
+
48
+ def cuconst2d(A):
49
+ C = cuda.const.array_like(CONST2D)
50
+ i, j = cuda.grid(2)
51
+ A[i, j] = C[i, j]
52
+
53
+
54
+ def cuconst3d(A):
55
+ C = cuda.const.array_like(CONST3D)
56
+ i = cuda.threadIdx.x
57
+ j = cuda.threadIdx.y
58
+ k = cuda.threadIdx.z
59
+ A[i, j, k] = C[i, j, k]
60
+
61
+
62
+ def cuconstRecEmpty(A):
63
+ C = cuda.const.array_like(CONST_RECORD_EMPTY)
64
+ i = cuda.grid(1)
65
+ A[i] = len(C)
66
+
67
+
68
+ def cuconstRec(A, B):
69
+ C = cuda.const.array_like(CONST_RECORD)
70
+ i = cuda.grid(1)
71
+ A[i] = C[i]["x"]
72
+ B[i] = C[i]["y"]
73
+
74
+
75
+ def cuconstRecAlign(A, B, C, D, E):
76
+ Z = cuda.const.array_like(CONST_RECORD_ALIGN)
77
+ i = cuda.grid(1)
78
+ A[i] = Z[i]["a"]
79
+ B[i] = Z[i]["b"]
80
+ C[i] = Z[i]["x"]
81
+ D[i] = Z[i]["y"]
82
+ E[i] = Z[i]["z"]
83
+
84
+
85
+ def cuconstAlign(z):
86
+ a = cuda.const.array_like(CONST3BYTES)
87
+ b = cuda.const.array_like(CONST1D)
88
+ i = cuda.grid(1)
89
+ z[i] = a[i] + b[i]
90
+
91
+
92
+ class TestCudaConstantMemory(CUDATestCase):
93
+ def test_const_array(self):
94
+ sig = (float64[:],)
95
+ jcuconst = cuda.jit(sig)(cuconst)
96
+ A = np.zeros_like(CONST1D)
97
+ jcuconst[2, 5](A)
98
+ self.assertTrue(np.all(A == CONST1D + 1))
99
+
100
+ if not ENABLE_CUDASIM:
101
+ self.assertRegex(
102
+ jcuconst.inspect_asm(sig),
103
+ r"ld\.const\.[bf]64",
104
+ "load as a 64-bit value",
105
+ )
106
+
107
+ def test_const_empty(self):
108
+ jcuconstEmpty = cuda.jit("void(int64[:])")(cuconstEmpty)
109
+ A = np.full(1, fill_value=-1, dtype=np.int64)
110
+ jcuconstEmpty[1, 1](A)
111
+ self.assertTrue(np.all(A == 0))
112
+
113
+ def test_const_align(self):
114
+ jcuconstAlign = cuda.jit("void(float64[:])")(cuconstAlign)
115
+ A = np.full(3, fill_value=np.nan, dtype=float)
116
+ jcuconstAlign[1, 3](A)
117
+ self.assertTrue(np.all(A == (CONST3BYTES + CONST1D[:3])))
118
+
119
+ def test_const_array_2d(self):
120
+ sig = (int32[:, :],)
121
+ jcuconst2d = cuda.jit(sig)(cuconst2d)
122
+ A = np.zeros_like(CONST2D, order="C")
123
+ jcuconst2d[(2, 2), (5, 5)](A)
124
+ self.assertTrue(np.all(A == CONST2D))
125
+
126
+ if not ENABLE_CUDASIM:
127
+ self.assertRegex(
128
+ jcuconst2d.inspect_asm(sig),
129
+ r"ld\.const\.[bu]32",
130
+ "load as a 32-bit value",
131
+ )
132
+
133
+ def test_const_array_3d(self):
134
+ sig = (complex64[:, :, :],)
135
+ jcuconst3d = cuda.jit(sig)(cuconst3d)
136
+ A = np.zeros_like(CONST3D, order="F")
137
+ jcuconst3d[1, (5, 5, 5)](A)
138
+ self.assertTrue(np.all(A == CONST3D))
139
+
140
+ if not ENABLE_CUDASIM:
141
+ asm = jcuconst3d.inspect_asm(sig)
142
+ complex_load = r"ld\.const\.v2\.[bf]32"
143
+ description = "Load the complex as a vector of 2x 32-bits"
144
+ self.assertRegex(asm, complex_load, description)
145
+
146
+ def test_const_record_empty(self):
147
+ jcuconstRecEmpty = cuda.jit("void(int64[:])")(cuconstRecEmpty)
148
+ A = np.full(1, fill_value=-1, dtype=np.int64)
149
+ jcuconstRecEmpty[1, 1](A)
150
+ self.assertTrue(np.all(A == 0))
151
+
152
+ def test_const_record(self):
153
+ A = np.zeros(2, dtype=float)
154
+ B = np.zeros(2, dtype=int)
155
+ jcuconst = cuda.jit(cuconstRec).specialize(A, B)
156
+
157
+ jcuconst[2, 1](A, B)
158
+ np.testing.assert_allclose(A, CONST_RECORD["x"])
159
+ np.testing.assert_allclose(B, CONST_RECORD["y"])
160
+
161
+ def test_const_record_align(self):
162
+ A = np.zeros(2, dtype=np.float64)
163
+ B = np.zeros(2, dtype=np.float64)
164
+ C = np.zeros(2, dtype=np.float64)
165
+ D = np.zeros(2, dtype=np.float64)
166
+ E = np.zeros(2, dtype=np.float64)
167
+ jcuconst = cuda.jit(cuconstRecAlign).specialize(A, B, C, D, E)
168
+
169
+ jcuconst[2, 1](A, B, C, D, E)
170
+ np.testing.assert_allclose(A, CONST_RECORD_ALIGN["a"])
171
+ np.testing.assert_allclose(B, CONST_RECORD_ALIGN["b"])
172
+ np.testing.assert_allclose(C, CONST_RECORD_ALIGN["x"])
173
+ np.testing.assert_allclose(D, CONST_RECORD_ALIGN["y"])
174
+ np.testing.assert_allclose(E, CONST_RECORD_ALIGN["z"])
175
+
176
+
177
+ if __name__ == "__main__":
178
+ unittest.main()