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.
- _numba_cuda_redirector.pth +1 -0
- _numba_cuda_redirector.py +74 -0
- numba_cuda/VERSION +1 -0
- numba_cuda/__init__.py +5 -0
- numba_cuda/_version.py +19 -0
- numba_cuda/numba/cuda/__init__.py +22 -0
- numba_cuda/numba/cuda/api.py +526 -0
- numba_cuda/numba/cuda/api_util.py +30 -0
- numba_cuda/numba/cuda/args.py +77 -0
- numba_cuda/numba/cuda/cg.py +62 -0
- numba_cuda/numba/cuda/codegen.py +378 -0
- numba_cuda/numba/cuda/compiler.py +422 -0
- numba_cuda/numba/cuda/cpp_function_wrappers.cu +47 -0
- numba_cuda/numba/cuda/cuda_fp16.h +3631 -0
- numba_cuda/numba/cuda/cuda_fp16.hpp +2465 -0
- numba_cuda/numba/cuda/cuda_paths.py +258 -0
- numba_cuda/numba/cuda/cudadecl.py +806 -0
- numba_cuda/numba/cuda/cudadrv/__init__.py +9 -0
- numba_cuda/numba/cuda/cudadrv/devicearray.py +904 -0
- numba_cuda/numba/cuda/cudadrv/devices.py +248 -0
- numba_cuda/numba/cuda/cudadrv/driver.py +3201 -0
- numba_cuda/numba/cuda/cudadrv/drvapi.py +398 -0
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +452 -0
- numba_cuda/numba/cuda/cudadrv/enums.py +607 -0
- numba_cuda/numba/cuda/cudadrv/error.py +36 -0
- numba_cuda/numba/cuda/cudadrv/libs.py +176 -0
- numba_cuda/numba/cuda/cudadrv/ndarray.py +20 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +260 -0
- numba_cuda/numba/cuda/cudadrv/nvvm.py +707 -0
- numba_cuda/numba/cuda/cudadrv/rtapi.py +10 -0
- numba_cuda/numba/cuda/cudadrv/runtime.py +142 -0
- numba_cuda/numba/cuda/cudaimpl.py +1055 -0
- numba_cuda/numba/cuda/cudamath.py +140 -0
- numba_cuda/numba/cuda/decorators.py +189 -0
- numba_cuda/numba/cuda/descriptor.py +33 -0
- numba_cuda/numba/cuda/device_init.py +89 -0
- numba_cuda/numba/cuda/deviceufunc.py +908 -0
- numba_cuda/numba/cuda/dispatcher.py +1057 -0
- numba_cuda/numba/cuda/errors.py +59 -0
- numba_cuda/numba/cuda/extending.py +7 -0
- numba_cuda/numba/cuda/initialize.py +13 -0
- numba_cuda/numba/cuda/intrinsic_wrapper.py +77 -0
- numba_cuda/numba/cuda/intrinsics.py +198 -0
- numba_cuda/numba/cuda/kernels/__init__.py +0 -0
- numba_cuda/numba/cuda/kernels/reduction.py +262 -0
- numba_cuda/numba/cuda/kernels/transpose.py +65 -0
- numba_cuda/numba/cuda/libdevice.py +3382 -0
- numba_cuda/numba/cuda/libdevicedecl.py +17 -0
- numba_cuda/numba/cuda/libdevicefuncs.py +1057 -0
- numba_cuda/numba/cuda/libdeviceimpl.py +83 -0
- numba_cuda/numba/cuda/mathimpl.py +448 -0
- numba_cuda/numba/cuda/models.py +48 -0
- numba_cuda/numba/cuda/nvvmutils.py +235 -0
- numba_cuda/numba/cuda/printimpl.py +86 -0
- numba_cuda/numba/cuda/random.py +292 -0
- numba_cuda/numba/cuda/simulator/__init__.py +38 -0
- numba_cuda/numba/cuda/simulator/api.py +110 -0
- numba_cuda/numba/cuda/simulator/compiler.py +9 -0
- numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +2 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +432 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devices.py +117 -0
- numba_cuda/numba/cuda/simulator/cudadrv/driver.py +62 -0
- numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +4 -0
- numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +4 -0
- numba_cuda/numba/cuda/simulator/cudadrv/error.py +6 -0
- numba_cuda/numba/cuda/simulator/cudadrv/libs.py +2 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +29 -0
- numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +19 -0
- numba_cuda/numba/cuda/simulator/kernel.py +308 -0
- numba_cuda/numba/cuda/simulator/kernelapi.py +495 -0
- numba_cuda/numba/cuda/simulator/reduction.py +15 -0
- numba_cuda/numba/cuda/simulator/vector_types.py +58 -0
- numba_cuda/numba/cuda/simulator_init.py +17 -0
- numba_cuda/numba/cuda/stubs.py +902 -0
- numba_cuda/numba/cuda/target.py +440 -0
- numba_cuda/numba/cuda/testing.py +202 -0
- numba_cuda/numba/cuda/tests/__init__.py +58 -0
- numba_cuda/numba/cuda/tests/cudadrv/__init__.py +8 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +145 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +145 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +375 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +21 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +179 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +235 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_libraries.py +22 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +193 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +547 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +249 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +81 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +192 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_events.py +38 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +65 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_init.py +139 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +37 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +12 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +317 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +127 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_mvc.py +54 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +199 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +37 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +20 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_ptds.py +149 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +36 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +85 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +41 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +122 -0
- numba_cuda/numba/cuda/tests/cudapy/__init__.py +8 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +234 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +41 -0
- numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +58 -0
- numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +30 -0
- numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +100 -0
- numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array.py +260 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +201 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +35 -0
- numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1620 -0
- numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +120 -0
- numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +24 -0
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +545 -0
- numba_cuda/numba/cuda/tests/cudapy/test_casting.py +257 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +33 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +276 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex.py +296 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +20 -0
- numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +129 -0
- numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +176 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +147 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +435 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +90 -0
- numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debug.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +221 -0
- numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +222 -0
- numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +700 -0
- numba_cuda/numba/cuda/tests/cudapy/test_enums.py +121 -0
- numba_cuda/numba/cuda/tests/cudapy/test_errors.py +79 -0
- numba_cuda/numba/cuda/tests/cudapy/test_exception.py +174 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending.py +155 -0
- numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +244 -0
- numba_cuda/numba/cuda/tests/cudapy/test_forall.py +52 -0
- numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +29 -0
- numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +66 -0
- numba_cuda/numba/cuda/tests/cudapy/test_globals.py +60 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +456 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +159 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +95 -0
- numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +165 -0
- numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1106 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +318 -0
- numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +99 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lang.py +64 -0
- numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +119 -0
- numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +187 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +199 -0
- numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +164 -0
- numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_math.py +786 -0
- numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +74 -0
- numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +113 -0
- numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +22 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +140 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +46 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +49 -0
- numba_cuda/numba/cuda/tests/cudapy/test_operator.py +401 -0
- numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +86 -0
- numba_cuda/numba/cuda/tests/cudapy/test_overload.py +335 -0
- numba_cuda/numba/cuda/tests/cudapy/test_powi.py +124 -0
- numba_cuda/numba/cuda/tests/cudapy/test_print.py +128 -0
- numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +33 -0
- numba_cuda/numba/cuda/tests/cudapy/test_random.py +104 -0
- numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +610 -0
- numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +125 -0
- numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +76 -0
- numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
- numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +85 -0
- numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm.py +444 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +205 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sync.py +271 -0
- numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +80 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +277 -0
- numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +307 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +283 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +20 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +69 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +36 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warning.py +139 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +276 -0
- numba_cuda/numba/cuda/tests/cudasim/__init__.py +6 -0
- numba_cuda/numba/cuda/tests/cudasim/support.py +6 -0
- numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +102 -0
- numba_cuda/numba/cuda/tests/data/__init__.py +0 -0
- numba_cuda/numba/cuda/tests/data/cuda_include.cu +5 -0
- numba_cuda/numba/cuda/tests/data/error.cu +7 -0
- numba_cuda/numba/cuda/tests/data/jitlink.cu +23 -0
- numba_cuda/numba/cuda/tests/data/jitlink.ptx +51 -0
- numba_cuda/numba/cuda/tests/data/warn.cu +7 -0
- numba_cuda/numba/cuda/tests/doc_examples/__init__.py +6 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +0 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +49 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +77 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +76 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +82 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +155 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +173 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +109 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_random.py +59 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +76 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +130 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +50 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +73 -0
- numba_cuda/numba/cuda/tests/nocuda/__init__.py +8 -0
- numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +359 -0
- numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +36 -0
- numba_cuda/numba/cuda/tests/nocuda/test_import.py +49 -0
- numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +238 -0
- numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +54 -0
- numba_cuda/numba/cuda/types.py +37 -0
- numba_cuda/numba/cuda/ufuncs.py +662 -0
- numba_cuda/numba/cuda/vector_types.py +209 -0
- numba_cuda/numba/cuda/vectorizers.py +252 -0
- numba_cuda-0.0.13.dist-info/LICENSE +25 -0
- numba_cuda-0.0.13.dist-info/METADATA +69 -0
- numba_cuda-0.0.13.dist-info/RECORD +231 -0
- {numba_cuda-0.0.1.dist-info → numba_cuda-0.0.13.dist-info}/WHEEL +1 -1
- numba_cuda-0.0.1.dist-info/METADATA +0 -10
- numba_cuda-0.0.1.dist-info/RECORD +0 -5
- {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()
|