numba-cuda 0.0.1__py3-none-any.whl → 0.0.13__py3-none-any.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 (233) hide show
  1. _numba_cuda_redirector.pth +1 -0
  2. _numba_cuda_redirector.py +74 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +5 -0
  5. numba_cuda/_version.py +19 -0
  6. numba_cuda/numba/cuda/__init__.py +22 -0
  7. numba_cuda/numba/cuda/api.py +526 -0
  8. numba_cuda/numba/cuda/api_util.py +30 -0
  9. numba_cuda/numba/cuda/args.py +77 -0
  10. numba_cuda/numba/cuda/cg.py +62 -0
  11. numba_cuda/numba/cuda/codegen.py +378 -0
  12. numba_cuda/numba/cuda/compiler.py +422 -0
  13. numba_cuda/numba/cuda/cpp_function_wrappers.cu +47 -0
  14. numba_cuda/numba/cuda/cuda_fp16.h +3631 -0
  15. numba_cuda/numba/cuda/cuda_fp16.hpp +2465 -0
  16. numba_cuda/numba/cuda/cuda_paths.py +258 -0
  17. numba_cuda/numba/cuda/cudadecl.py +806 -0
  18. numba_cuda/numba/cuda/cudadrv/__init__.py +9 -0
  19. numba_cuda/numba/cuda/cudadrv/devicearray.py +904 -0
  20. numba_cuda/numba/cuda/cudadrv/devices.py +248 -0
  21. numba_cuda/numba/cuda/cudadrv/driver.py +3201 -0
  22. numba_cuda/numba/cuda/cudadrv/drvapi.py +398 -0
  23. numba_cuda/numba/cuda/cudadrv/dummyarray.py +452 -0
  24. numba_cuda/numba/cuda/cudadrv/enums.py +607 -0
  25. numba_cuda/numba/cuda/cudadrv/error.py +36 -0
  26. numba_cuda/numba/cuda/cudadrv/libs.py +176 -0
  27. numba_cuda/numba/cuda/cudadrv/ndarray.py +20 -0
  28. numba_cuda/numba/cuda/cudadrv/nvrtc.py +260 -0
  29. numba_cuda/numba/cuda/cudadrv/nvvm.py +707 -0
  30. numba_cuda/numba/cuda/cudadrv/rtapi.py +10 -0
  31. numba_cuda/numba/cuda/cudadrv/runtime.py +142 -0
  32. numba_cuda/numba/cuda/cudaimpl.py +1055 -0
  33. numba_cuda/numba/cuda/cudamath.py +140 -0
  34. numba_cuda/numba/cuda/decorators.py +189 -0
  35. numba_cuda/numba/cuda/descriptor.py +33 -0
  36. numba_cuda/numba/cuda/device_init.py +89 -0
  37. numba_cuda/numba/cuda/deviceufunc.py +908 -0
  38. numba_cuda/numba/cuda/dispatcher.py +1057 -0
  39. numba_cuda/numba/cuda/errors.py +59 -0
  40. numba_cuda/numba/cuda/extending.py +7 -0
  41. numba_cuda/numba/cuda/initialize.py +13 -0
  42. numba_cuda/numba/cuda/intrinsic_wrapper.py +77 -0
  43. numba_cuda/numba/cuda/intrinsics.py +198 -0
  44. numba_cuda/numba/cuda/kernels/__init__.py +0 -0
  45. numba_cuda/numba/cuda/kernels/reduction.py +262 -0
  46. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  47. numba_cuda/numba/cuda/libdevice.py +3382 -0
  48. numba_cuda/numba/cuda/libdevicedecl.py +17 -0
  49. numba_cuda/numba/cuda/libdevicefuncs.py +1057 -0
  50. numba_cuda/numba/cuda/libdeviceimpl.py +83 -0
  51. numba_cuda/numba/cuda/mathimpl.py +448 -0
  52. numba_cuda/numba/cuda/models.py +48 -0
  53. numba_cuda/numba/cuda/nvvmutils.py +235 -0
  54. numba_cuda/numba/cuda/printimpl.py +86 -0
  55. numba_cuda/numba/cuda/random.py +292 -0
  56. numba_cuda/numba/cuda/simulator/__init__.py +38 -0
  57. numba_cuda/numba/cuda/simulator/api.py +110 -0
  58. numba_cuda/numba/cuda/simulator/compiler.py +9 -0
  59. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +2 -0
  60. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +432 -0
  61. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +117 -0
  62. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +62 -0
  63. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +4 -0
  64. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +4 -0
  65. numba_cuda/numba/cuda/simulator/cudadrv/error.py +6 -0
  66. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +2 -0
  67. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +29 -0
  68. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +19 -0
  69. numba_cuda/numba/cuda/simulator/kernel.py +308 -0
  70. numba_cuda/numba/cuda/simulator/kernelapi.py +495 -0
  71. numba_cuda/numba/cuda/simulator/reduction.py +15 -0
  72. numba_cuda/numba/cuda/simulator/vector_types.py +58 -0
  73. numba_cuda/numba/cuda/simulator_init.py +17 -0
  74. numba_cuda/numba/cuda/stubs.py +902 -0
  75. numba_cuda/numba/cuda/target.py +440 -0
  76. numba_cuda/numba/cuda/testing.py +202 -0
  77. numba_cuda/numba/cuda/tests/__init__.py +58 -0
  78. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +8 -0
  79. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +145 -0
  80. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +145 -0
  81. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +375 -0
  82. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +21 -0
  83. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +179 -0
  84. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +235 -0
  85. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_libraries.py +22 -0
  86. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +193 -0
  87. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +547 -0
  88. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +249 -0
  89. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +81 -0
  90. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +192 -0
  91. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +38 -0
  92. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +65 -0
  93. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +139 -0
  94. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +37 -0
  95. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +12 -0
  96. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +317 -0
  97. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +127 -0
  98. numba_cuda/numba/cuda/tests/cudadrv/test_mvc.py +54 -0
  99. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +199 -0
  100. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +37 -0
  101. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +20 -0
  102. numba_cuda/numba/cuda/tests/cudadrv/test_ptds.py +149 -0
  103. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +36 -0
  104. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +85 -0
  105. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +41 -0
  106. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +122 -0
  107. numba_cuda/numba/cuda/tests/cudapy/__init__.py +8 -0
  108. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +234 -0
  109. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +41 -0
  110. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +58 -0
  111. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +30 -0
  112. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +100 -0
  113. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +42 -0
  114. numba_cuda/numba/cuda/tests/cudapy/test_array.py +260 -0
  115. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +201 -0
  116. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +35 -0
  117. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1620 -0
  118. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +120 -0
  119. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +24 -0
  120. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +545 -0
  121. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +257 -0
  122. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +33 -0
  123. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +276 -0
  124. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +296 -0
  125. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +20 -0
  126. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +129 -0
  127. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +176 -0
  128. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +147 -0
  129. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +435 -0
  130. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +90 -0
  131. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +94 -0
  132. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +101 -0
  133. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +221 -0
  134. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +222 -0
  135. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +700 -0
  136. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +121 -0
  137. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +79 -0
  138. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +174 -0
  139. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +155 -0
  140. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +244 -0
  141. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +52 -0
  142. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +29 -0
  143. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +66 -0
  144. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +60 -0
  145. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +456 -0
  146. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +159 -0
  147. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +95 -0
  148. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +37 -0
  149. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +165 -0
  150. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1106 -0
  151. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +318 -0
  152. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +99 -0
  153. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +64 -0
  154. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +119 -0
  155. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +187 -0
  156. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +199 -0
  157. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +164 -0
  158. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +37 -0
  159. numba_cuda/numba/cuda/tests/cudapy/test_math.py +786 -0
  160. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +74 -0
  161. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +113 -0
  162. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +22 -0
  163. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +140 -0
  164. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +46 -0
  165. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +101 -0
  166. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +49 -0
  167. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +401 -0
  168. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +86 -0
  169. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +335 -0
  170. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +124 -0
  171. numba_cuda/numba/cuda/tests/cudapy/test_print.py +128 -0
  172. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +33 -0
  173. numba_cuda/numba/cuda/tests/cudapy/test_random.py +104 -0
  174. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +610 -0
  175. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +125 -0
  176. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +76 -0
  177. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  178. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +85 -0
  179. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +37 -0
  180. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +444 -0
  181. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +205 -0
  182. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +271 -0
  183. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +80 -0
  184. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +277 -0
  185. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +47 -0
  186. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +307 -0
  187. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +283 -0
  188. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +20 -0
  189. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +69 -0
  190. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +36 -0
  191. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +37 -0
  192. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +139 -0
  193. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +276 -0
  194. numba_cuda/numba/cuda/tests/cudasim/__init__.py +6 -0
  195. numba_cuda/numba/cuda/tests/cudasim/support.py +6 -0
  196. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +102 -0
  197. numba_cuda/numba/cuda/tests/data/__init__.py +0 -0
  198. numba_cuda/numba/cuda/tests/data/cuda_include.cu +5 -0
  199. numba_cuda/numba/cuda/tests/data/error.cu +7 -0
  200. numba_cuda/numba/cuda/tests/data/jitlink.cu +23 -0
  201. numba_cuda/numba/cuda/tests/data/jitlink.ptx +51 -0
  202. numba_cuda/numba/cuda/tests/data/warn.cu +7 -0
  203. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +6 -0
  204. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +0 -0
  205. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +49 -0
  206. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +77 -0
  207. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +76 -0
  208. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +82 -0
  209. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +155 -0
  210. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +173 -0
  211. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +109 -0
  212. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +59 -0
  213. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +76 -0
  214. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +130 -0
  215. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +50 -0
  216. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +73 -0
  217. numba_cuda/numba/cuda/tests/nocuda/__init__.py +8 -0
  218. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +359 -0
  219. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +36 -0
  220. numba_cuda/numba/cuda/tests/nocuda/test_import.py +49 -0
  221. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +238 -0
  222. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +54 -0
  223. numba_cuda/numba/cuda/types.py +37 -0
  224. numba_cuda/numba/cuda/ufuncs.py +662 -0
  225. numba_cuda/numba/cuda/vector_types.py +209 -0
  226. numba_cuda/numba/cuda/vectorizers.py +252 -0
  227. numba_cuda-0.0.13.dist-info/LICENSE +25 -0
  228. numba_cuda-0.0.13.dist-info/METADATA +69 -0
  229. numba_cuda-0.0.13.dist-info/RECORD +231 -0
  230. {numba_cuda-0.0.1.dist-info → numba_cuda-0.0.13.dist-info}/WHEEL +1 -1
  231. numba_cuda-0.0.1.dist-info/METADATA +0 -10
  232. numba_cuda-0.0.1.dist-info/RECORD +0 -5
  233. {numba_cuda-0.0.1.dist-info → numba_cuda-0.0.13.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,296 @@
1
+ import math
2
+ import itertools
3
+
4
+ import numpy as np
5
+
6
+ from numba.cuda.testing import unittest, CUDATestCase
7
+ from numba.core import types
8
+ from numba import cuda
9
+ from numba.tests.complex_usecases import (real_usecase, imag_usecase,
10
+ conjugate_usecase, phase_usecase,
11
+ polar_as_complex_usecase,
12
+ rect_usecase, isnan_usecase,
13
+ isinf_usecase, isfinite_usecase,
14
+ exp_usecase, log_usecase,
15
+ log_base_usecase, log10_usecase,
16
+ sqrt_usecase, asin_usecase,
17
+ acos_usecase, atan_usecase,
18
+ cos_usecase, sin_usecase,
19
+ tan_usecase, acosh_usecase,
20
+ asinh_usecase, atanh_usecase,
21
+ cosh_usecase, sinh_usecase,
22
+ tanh_usecase)
23
+ from numba.np import numpy_support
24
+
25
+
26
+ def compile_scalar_func(pyfunc, argtypes, restype):
27
+ # First compile a scalar device function
28
+ assert not any(isinstance(tp, types.Array) for tp in argtypes)
29
+ assert not isinstance(restype, types.Array)
30
+ device_func = cuda.jit(restype(*argtypes), device=True)(pyfunc)
31
+
32
+ kernel_types = [types.Array(tp, 1, "C")
33
+ for tp in [restype] + list(argtypes)]
34
+
35
+ if len(argtypes) == 1:
36
+ def kernel_func(out, a):
37
+ i = cuda.grid(1)
38
+ if i < out.shape[0]:
39
+ out[i] = device_func(a[i])
40
+ elif len(argtypes) == 2:
41
+ def kernel_func(out, a, b):
42
+ i = cuda.grid(1)
43
+ if i < out.shape[0]:
44
+ out[i] = device_func(a[i], b[i])
45
+ else:
46
+ assert 0
47
+
48
+ kernel = cuda.jit(tuple(kernel_types))(kernel_func)
49
+
50
+ def kernel_wrapper(values):
51
+ n = len(values)
52
+ inputs = [np.empty(n, dtype=numpy_support.as_dtype(tp))
53
+ for tp in argtypes]
54
+ output = np.empty(n, dtype=numpy_support.as_dtype(restype))
55
+ for i, vs in enumerate(values):
56
+ for v, inp in zip(vs, inputs):
57
+ inp[i] = v
58
+ args = [output] + inputs
59
+ kernel[int(math.ceil(n / 256)), 256](*args)
60
+ return list(output)
61
+ return kernel_wrapper
62
+
63
+
64
+ class BaseComplexTest(CUDATestCase):
65
+
66
+ def basic_values(self):
67
+ reals = [-0.0, +0.0, 1, -1, +1.5, -3.5,
68
+ float('-inf'), float('+inf'), float('nan')]
69
+ return [complex(x, y) for x, y in itertools.product(reals, reals)]
70
+
71
+ def more_values(self):
72
+ reals = [0.0, +0.0, 1, -1, -math.pi, +math.pi,
73
+ float('-inf'), float('+inf'), float('nan')]
74
+ return [complex(x, y) for x, y in itertools.product(reals, reals)]
75
+
76
+ def non_nan_values(self):
77
+ reals = [-0.0, +0.0, 1, -1, -math.pi, +math.pi,
78
+ float('inf'), float('-inf')]
79
+ return [complex(x, y) for x, y in itertools.product(reals, reals)]
80
+
81
+ def run_func(self, pyfunc, sigs, values, ulps=1, ignore_sign_on_zero=False):
82
+ for sig in sigs:
83
+ if isinstance(sig, types.Type):
84
+ sig = sig,
85
+ if isinstance(sig, tuple):
86
+ # Assume return type is the type of first argument
87
+ sig = sig[0](*sig)
88
+ prec = ('single'
89
+ if sig.args[0] in (types.float32, types.complex64)
90
+ else 'double')
91
+ cudafunc = compile_scalar_func(pyfunc, sig.args, sig.return_type)
92
+ ok_values = []
93
+ expected_list = []
94
+ for args in values:
95
+ if not isinstance(args, (list, tuple)):
96
+ args = args,
97
+ try:
98
+ expected_list.append(pyfunc(*args))
99
+ ok_values.append(args)
100
+ except ValueError as e:
101
+ self.assertIn("math domain error", str(e))
102
+ continue
103
+ got_list = cudafunc(ok_values)
104
+ for got, expected, args in zip(got_list, expected_list, ok_values):
105
+ msg = 'for input %r with prec %r' % (args, prec)
106
+ self.assertPreciseEqual(got, expected, prec=prec,
107
+ ulps=ulps,
108
+ ignore_sign_on_zero=ignore_sign_on_zero,
109
+ msg=msg)
110
+
111
+ run_unary = run_func
112
+ run_binary = run_func
113
+
114
+
115
+ class TestComplex(BaseComplexTest):
116
+
117
+ def check_real_image(self, pyfunc):
118
+ values = self.basic_values()
119
+ self.run_unary(pyfunc,
120
+ [tp.underlying_float(tp)
121
+ for tp in (types.complex64, types.complex128)],
122
+ values)
123
+
124
+ def test_real(self):
125
+ self.check_real_image(real_usecase)
126
+
127
+ def test_imag(self):
128
+ self.check_real_image(imag_usecase)
129
+
130
+ def test_conjugate(self):
131
+ pyfunc = conjugate_usecase
132
+ values = self.basic_values()
133
+ self.run_unary(pyfunc,
134
+ [types.complex64, types.complex128],
135
+ values)
136
+
137
+
138
+ class TestCMath(BaseComplexTest):
139
+ """
140
+ Tests for cmath module support.
141
+ """
142
+
143
+ def check_predicate_func(self, pyfunc):
144
+ self.run_unary(pyfunc,
145
+ [types.boolean(tp)
146
+ for tp in (types.complex128, types.complex64)],
147
+ self.basic_values())
148
+
149
+ def check_unary_func(self, pyfunc, ulps=1, values=None,
150
+ returns_float=False, ignore_sign_on_zero=False):
151
+ if returns_float:
152
+ def sig(tp):
153
+ return tp.underlying_float(tp)
154
+ else:
155
+ def sig(tp):
156
+ return tp(tp)
157
+ self.run_unary(pyfunc, [sig(types.complex128)],
158
+ values or self.more_values(), ulps=ulps,
159
+ ignore_sign_on_zero=ignore_sign_on_zero)
160
+ # Avoid discontinuities around pi when in single precision.
161
+ self.run_unary(pyfunc, [sig(types.complex64)],
162
+ values or self.basic_values(), ulps=ulps,
163
+ ignore_sign_on_zero=ignore_sign_on_zero)
164
+
165
+ # Conversions
166
+
167
+ def test_phase(self):
168
+ self.check_unary_func(phase_usecase, returns_float=True)
169
+
170
+ def test_polar(self):
171
+ self.check_unary_func(polar_as_complex_usecase)
172
+
173
+ def test_rect(self):
174
+ def do_test(tp, seed_values):
175
+ values = [(z.real, z.imag) for z in seed_values
176
+ if not math.isinf(z.imag) or z.real == 0]
177
+ float_type = tp.underlying_float
178
+ self.run_binary(rect_usecase, [tp(float_type, float_type)],
179
+ values)
180
+ do_test(types.complex128, self.more_values())
181
+ # Avoid discontinuities around pi when in single precision.
182
+ do_test(types.complex64, self.basic_values())
183
+
184
+ # Classification
185
+
186
+ def test_isnan(self):
187
+ self.check_predicate_func(isnan_usecase)
188
+
189
+ def test_isinf(self):
190
+ self.check_predicate_func(isinf_usecase)
191
+
192
+ def test_isfinite(self):
193
+ self.check_predicate_func(isfinite_usecase)
194
+
195
+ # Power and logarithms
196
+
197
+ def test_exp(self):
198
+ self.check_unary_func(exp_usecase, ulps=2)
199
+
200
+ def test_log(self):
201
+ self.check_unary_func(log_usecase)
202
+
203
+ def test_log_base(self):
204
+ values = list(itertools.product(self.more_values(), self.more_values()))
205
+ value_types = [(types.complex128, types.complex128),
206
+ (types.complex64, types.complex64)]
207
+ self.run_binary(log_base_usecase, value_types, values,
208
+ ulps=3)
209
+
210
+ def test_log10(self):
211
+ self.check_unary_func(log10_usecase)
212
+
213
+ def test_sqrt(self):
214
+ self.check_unary_func(sqrt_usecase)
215
+
216
+ # Trigonometric functions
217
+
218
+ def test_acos(self):
219
+ self.check_unary_func(acos_usecase, ulps=2)
220
+
221
+ def test_asin(self):
222
+ self.check_unary_func(asin_usecase, ulps=2)
223
+
224
+ def test_atan(self):
225
+ self.check_unary_func(atan_usecase, ulps=2,
226
+ values=self.non_nan_values())
227
+
228
+ def test_cos(self):
229
+ self.check_unary_func(cos_usecase, ulps=2)
230
+
231
+ def test_sin(self):
232
+ # See test_sinh.
233
+ self.check_unary_func(sin_usecase, ulps=2)
234
+
235
+ def test_tan(self):
236
+ self.check_unary_func(tan_usecase, ulps=2,
237
+ ignore_sign_on_zero=True)
238
+
239
+ # Hyperbolic functions
240
+
241
+ def test_acosh(self):
242
+ self.check_unary_func(acosh_usecase)
243
+
244
+ def test_asinh(self):
245
+ self.check_unary_func(asinh_usecase, ulps=2)
246
+
247
+ def test_atanh(self):
248
+ self.check_unary_func(atanh_usecase, ulps=2,
249
+ ignore_sign_on_zero=True)
250
+
251
+ def test_cosh(self):
252
+ self.check_unary_func(cosh_usecase, ulps=2)
253
+
254
+ def test_sinh(self):
255
+ self.check_unary_func(sinh_usecase, ulps=2)
256
+
257
+ def test_tanh(self):
258
+ self.check_unary_func(tanh_usecase, ulps=2,
259
+ ignore_sign_on_zero=True)
260
+
261
+
262
+ class TestAtomicOnComplexComponents(CUDATestCase):
263
+ # Based on the reproducer from Issue #8309. array.real and array.imag could
264
+ # not be used because they required returning an array from a generated
265
+ # function, and even if this was permitted, they could not be resolved from
266
+ # the atomic lowering when they were overloads.
267
+ #
268
+ # See https://github.com/numba/numba/issues/8309
269
+
270
+ def test_atomic_on_real(self):
271
+ @cuda.jit
272
+ def atomic_add_one(values):
273
+ i = cuda.grid(1)
274
+ cuda.atomic.add(values.real, i, 1)
275
+
276
+ N = 32
277
+ arr1 = np.arange(N) + np.arange(N) * 1j
278
+ arr2 = arr1.copy()
279
+ atomic_add_one[1, N](arr2)
280
+ np.testing.assert_equal(arr1 + 1, arr2)
281
+
282
+ def test_atomic_on_imag(self):
283
+ @cuda.jit
284
+ def atomic_add_one_j(values):
285
+ i = cuda.grid(1)
286
+ cuda.atomic.add(values.imag, i, 1)
287
+
288
+ N = 32
289
+ arr1 = np.arange(N) + np.arange(N) * 1j
290
+ arr2 = arr1.copy()
291
+ atomic_add_one_j[1, N](arr2)
292
+ np.testing.assert_equal(arr1 + 1j, arr2)
293
+
294
+
295
+ if __name__ == '__main__':
296
+ unittest.main()
@@ -0,0 +1,20 @@
1
+ import numpy as np
2
+ from numba import cuda
3
+ from numba.cuda.testing import unittest, CUDATestCase
4
+
5
+
6
+ class TestCudaComplex(CUDATestCase):
7
+ def test_cuda_complex_arg(self):
8
+ @cuda.jit('void(complex128[:], complex128)')
9
+ def foo(a, b):
10
+ i = cuda.grid(1)
11
+ a[i] += b
12
+
13
+ a = np.arange(5, dtype=np.complex128)
14
+ a0 = a.copy()
15
+ foo[1, a.shape](a, 2j)
16
+ self.assertTrue(np.allclose(a, a0 + 2j))
17
+
18
+
19
+ if __name__ == '__main__':
20
+ unittest.main()
@@ -0,0 +1,129 @@
1
+ import re
2
+ import numpy as np
3
+ from numba import cuda
4
+ from numba.cuda.testing import unittest, skip_on_cudasim, CUDATestCase
5
+ from llvmlite import ir
6
+
7
+
8
+ @skip_on_cudasim("This is testing CUDA backend code generation")
9
+ class TestConstStringCodegen(unittest.TestCase):
10
+ def test_const_string(self):
11
+ # These imports are incompatible with CUDASIM
12
+ from numba.cuda.descriptor import cuda_target
13
+ from numba.cuda.cudadrv.nvvm import compile_ir
14
+
15
+ targetctx = cuda_target.target_context
16
+ mod = targetctx.create_module("")
17
+ textstring = 'A Little Brown Fox'
18
+ gv0 = targetctx.insert_const_string(mod, textstring)
19
+ # Insert the same const string a second time - the first should be
20
+ # reused.
21
+ targetctx.insert_const_string(mod, textstring)
22
+
23
+ res = re.findall(r"@\"__conststring__.*internal.*constant.*\["
24
+ r"19\s+x\s+i8\]", str(mod))
25
+ # Ensure that the const string was only inserted once
26
+ self.assertEqual(len(res), 1)
27
+
28
+ fnty = ir.FunctionType(ir.IntType(8).as_pointer(), [])
29
+
30
+ # Using insert_const_string
31
+ fn = ir.Function(mod, fnty, "test_insert_const_string")
32
+ builder = ir.IRBuilder(fn.append_basic_block())
33
+ res = builder.addrspacecast(gv0, ir.PointerType(ir.IntType(8)),
34
+ 'generic')
35
+ builder.ret(res)
36
+
37
+ matches = re.findall(r"@\"__conststring__.*internal.*constant.*\["
38
+ r"19\s+x\s+i8\]", str(mod))
39
+ self.assertEqual(len(matches), 1)
40
+
41
+ # Using insert_string_const_addrspace
42
+ fn = ir.Function(mod, fnty, "test_insert_string_const_addrspace")
43
+ builder = ir.IRBuilder(fn.append_basic_block())
44
+ res = targetctx.insert_string_const_addrspace(builder, textstring)
45
+ builder.ret(res)
46
+
47
+ matches = re.findall(r"@\"__conststring__.*internal.*constant.*\["
48
+ r"19\s+x\s+i8\]", str(mod))
49
+ self.assertEqual(len(matches), 1)
50
+
51
+ ptx = compile_ir(str(mod)).decode('ascii')
52
+ matches = list(re.findall(r"\.const.*__conststring__", ptx))
53
+
54
+ self.assertEqual(len(matches), 1)
55
+
56
+
57
+ # Inspired by the reproducer from Issue #7041.
58
+ class TestConstString(CUDATestCase):
59
+ def test_assign_const_unicode_string(self):
60
+ @cuda.jit
61
+ def str_assign(arr):
62
+ i = cuda.grid(1)
63
+ if i < len(arr):
64
+ arr[i] = "XYZ"
65
+
66
+ n_strings = 8
67
+ arr = np.zeros(n_strings + 1, dtype="<U12")
68
+ str_assign[1, n_strings](arr)
69
+
70
+ # Expected result, e.g.:
71
+ # ['XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' 'XYZ' '']
72
+ expected = np.zeros_like(arr)
73
+ expected[:-1] = 'XYZ'
74
+ expected[-1] = ''
75
+ np.testing.assert_equal(arr, expected)
76
+
77
+ def test_assign_const_byte_string(self):
78
+ @cuda.jit
79
+ def bytes_assign(arr):
80
+ i = cuda.grid(1)
81
+ if i < len(arr):
82
+ arr[i] = b"XYZ"
83
+
84
+ n_strings = 8
85
+ arr = np.zeros(n_strings + 1, dtype="S12")
86
+ bytes_assign[1, n_strings](arr)
87
+
88
+ # Expected result, e.g.:
89
+ # [b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'XYZ' b'']
90
+ expected = np.zeros_like(arr)
91
+ expected[:-1] = b'XYZ'
92
+ expected[-1] = b''
93
+ np.testing.assert_equal(arr, expected)
94
+
95
+ def test_assign_const_string_in_record(self):
96
+ @cuda.jit
97
+ def f(a):
98
+ a[0]['x'] = 1
99
+ a[0]['y'] = 'ABC'
100
+ a[1]['x'] = 2
101
+ a[1]['y'] = 'XYZ'
102
+
103
+ dt = np.dtype([('x', np.int32), ('y', np.dtype('<U12'))])
104
+ a = np.zeros(2, dt)
105
+
106
+ f[1, 1](a)
107
+
108
+ reference = np.asarray([(1, 'ABC'), (2, 'XYZ')], dtype=dt)
109
+ np.testing.assert_array_equal(reference, a)
110
+
111
+ def test_assign_const_bytes_in_record(self):
112
+ @cuda.jit
113
+ def f(a):
114
+ a[0]['x'] = 1
115
+ a[0]['y'] = b'ABC'
116
+ a[1]['x'] = 2
117
+ a[1]['y'] = b'XYZ'
118
+
119
+ dt = np.dtype([('x', np.float32), ('y', np.dtype('S12'))])
120
+ a = np.zeros(2, dt)
121
+
122
+ f[1, 1](a)
123
+
124
+ reference = np.asarray([(1, b'ABC'), (2, b'XYZ')], dtype=dt)
125
+ np.testing.assert_array_equal(reference, a)
126
+
127
+
128
+ if __name__ == '__main__':
129
+ unittest.main()
@@ -0,0 +1,176 @@
1
+ import numpy as np
2
+
3
+ from numba import cuda, complex64, int32, float64
4
+ from numba.cuda.testing import unittest, CUDATestCase
5
+ from numba.core.config import ENABLE_CUDASIM
6
+
7
+ CONST_EMPTY = np.array([])
8
+ CONST1D = np.arange(10, dtype=np.float64) / 2.
9
+ CONST2D = np.asfortranarray(
10
+ np.arange(100, dtype=np.int32).reshape(10, 10))
11
+ CONST3D = ((np.arange(5 * 5 * 5, dtype=np.complex64).reshape(5, 5, 5) + 1j) /
12
+ 2j)
13
+ CONST3BYTES = np.arange(3, dtype=np.uint8)
14
+
15
+ CONST_RECORD_EMPTY = np.array(
16
+ [],
17
+ dtype=[('x', float), ('y', int)])
18
+ CONST_RECORD = np.array(
19
+ [(1.0, 2), (3.0, 4)],
20
+ dtype=[('x', float), ('y', int)])
21
+ CONST_RECORD_ALIGN = np.array(
22
+ [(1, 2, 3, 0xDEADBEEF, 8), (4, 5, 6, 0xBEEFDEAD, 10)],
23
+ dtype=np.dtype(
24
+ dtype=[
25
+ ('a', np.uint8),
26
+ ('b', np.uint8),
27
+ ('x', np.uint8),
28
+ ('y', np.uint32),
29
+ ('z', np.uint8),
30
+ ],
31
+ align=True))
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.assertIn(
102
+ 'ld.const.f64',
103
+ jcuconst.inspect_asm(sig),
104
+ "as we're adding to it, load as a double")
105
+
106
+ def test_const_empty(self):
107
+ jcuconstEmpty = cuda.jit('void(int64[:])')(cuconstEmpty)
108
+ A = np.full(1, fill_value=-1, dtype=np.int64)
109
+ jcuconstEmpty[1, 1](A)
110
+ self.assertTrue(np.all(A == 0))
111
+
112
+ def test_const_align(self):
113
+ jcuconstAlign = cuda.jit('void(float64[:])')(cuconstAlign)
114
+ A = np.full(3, fill_value=np.nan, dtype=float)
115
+ jcuconstAlign[1, 3](A)
116
+ self.assertTrue(np.all(A == (CONST3BYTES + CONST1D[:3])))
117
+
118
+ def test_const_array_2d(self):
119
+ sig = (int32[:,:],)
120
+ jcuconst2d = cuda.jit(sig)(cuconst2d)
121
+ A = np.zeros_like(CONST2D, order='C')
122
+ jcuconst2d[(2, 2), (5, 5)](A)
123
+ self.assertTrue(np.all(A == CONST2D))
124
+
125
+ if not ENABLE_CUDASIM:
126
+ self.assertIn(
127
+ 'ld.const.u32',
128
+ jcuconst2d.inspect_asm(sig),
129
+ "load the ints as ints")
130
+
131
+ def test_const_array_3d(self):
132
+ sig = (complex64[:,:,:],)
133
+ jcuconst3d = cuda.jit(sig)(cuconst3d)
134
+ A = np.zeros_like(CONST3D, order='F')
135
+ jcuconst3d[1, (5, 5, 5)](A)
136
+ self.assertTrue(np.all(A == CONST3D))
137
+
138
+ if not ENABLE_CUDASIM:
139
+ asm = jcuconst3d.inspect_asm(sig)
140
+ complex_load = 'ld.const.v2.f32'
141
+ description = 'Load the complex as a vector of 2x f32'
142
+ self.assertIn(complex_load, asm, description)
143
+
144
+ def test_const_record_empty(self):
145
+ jcuconstRecEmpty = cuda.jit('void(int64[:])')(cuconstRecEmpty)
146
+ A = np.full(1, fill_value=-1, dtype=np.int64)
147
+ jcuconstRecEmpty[1, 1](A)
148
+ self.assertTrue(np.all(A == 0))
149
+
150
+ def test_const_record(self):
151
+ A = np.zeros(2, dtype=float)
152
+ B = np.zeros(2, dtype=int)
153
+ jcuconst = cuda.jit(cuconstRec).specialize(A, B)
154
+
155
+ jcuconst[2, 1](A, B)
156
+ np.testing.assert_allclose(A, CONST_RECORD['x'])
157
+ np.testing.assert_allclose(B, CONST_RECORD['y'])
158
+
159
+ def test_const_record_align(self):
160
+ A = np.zeros(2, dtype=np.float64)
161
+ B = np.zeros(2, dtype=np.float64)
162
+ C = np.zeros(2, dtype=np.float64)
163
+ D = np.zeros(2, dtype=np.float64)
164
+ E = np.zeros(2, dtype=np.float64)
165
+ jcuconst = cuda.jit(cuconstRecAlign).specialize(A, B, C, D, E)
166
+
167
+ jcuconst[2, 1](A, B, C, D, E)
168
+ np.testing.assert_allclose(A, CONST_RECORD_ALIGN['a'])
169
+ np.testing.assert_allclose(B, CONST_RECORD_ALIGN['b'])
170
+ np.testing.assert_allclose(C, CONST_RECORD_ALIGN['x'])
171
+ np.testing.assert_allclose(D, CONST_RECORD_ALIGN['y'])
172
+ np.testing.assert_allclose(E, CONST_RECORD_ALIGN['z'])
173
+
174
+
175
+ if __name__ == '__main__':
176
+ unittest.main()