numba-cuda 0.5.0__py3-none-any.whl → 0.7.0__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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.7.0
@@ -1,14 +1,17 @@
1
1
  from llvmlite import ir
2
2
  from numba.core.typing.templates import ConcreteTemplate
3
+ from numba.core import ir as numba_ir
3
4
  from numba.core import (cgutils, types, typing, funcdesc, config, compiler,
4
5
  sigutils, utils)
5
6
  from numba.core.compiler import (sanitize_compile_result_entries, CompilerBase,
6
7
  DefaultPassBuilder, Flags, Option,
7
8
  CompileResult)
8
9
  from numba.core.compiler_lock import global_compiler_lock
9
- from numba.core.compiler_machinery import (LoweringPass,
10
+ from numba.core.compiler_machinery import (FunctionPass, LoweringPass,
10
11
  PassManager, register_pass)
12
+ from numba.core.interpreter import Interpreter
11
13
  from numba.core.errors import NumbaInvalidConfigWarning
14
+ from numba.core.untyped_passes import TranslateByteCode
12
15
  from numba.core.typed_passes import (IRLegalization, NativeLowering,
13
16
  AnnotateTypes)
14
17
  from warnings import warn
@@ -143,13 +146,74 @@ class CreateLibrary(LoweringPass):
143
146
  return True
144
147
 
145
148
 
149
+ class CUDABytecodeInterpreter(Interpreter):
150
+ # Based on the superclass implementation, but names the resulting variable
151
+ # "$bool<N>" instead of "bool<N>" - see Numba PR #9888:
152
+ # https://github.com/numba/numba/pull/9888
153
+ #
154
+ # This can be removed once that PR is available in an upstream Numba
155
+ # release.
156
+ def _op_JUMP_IF(self, inst, pred, iftrue):
157
+ brs = {
158
+ True: inst.get_jump_target(),
159
+ False: inst.next,
160
+ }
161
+ truebr = brs[iftrue]
162
+ falsebr = brs[not iftrue]
163
+
164
+ name = "$bool%s" % (inst.offset)
165
+ gv_fn = numba_ir.Global("bool", bool, loc=self.loc)
166
+ self.store(value=gv_fn, name=name)
167
+
168
+ callres = numba_ir.Expr.call(self.get(name), (self.get(pred),), (),
169
+ loc=self.loc)
170
+
171
+ pname = "$%spred" % (inst.offset)
172
+ predicate = self.store(value=callres, name=pname)
173
+ bra = numba_ir.Branch(cond=predicate, truebr=truebr, falsebr=falsebr,
174
+ loc=self.loc)
175
+ self.current_block.append(bra)
176
+
177
+
178
+ @register_pass(mutates_CFG=True, analysis_only=False)
179
+ class CUDATranslateBytecode(FunctionPass):
180
+ _name = "cuda_translate_bytecode"
181
+
182
+ def __init__(self):
183
+ FunctionPass.__init__(self)
184
+
185
+ def run_pass(self, state):
186
+ func_id = state['func_id']
187
+ bc = state['bc']
188
+ interp = CUDABytecodeInterpreter(func_id)
189
+ func_ir = interp.interpret(bc)
190
+ state['func_ir'] = func_ir
191
+ return True
192
+
193
+
146
194
  class CUDACompiler(CompilerBase):
147
195
  def define_pipelines(self):
148
196
  dpb = DefaultPassBuilder
149
197
  pm = PassManager('cuda')
150
198
 
151
199
  untyped_passes = dpb.define_untyped_pipeline(self.state)
152
- pm.passes.extend(untyped_passes.passes)
200
+
201
+ # Rather than replicating the whole untyped passes definition in
202
+ # numba-cuda, it seems cleaner to take the pass list and replace the
203
+ # TranslateBytecode pass with our own.
204
+
205
+ def replace_translate_pass(implementation, description):
206
+ if implementation is TranslateByteCode:
207
+ return (CUDATranslateBytecode, description)
208
+ else:
209
+ return (implementation, description)
210
+
211
+ cuda_untyped_passes = [
212
+ replace_translate_pass(implementation, description)
213
+ for implementation, description in untyped_passes.passes
214
+ ]
215
+
216
+ pm.passes.extend(cuda_untyped_passes)
153
217
 
154
218
  typed_passes = dpb.define_typed_pipeline(self.state)
155
219
  pm.passes.extend(typed_passes.passes)
@@ -352,6 +416,20 @@ def kernel_fixup(kernel, debug):
352
416
  kernel.return_value = ir.ReturnValue(kernel, ir.VoidType())
353
417
  kernel.args = kernel.args[1:]
354
418
 
419
+ # If debug metadata is present, remove the return value from it
420
+
421
+ if kernel_metadata := getattr(kernel, 'metadata', None):
422
+ if dbg_metadata := kernel_metadata.get('dbg', None):
423
+ for name, value in dbg_metadata.operands:
424
+ if name == "type":
425
+ type_metadata = value
426
+ for tm_name, tm_value in type_metadata.operands:
427
+ if tm_name == 'types':
428
+ types = tm_value
429
+ types.operands = types.operands[1:]
430
+ if config.DUMP_LLVM:
431
+ types._clear_string_cache()
432
+
355
433
  # Mark as a kernel for NVVM
356
434
 
357
435
  nvvm.set_cuda_kernel(kernel)
@@ -199,12 +199,52 @@ class NVVM(object):
199
199
 
200
200
 
201
201
  class CompilationUnit(object):
202
- def __init__(self):
202
+ """
203
+ A CompilationUnit is a set of LLVM modules that are compiled to PTX or
204
+ LTO-IR with NVVM.
205
+
206
+ Compilation options are accepted as a dict mapping option names to values,
207
+ with the following considerations:
208
+
209
+ - Underscores (`_`) in option names are converted to dashes (`-`), to match
210
+ NVVM's option name format.
211
+ - Options that take a value will be emitted in the form "-<name>=<value>".
212
+ - Booleans passed as option values will be converted to integers.
213
+ - Options which take no value (such as `-gen-lto`) should have a value of
214
+ `None` and will be emitted in the form "-<name>".
215
+
216
+ For documentation on NVVM compilation options, see the CUDA Toolkit
217
+ Documentation:
218
+
219
+ https://docs.nvidia.com/cuda/libnvvm-api/index.html#_CPPv418nvvmCompileProgram11nvvmProgramiPPKc
220
+ """
221
+
222
+ def __init__(self, options):
203
223
  self.driver = NVVM()
204
224
  self._handle = nvvm_program()
205
225
  err = self.driver.nvvmCreateProgram(byref(self._handle))
206
226
  self.driver.check_error(err, 'Failed to create CU')
207
227
 
228
+ def stringify_option(k, v):
229
+ k = k.replace('_', '-')
230
+
231
+ if v is None:
232
+ return f'-{k}'.encode('utf-8')
233
+
234
+ if isinstance(v, bool):
235
+ v = int(v)
236
+
237
+ return f'-{k}={v}'.encode('utf-8')
238
+
239
+ options = [stringify_option(k, v) for k, v in options.items()]
240
+ option_ptrs = (c_char_p * len(options))(*[c_char_p(x) for x in options])
241
+
242
+ # We keep both the options and the pointers to them so that options are
243
+ # not destroyed before we've used their values
244
+ self.options = options
245
+ self.option_ptrs = option_ptrs
246
+ self.n_options = len(options)
247
+
208
248
  def __del__(self):
209
249
  driver = NVVM()
210
250
  err = driver.nvvmDestroyProgram(byref(self._handle))
@@ -230,60 +270,35 @@ class CompilationUnit(object):
230
270
  len(buffer), None)
231
271
  self.driver.check_error(err, 'Failed to add module')
232
272
 
233
- def compile(self, **options):
234
- """Perform Compilation.
235
-
236
- Compilation options are accepted as keyword arguments, with the
237
- following considerations:
238
-
239
- - Underscores (`_`) in option names are converted to dashes (`-`), to
240
- match NVVM's option name format.
241
- - Options that take a value will be emitted in the form
242
- "-<name>=<value>".
243
- - Booleans passed as option values will be converted to integers.
244
- - Options which take no value (such as `-gen-lto`) should have a value
245
- of `None` passed in and will be emitted in the form "-<name>".
246
-
247
- For documentation on NVVM compilation options, see the CUDA Toolkit
248
- Documentation:
249
-
250
- https://docs.nvidia.com/cuda/libnvvm-api/index.html#_CPPv418nvvmCompileProgram11nvvmProgramiPPKc
273
+ def verify(self):
251
274
  """
252
-
253
- def stringify_option(k, v):
254
- k = k.replace('_', '-')
255
-
256
- if v is None:
257
- return f'-{k}'
258
-
259
- if isinstance(v, bool):
260
- v = int(v)
261
-
262
- return f'-{k}={v}'
263
-
264
- options = [stringify_option(k, v) for k, v in options.items()]
265
-
266
- c_opts = (c_char_p * len(options))(*[c_char_p(x.encode('utf8'))
267
- for x in options])
268
- # verify
269
- err = self.driver.nvvmVerifyProgram(self._handle, len(options), c_opts)
275
+ Run the NVVM verifier on all code added to the compilation unit.
276
+ """
277
+ err = self.driver.nvvmVerifyProgram(self._handle, self.n_options,
278
+ self.option_ptrs)
270
279
  self._try_error(err, 'Failed to verify\n')
271
280
 
272
- # compile
273
- err = self.driver.nvvmCompileProgram(self._handle, len(options), c_opts)
281
+ def compile(self):
282
+ """
283
+ Compile all modules added to the compilation unit and return the
284
+ resulting PTX or LTO-IR (depending on the options).
285
+ """
286
+ err = self.driver.nvvmCompileProgram(self._handle, self.n_options,
287
+ self.option_ptrs)
274
288
  self._try_error(err, 'Failed to compile\n')
275
289
 
276
- # get result
277
- reslen = c_size_t()
278
- err = self.driver.nvvmGetCompiledResultSize(self._handle, byref(reslen))
290
+ # Get result
291
+ result_size = c_size_t()
292
+ err = self.driver.nvvmGetCompiledResultSize(self._handle,
293
+ byref(result_size))
279
294
 
280
295
  self._try_error(err, 'Failed to get size of compiled result.')
281
296
 
282
- output_buffer = (c_char * reslen.value)()
297
+ output_buffer = (c_char * result_size.value)()
283
298
  err = self.driver.nvvmGetCompiledResult(self._handle, output_buffer)
284
299
  self._try_error(err, 'Failed to get compiled result.')
285
300
 
286
- # get log
301
+ # Get log
287
302
  self.log = self.get_log()
288
303
  if self.log:
289
304
  warnings.warn(self.log, category=NvvmWarning)
@@ -615,40 +630,44 @@ def llvm_replace(llvmir):
615
630
  for decl, fn in replacements:
616
631
  llvmir = llvmir.replace(decl, fn)
617
632
 
618
- llvmir = llvm140_to_70_ir(llvmir)
633
+ llvmir = llvm150_to_70_ir(llvmir)
619
634
 
620
635
  return llvmir
621
636
 
622
637
 
623
- def compile_ir(llvmir, **opts):
638
+ def compile_ir(llvmir, **options):
624
639
  if isinstance(llvmir, str):
625
640
  llvmir = [llvmir]
626
641
 
627
- if opts.pop('fastmath', False):
628
- opts.update({
642
+ if options.pop('fastmath', False):
643
+ options.update({
629
644
  'ftz': True,
630
645
  'fma': True,
631
646
  'prec_div': False,
632
647
  'prec_sqrt': False,
633
648
  })
634
649
 
635
- cu = CompilationUnit()
636
- libdevice = LibDevice()
650
+ cu = CompilationUnit(options)
637
651
 
638
652
  for mod in llvmir:
639
653
  mod = llvm_replace(mod)
640
654
  cu.add_module(mod.encode('utf8'))
655
+ cu.verify()
656
+
657
+ # We add libdevice following verification so that it is not subject to the
658
+ # verifier's requirements
659
+ libdevice = LibDevice()
641
660
  cu.lazy_add_module(libdevice.get())
642
661
 
643
- return cu.compile(**opts)
662
+ return cu.compile()
644
663
 
645
664
 
646
665
  re_attributes_def = re.compile(r"^attributes #\d+ = \{ ([\w\s]+)\ }")
647
666
 
648
667
 
649
- def llvm140_to_70_ir(ir):
668
+ def llvm150_to_70_ir(ir):
650
669
  """
651
- Convert LLVM 14.0 IR for LLVM 7.0.
670
+ Convert LLVM 15.0 IR for LLVM 7.0.
652
671
  """
653
672
  buf = []
654
673
  for line in ir.splitlines():
@@ -0,0 +1,44 @@
1
+ from llvmlite import ir
2
+ from numba.core import types
3
+ from numba.core.debuginfo import DIBuilder
4
+ from numba.cuda.types import GridGroup
5
+
6
+ _BYTE_SIZE = 8
7
+
8
+
9
+ class CUDADIBuilder(DIBuilder):
10
+
11
+ def _var_type(self, lltype, size, datamodel=None):
12
+ is_bool = False
13
+ is_grid_group = False
14
+
15
+ if isinstance(lltype, ir.IntType):
16
+ if datamodel is None:
17
+ if size == 1:
18
+ name = str(lltype)
19
+ is_bool = True
20
+ else:
21
+ name = str(datamodel.fe_type)
22
+ if isinstance(datamodel.fe_type, types.Boolean):
23
+ is_bool = True
24
+ elif isinstance(datamodel.fe_type, GridGroup):
25
+ is_grid_group = True
26
+
27
+ if is_bool or is_grid_group:
28
+ m = self.module
29
+ bitsize = _BYTE_SIZE * size
30
+ # Boolean type workaround until upstream Numba is fixed
31
+ if is_bool:
32
+ ditok = "DW_ATE_boolean"
33
+ # GridGroup type should use numba.cuda implementation
34
+ elif is_grid_group:
35
+ ditok = "DW_ATE_unsigned"
36
+
37
+ return m.add_debug_info('DIBasicType', {
38
+ 'name': name,
39
+ 'size': bitsize,
40
+ 'encoding': ir.DIToken(ditok),
41
+ })
42
+
43
+ # For other cases, use upstream Numba implementation
44
+ return super()._var_type(lltype, size, datamodel=datamodel)
@@ -4,8 +4,9 @@ import re
4
4
  import sys
5
5
  import ctypes
6
6
  import functools
7
+ from collections import defaultdict
7
8
 
8
- from numba.core import config, serialize, sigutils, types, typing, utils
9
+ from numba.core import config, ir, serialize, sigutils, types, typing, utils
9
10
  from numba.core.caching import Cache, CacheImpl
10
11
  from numba.core.compiler_lock import global_compiler_lock
11
12
  from numba.core.dispatcher import Dispatcher
@@ -42,6 +43,55 @@ cuda_fp16_math_funcs = ['hsin', 'hcos',
42
43
  reshape_funcs = ['nocopy_empty_reshape', 'numba_attempt_nocopy_reshape']
43
44
 
44
45
 
46
+ def get_cres_link_objects(cres):
47
+ """Given a compile result, return a set of all linkable code objects that
48
+ are required for it to be fully linked."""
49
+
50
+ link_objects = set()
51
+
52
+ # List of calls into declared device functions
53
+ device_func_calls = [
54
+ (name, v) for name, v in cres.fndesc.typemap.items() if (
55
+ isinstance(v, cuda_types.CUDADispatcher)
56
+ )
57
+ ]
58
+
59
+ # List of tuples with SSA name of calls and corresponding signature
60
+ call_signatures = [
61
+ (call.func.name, sig)
62
+ for call, sig in cres.fndesc.calltypes.items() if (
63
+ isinstance(call, ir.Expr) and call.op == 'call'
64
+ )
65
+ ]
66
+
67
+ # Map SSA names to all invoked signatures
68
+ call_signature_d = defaultdict(list)
69
+ for name, sig in call_signatures:
70
+ call_signature_d[name].append(sig)
71
+
72
+ # Add the link objects from the current function's callees
73
+ for name, v in device_func_calls:
74
+ for sig in call_signature_d.get(name, []):
75
+ called_cres = v.dispatcher.overloads[sig.args]
76
+ called_link_objects = get_cres_link_objects(called_cres)
77
+ link_objects.update(called_link_objects)
78
+
79
+ # From this point onwards, we are only interested in ExternFunction
80
+ # declarations - these are the calls made directly in this function to
81
+ # them.
82
+ for name, v in cres.fndesc.typemap.items():
83
+ if not isinstance(v, Function):
84
+ continue
85
+
86
+ if not isinstance(v.typing_key, ExternFunction):
87
+ continue
88
+
89
+ for obj in v.typing_key.link:
90
+ link_objects.add(obj)
91
+
92
+ return link_objects
93
+
94
+
45
95
  class _Kernel(serialize.ReduceMixin):
46
96
  '''
47
97
  CUDA Kernel specialized for a given set of argument types. When called, this
@@ -159,15 +209,8 @@ class _Kernel(serialize.ReduceMixin):
159
209
 
160
210
  self.maybe_link_nrt(link, tgt_ctx, asm)
161
211
 
162
- for k, v in cres.fndesc.typemap.items():
163
- if not isinstance(v, Function):
164
- continue
165
-
166
- if not isinstance(v.typing_key, ExternFunction):
167
- continue
168
-
169
- for obj in v.typing_key.link:
170
- lib.add_linking_file(obj)
212
+ for obj in get_cres_link_objects(cres):
213
+ lib.add_linking_file(obj)
171
214
 
172
215
  for filepath in link:
173
216
  lib.add_linking_file(filepath)
@@ -267,7 +310,11 @@ class _Kernel(serialize.ReduceMixin):
267
310
  """
268
311
  cufunc = self._codelibrary.get_cufunc()
269
312
 
270
- if hasattr(self, "target_context") and self.target_context.enable_nrt:
313
+ if (
314
+ hasattr(self, "target_context")
315
+ and self.target_context.enable_nrt
316
+ and config.CUDA_NRT_STATS
317
+ ):
271
318
  rtsys.ensure_initialized()
272
319
  rtsys.set_memsys_to_module(cufunc.module)
273
320
  # We don't know which stream the kernel will be launched on, so
@@ -3,8 +3,7 @@ from functools import cached_property
3
3
  import llvmlite.binding as ll
4
4
  from llvmlite import ir
5
5
 
6
- from numba.core import (cgutils, config, debuginfo, itanium_mangler, types,
7
- typing, utils)
6
+ from numba.core import cgutils, config, itanium_mangler, types, typing
8
7
  from numba.core.dispatcher import Dispatcher
9
8
  from numba.core.base import BaseContext
10
9
  from numba.core.callconv import BaseCallConv, MinimalCallConv
@@ -12,7 +11,8 @@ from numba.core.typing import cmathdecl
12
11
  from numba.core import datamodel
13
12
 
14
13
  from .cudadrv import nvvm
15
- from numba.cuda import codegen, nvvmutils, ufuncs
14
+ from numba.cuda import codegen, ufuncs
15
+ from numba.cuda.debuginfo import CUDADIBuilder
16
16
  from numba.cuda.models import cuda_data_manager
17
17
 
18
18
  # -----------------------------------------------------------------------------
@@ -80,7 +80,7 @@ class CUDATargetContext(BaseContext):
80
80
 
81
81
  @property
82
82
  def DIBuilder(self):
83
- return debuginfo.DIBuilder
83
+ return CUDADIBuilder
84
84
 
85
85
  @property
86
86
  def enable_boundscheck(self):
@@ -150,136 +150,6 @@ class CUDATargetContext(BaseContext):
150
150
  return itanium_mangler.mangle(name, argtypes, abi_tags=abi_tags,
151
151
  uid=uid)
152
152
 
153
- def prepare_cuda_kernel(self, codelib, fndesc, debug, lineinfo,
154
- nvvm_options, filename, linenum,
155
- max_registers=None, lto=False):
156
- """
157
- Adapt a code library ``codelib`` with the numba compiled CUDA kernel
158
- with name ``fname`` and arguments ``argtypes`` for NVVM.
159
- A new library is created with a wrapper function that can be used as
160
- the kernel entry point for the given kernel.
161
-
162
- Returns the new code library and the wrapper function.
163
-
164
- Parameters:
165
-
166
- codelib: The CodeLibrary containing the device function to wrap
167
- in a kernel call.
168
- fndesc: The FunctionDescriptor of the source function.
169
- debug: Whether to compile with debug.
170
- lineinfo: Whether to emit line info.
171
- nvvm_options: Dict of NVVM options used when compiling the new library.
172
- filename: The source filename that the function is contained in.
173
- linenum: The source line that the function is on.
174
- max_registers: The max_registers argument for the code library.
175
- """
176
- kernel_name = itanium_mangler.prepend_namespace(
177
- fndesc.llvm_func_name, ns='cudapy',
178
- )
179
- library = self.codegen().create_library(f'{codelib.name}_kernel_',
180
- entry_name=kernel_name,
181
- nvvm_options=nvvm_options,
182
- max_registers=max_registers,
183
- lto=lto
184
- )
185
- library.add_linking_library(codelib)
186
- wrapper = self.generate_kernel_wrapper(library, fndesc, kernel_name,
187
- debug, lineinfo, filename,
188
- linenum)
189
- return library, wrapper
190
-
191
- def generate_kernel_wrapper(self, library, fndesc, kernel_name, debug,
192
- lineinfo, filename, linenum):
193
- """
194
- Generate the kernel wrapper in the given ``library``.
195
- The function being wrapped is described by ``fndesc``.
196
- The wrapper function is returned.
197
- """
198
-
199
- argtypes = fndesc.argtypes
200
- arginfo = self.get_arg_packer(argtypes)
201
- argtys = list(arginfo.argument_types)
202
- wrapfnty = ir.FunctionType(ir.VoidType(), argtys)
203
- wrapper_module = self.create_module("cuda.kernel.wrapper")
204
- fnty = ir.FunctionType(ir.IntType(32),
205
- [self.call_conv.get_return_type(types.pyobject)]
206
- + argtys)
207
- func = ir.Function(wrapper_module, fnty, fndesc.llvm_func_name)
208
-
209
- prefixed = itanium_mangler.prepend_namespace(func.name, ns='cudapy')
210
- wrapfn = ir.Function(wrapper_module, wrapfnty, prefixed)
211
- builder = ir.IRBuilder(wrapfn.append_basic_block(''))
212
-
213
- if debug or lineinfo:
214
- directives_only = lineinfo and not debug
215
- debuginfo = self.DIBuilder(module=wrapper_module,
216
- filepath=filename,
217
- cgctx=self,
218
- directives_only=directives_only)
219
- debuginfo.mark_subprogram(
220
- wrapfn, kernel_name, fndesc.args, argtypes, linenum,
221
- )
222
- debuginfo.mark_location(builder, linenum)
223
-
224
- # Define error handling variable
225
- def define_error_gv(postfix):
226
- name = wrapfn.name + postfix
227
- gv = cgutils.add_global_variable(wrapper_module, ir.IntType(32),
228
- name)
229
- gv.initializer = ir.Constant(gv.type.pointee, None)
230
- return gv
231
-
232
- gv_exc = define_error_gv("__errcode__")
233
- gv_tid = []
234
- gv_ctaid = []
235
- for i in 'xyz':
236
- gv_tid.append(define_error_gv("__tid%s__" % i))
237
- gv_ctaid.append(define_error_gv("__ctaid%s__" % i))
238
-
239
- callargs = arginfo.from_arguments(builder, wrapfn.args)
240
- status, _ = self.call_conv.call_function(
241
- builder, func, types.void, argtypes, callargs)
242
-
243
- if debug:
244
- # Check error status
245
- with cgutils.if_likely(builder, status.is_ok):
246
- builder.ret_void()
247
-
248
- with builder.if_then(builder.not_(status.is_python_exc)):
249
- # User exception raised
250
- old = ir.Constant(gv_exc.type.pointee, None)
251
-
252
- # Use atomic cmpxchg to prevent rewriting the error status
253
- # Only the first error is recorded
254
-
255
- xchg = builder.cmpxchg(gv_exc, old, status.code,
256
- 'monotonic', 'monotonic')
257
- changed = builder.extract_value(xchg, 1)
258
-
259
- # If the xchange is successful, save the thread ID.
260
- sreg = nvvmutils.SRegBuilder(builder)
261
- with builder.if_then(changed):
262
- for dim, ptr, in zip("xyz", gv_tid):
263
- val = sreg.tid(dim)
264
- builder.store(val, ptr)
265
-
266
- for dim, ptr, in zip("xyz", gv_ctaid):
267
- val = sreg.ctaid(dim)
268
- builder.store(val, ptr)
269
-
270
- builder.ret_void()
271
-
272
- nvvm.set_cuda_kernel(wrapfn)
273
- library.add_ir_module(wrapper_module)
274
- if debug or lineinfo:
275
- debuginfo.finalize()
276
- library.finalize()
277
-
278
- if config.DUMP_LLVM:
279
- utils.dump_llvm(fndesc, wrapper_module)
280
-
281
- return library.get_function(wrapfn.name)
282
-
283
153
  def make_constant_array(self, builder, aryty, arr):
284
154
  """
285
155
  Unlike the parent version. This returns a a pointer in the constant
@@ -261,7 +261,8 @@ class TestLinker(CUDATestCase):
261
261
 
262
262
 
263
263
  @unittest.skipIf(
264
- not PYNVJITLINK_INSTALLED, reason="Pynvjitlink is not installed"
264
+ not PYNVJITLINK_INSTALLED or not TEST_BIN_DIR,
265
+ reason="pynvjitlink not enabled"
265
266
  )
266
267
  class TestLinkerUsage(CUDATestCase):
267
268
  """Test that whether pynvjitlink can be enabled by both environment variable
@@ -1,4 +1,4 @@
1
- from numba.tests.support import override_config
1
+ from numba.tests.support import (override_config, captured_stdout)
2
2
  from numba.cuda.testing import skip_on_cudasim
3
3
  from numba import cuda
4
4
  from numba.core import types
@@ -72,6 +72,57 @@ class TestCudaDebugInfo(CUDATestCase):
72
72
  def f(x):
73
73
  x[0] = 0
74
74
 
75
+ def test_issue_9888(self):
76
+ # Compiler created symbol should not be emitted in DILocalVariable
77
+ # See Numba Issue #9888 https://github.com/numba/numba/pull/9888
78
+ sig = (types.boolean,)
79
+
80
+ @cuda.jit(sig, debug=True, opt=False)
81
+ def f(cond):
82
+ if cond:
83
+ x = 1 # noqa: F841
84
+ else:
85
+ x = 0 # noqa: F841
86
+
87
+ llvm_ir = f.inspect_llvm(sig)
88
+ # A varible name starting with "bool" in the debug metadata
89
+ pat = r'!DILocalVariable\(.*name:\s+\"bool'
90
+ match = re.compile(pat).search(llvm_ir)
91
+ self.assertIsNone(match, msg=llvm_ir)
92
+
93
+ def test_bool_type(self):
94
+ sig = (types.int32, types.int32)
95
+
96
+ @cuda.jit("void(int32, int32)", debug=True, opt=False)
97
+ def f(x, y):
98
+ z = x == y # noqa: F841
99
+
100
+ llvm_ir = f.inspect_llvm(sig)
101
+
102
+ # extract the metadata node id from `type` field of DILocalVariable
103
+ pat = r'!DILocalVariable\(.*name:\s+"z".*type:\s+!(\d+)'
104
+ match = re.compile(pat).search(llvm_ir)
105
+ self.assertIsNotNone(match, msg=llvm_ir)
106
+ mdnode_id = match.group(1)
107
+
108
+ # verify the DIBasicType has correct encoding attribute DW_ATE_boolean
109
+ pat = rf'!{mdnode_id}\s+=\s+!DIBasicType\(.*DW_ATE_boolean'
110
+ match = re.compile(pat).search(llvm_ir)
111
+ self.assertIsNotNone(match, msg=llvm_ir)
112
+
113
+ def test_grid_group_type(self):
114
+ sig = (types.int32,)
115
+
116
+ @cuda.jit(sig, debug=True, opt=False)
117
+ def f(x):
118
+ grid = cuda.cg.this_grid() # noqa: F841
119
+
120
+ llvm_ir = f.inspect_llvm(sig)
121
+
122
+ pat = r'!DIBasicType\(.*DW_ATE_unsigned, name: "GridGroup", size: 64'
123
+ match = re.compile(pat).search(llvm_ir)
124
+ self.assertIsNotNone(match, msg=llvm_ir)
125
+
75
126
  @unittest.skip("Wrappers no longer exist")
76
127
  def test_wrapper_has_debuginfo(self):
77
128
  sig = (types.int32[::1],)
@@ -217,6 +268,45 @@ class TestCudaDebugInfo(CUDATestCase):
217
268
  three_device_fns(kernel_debug=False, leaf_debug=True)
218
269
  three_device_fns(kernel_debug=False, leaf_debug=False)
219
270
 
271
+ def _test_kernel_args_types(self):
272
+ sig = (types.int32, types.int32)
273
+
274
+ @cuda.jit("void(int32, int32)", debug=True, opt=False)
275
+ def f(x, y):
276
+ z = x + y # noqa: F841
277
+
278
+ llvm_ir = f.inspect_llvm(sig)
279
+
280
+ # extract the metadata node id from `types` field of DISubroutineType
281
+ pat = r'!DISubroutineType\(types:\s+!(\d+)\)'
282
+ match = re.compile(pat).search(llvm_ir)
283
+ self.assertIsNotNone(match, msg=llvm_ir)
284
+ mdnode_id = match.group(1)
285
+
286
+ # extract the metadata node ids from the flexible node of types
287
+ pat = rf'!{mdnode_id}\s+=\s+!{{\s+!(\d+),\s+!(\d+)\s+}}'
288
+ match = re.compile(pat).search(llvm_ir)
289
+ self.assertIsNotNone(match, msg=llvm_ir)
290
+ mdnode_id1 = match.group(1)
291
+ mdnode_id2 = match.group(2)
292
+
293
+ # verify each of the two metadata nodes match expected type
294
+ pat = rf'!{mdnode_id1}\s+=\s+!DIBasicType\(.*DW_ATE_signed,\s+name:\s+"int32"' # noqa: E501
295
+ match = re.compile(pat).search(llvm_ir)
296
+ self.assertIsNotNone(match, msg=llvm_ir)
297
+ pat = rf'!{mdnode_id2}\s+=\s+!DIBasicType\(.*DW_ATE_signed,\s+name:\s+"int32"' # noqa: E501
298
+ match = re.compile(pat).search(llvm_ir)
299
+ self.assertIsNotNone(match, msg=llvm_ir)
300
+
301
+ def test_kernel_args_types(self):
302
+ self._test_kernel_args_types()
303
+
304
+ def test_kernel_args_types_dump(self):
305
+ # see issue#135
306
+ with override_config('DUMP_LLVM', 1):
307
+ with captured_stdout():
308
+ self._test_kernel_args_types()
309
+
220
310
 
221
311
  if __name__ == '__main__':
222
312
  unittest.main()
@@ -205,6 +205,14 @@ int times2(int *out, int a)
205
205
  }
206
206
  """)
207
207
 
208
+ times3_cu = cuda.CUSource("""
209
+ extern "C" __device__
210
+ int times3(int *out, int a)
211
+ {
212
+ *out = a * 3;
213
+ return 0;
214
+ }
215
+ """)
208
216
 
209
217
  times4_cu = cuda.CUSource("""
210
218
  extern "C" __device__
@@ -351,6 +359,123 @@ class TestDeclareDevice(CUDATestCase):
351
359
  kernel[1, 1](x, 1)
352
360
  np.testing.assert_equal(x[0], 323845807)
353
361
 
362
+ def test_declared_in_called_function(self):
363
+ times2 = cuda.declare_device('times2', 'int32(int32)', link=times2_cu)
364
+
365
+ @cuda.jit
366
+ def device_func(x):
367
+ return times2(x)
368
+
369
+ @cuda.jit
370
+ def kernel(r, x):
371
+ i = cuda.grid(1)
372
+ if i < len(r):
373
+ r[i] = device_func(x[i])
374
+
375
+ x = np.arange(10, dtype=np.int32)
376
+ r = np.empty_like(x)
377
+
378
+ kernel[1, 32](r, x)
379
+
380
+ np.testing.assert_equal(r, x * 2)
381
+
382
+ def test_declared_in_called_function_twice(self):
383
+ times2 = cuda.declare_device('times2', 'int32(int32)', link=times2_cu)
384
+
385
+ @cuda.jit
386
+ def device_func_1(x):
387
+ return times2(x)
388
+
389
+ @cuda.jit
390
+ def device_func_2(x):
391
+ return device_func_1(x)
392
+
393
+ @cuda.jit
394
+ def kernel(r, x):
395
+ i = cuda.grid(1)
396
+ if i < len(r):
397
+ r[i] = device_func_2(x[i])
398
+
399
+ x = np.arange(10, dtype=np.int32)
400
+ r = np.empty_like(x)
401
+
402
+ kernel[1, 32](r, x)
403
+
404
+ np.testing.assert_equal(r, x * 2)
405
+
406
+ def test_declared_in_called_function_two_calls(self):
407
+ times2 = cuda.declare_device('times2', 'int32(int32)', link=times2_cu)
408
+
409
+ @cuda.jit
410
+ def device_func(x):
411
+ return times2(x)
412
+
413
+ @cuda.jit
414
+ def kernel(r, x):
415
+ i = cuda.grid(1)
416
+ if i < len(r):
417
+ r[i] = device_func(x[i]) + device_func(x[i] + i)
418
+
419
+ x = np.arange(10, dtype=np.int32)
420
+ r = np.empty_like(x)
421
+
422
+ kernel[1, 32](r, x)
423
+
424
+ np.testing.assert_equal(r, x * 6)
425
+
426
+ def test_call_declared_function_twice(self):
427
+ times2 = cuda.declare_device('times2', 'int32(int32)', link=times2_cu)
428
+
429
+ @cuda.jit
430
+ def kernel(r, x):
431
+ i = cuda.grid(1)
432
+ if i < len(r):
433
+ r[i] = times2(x[i]) + times2(x[i] + i)
434
+
435
+ x = np.arange(10, dtype=np.int32)
436
+ r = np.empty_like(x)
437
+
438
+ kernel[1, 32](r, x)
439
+
440
+ np.testing.assert_equal(r, x * 6)
441
+
442
+ def test_declared_in_called_function_and_parent(self):
443
+ times2 = cuda.declare_device('times2', 'int32(int32)', link=times2_cu)
444
+
445
+ @cuda.jit
446
+ def device_func(x):
447
+ return times2(x)
448
+
449
+ @cuda.jit
450
+ def kernel(r, x):
451
+ i = cuda.grid(1)
452
+ if i < len(r):
453
+ r[i] = device_func(x[i]) + times2(x[i])
454
+
455
+ x = np.arange(10, dtype=np.int32)
456
+ r = np.empty_like(x)
457
+
458
+ kernel[1, 32](r, x)
459
+
460
+ np.testing.assert_equal(r, x * 4)
461
+
462
+ def test_call_two_different_declared_functions(self):
463
+ times2 = cuda.declare_device('times2', 'int32(int32)', link=times2_cu)
464
+ times3 = cuda.declare_device('times3', 'int32(int32)', link=times3_cu)
465
+
466
+ @cuda.jit
467
+ def kernel(r, x):
468
+ i = cuda.grid(1)
469
+ if i < len(r):
470
+ r[i] = times2(x[i]) + times3(x[i])
471
+
472
+ x = np.arange(10, dtype=np.int32)
473
+ r = np.empty_like(x)
474
+
475
+ kernel[1, 32](r, x)
476
+
477
+ np.testing.assert_equal(r, x * 5)
478
+
354
479
 
355
480
  if __name__ == '__main__':
356
481
  unittest.main()
@@ -171,7 +171,10 @@ class TestNrtStatistics(CUDATestCase):
171
171
  arr = cuda_arange(5 * tmp[0]) # noqa: F841
172
172
  return None
173
173
 
174
- with override_config('CUDA_ENABLE_NRT', True):
174
+ with (
175
+ override_config('CUDA_ENABLE_NRT', True),
176
+ override_config('CUDA_NRT_STATS', True)
177
+ ):
175
178
  # Switch on stats
176
179
  rtsys.memsys_enable_stats()
177
180
  # check the stats are on
@@ -18,7 +18,10 @@ class TestNrtRefCt(EnableNRTStatsMixin, CUDATestCase):
18
18
  super(TestNrtRefCt, self).tearDown()
19
19
 
20
20
  def run(self, result=None):
21
- with override_config("CUDA_ENABLE_NRT", True):
21
+ with (
22
+ override_config("CUDA_ENABLE_NRT", True),
23
+ override_config('CUDA_NRT_STATS', True)
24
+ ):
22
25
  super(TestNrtRefCt, self).run(result)
23
26
 
24
27
  def test_no_return(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: numba-cuda
3
- Version: 0.5.0
3
+ Version: 0.7.0
4
4
  Summary: CUDA target for Numba
5
5
  Author: Anaconda Inc., NVIDIA Corporation
6
6
  License: BSD 2-clause
@@ -1,6 +1,6 @@
1
1
  _numba_cuda_redirector.pth,sha256=cmfMMmV0JPh3yEpl4bGeM9AuXiVVMSo6Z_b7RaQL3XE,30
2
2
  _numba_cuda_redirector.py,sha256=QKJmYICSQvjvph0Zw9OW015MsuKxIF28GPFjR35AXLM,2681
3
- numba_cuda/VERSION,sha256=oK1QZAE5pST4ZZEVcUW_HUZ06pwGW_6iFVjw97BEMMg,6
3
+ numba_cuda/VERSION,sha256=ln2a-xATRmZxZvLnboGRC8GQSI19QdUMoAcunZLwDjI,6
4
4
  numba_cuda/__init__.py,sha256=atXeUvJKR3JHcAiCFbXCVOJQUHgB1TulmsqSL_9RT3Q,114
5
5
  numba_cuda/_version.py,sha256=jbdUsbR7sVllw0KxQNB0-FMd929CGg3kH2fhHdrlkuc,719
6
6
  numba_cuda/numba/cuda/__init__.py,sha256=idyVHOObC9lTYnp62v7rVprSacRM4d5F6vhXfG5ElTI,621
@@ -9,7 +9,7 @@ numba_cuda/numba/cuda/api_util.py,sha256=aQfUV2-4RM_oGVvckMjbMr5e3effOQNX04v1T0O
9
9
  numba_cuda/numba/cuda/args.py,sha256=HloHkw_PQal2DT-I70Xf_XbnGObS1jiUgcRrQ85Gq28,1978
10
10
  numba_cuda/numba/cuda/cg.py,sha256=9V1uZqyGOJX1aFd9c6GAPbLSqq83lE8LoP-vxxrKENY,1490
11
11
  numba_cuda/numba/cuda/codegen.py,sha256=ghdYBKZ3Mzk2UlLE64HkrAjb60PN9fibSNkWFRQuj4M,13184
12
- numba_cuda/numba/cuda/compiler.py,sha256=FHiDD_9ovsleJrRYprmiVl5QOBm0TDQFgDwcbwDnURk,21386
12
+ numba_cuda/numba/cuda/compiler.py,sha256=zwTPJ7JkW3dj8rkAuYFh3jBSpT4qNow97YcXluhPatI,24323
13
13
  numba_cuda/numba/cuda/cpp_function_wrappers.cu,sha256=iv84_F6Q9kFjV_kclrQz1msh6Dud8mI3qNkswTid7Qc,953
14
14
  numba_cuda/numba/cuda/cuda_fp16.h,sha256=1IC0mdNdkvKbvAe0-f4uYVS7WFrVqOyI1nRUbBiqr6A,126844
15
15
  numba_cuda/numba/cuda/cuda_fp16.hpp,sha256=vJ7NUr2X2tKhAP7ojydAiCoOjVO6n4QGoXD6m9Srrlw,89130
@@ -17,11 +17,12 @@ numba_cuda/numba/cuda/cuda_paths.py,sha256=C0gA72QLWUMfvXkFpw1WqqaFqfsQ7HM72hQVX
17
17
  numba_cuda/numba/cuda/cudadecl.py,sha256=6h_Je6cXmfr4VjBowkr-OOGlsXei-QqGlcjU4Yv-m-4,23438
18
18
  numba_cuda/numba/cuda/cudaimpl.py,sha256=0oHjDwBC4JmfpwS1Fsn1bm5YWVru5vZvvnO414P4TS0,38840
19
19
  numba_cuda/numba/cuda/cudamath.py,sha256=EFNtdzEytAZuwijdRoFGzVKCeal76UzzaNy7wUFQx8I,3978
20
+ numba_cuda/numba/cuda/debuginfo.py,sha256=lMIs7UAOfkqUvD9sx-nNEY8qP9DhWF9X38xnW3yo_Qc,1433
20
21
  numba_cuda/numba/cuda/decorators.py,sha256=MqmbEXVVgIV1G_feYtccKBRTDL0VALWf0LjbrVfJo4s,8041
21
22
  numba_cuda/numba/cuda/descriptor.py,sha256=rNMaurJkjNjIBmHPozDoLC35DMURE0fn_LtnXRmaG_w,985
22
23
  numba_cuda/numba/cuda/device_init.py,sha256=lP79tCsQ0Np9xcbjv_lXcH4JOiVZvV8nwg3INdETxsc,3586
23
24
  numba_cuda/numba/cuda/deviceufunc.py,sha256=yxAH71dpgJWK8okmCJm0FUV6z2AqdThCYOTZspT7z0M,30775
24
- numba_cuda/numba/cuda/dispatcher.py,sha256=weI2KSXt51XOpsUF1k5MGAlo_2cc8b3qF5ivVnit2M0,42833
25
+ numba_cuda/numba/cuda/dispatcher.py,sha256=j2nAjlqNAIAoQVCQ4ZQD--hQDsnFLXedlvaXdCMNKEc,44354
25
26
  numba_cuda/numba/cuda/errors.py,sha256=XwWHzCllx0DXU6BQdoRH0m3pznGxnTFOBTVYXMmCfqg,1724
26
27
  numba_cuda/numba/cuda/extending.py,sha256=URsyBYls2te-mgE0yvDY6akvawYCA0blBFfD7Lf9DO4,142
27
28
  numba_cuda/numba/cuda/initialize.py,sha256=TQGHGLQoq4ch4J6CLDcJdGsZzXM-g2kDgdyO1u-Rbhg,546
@@ -39,7 +40,7 @@ numba_cuda/numba/cuda/random.py,sha256=khX8iDdde_RTUPWhAqrxZacHRQAorFr7BokPuxRWz
39
40
  numba_cuda/numba/cuda/reshape_funcs.cu,sha256=H5UAa-VAvoxW9SQwJO88ZrDXC64nWALW3Ch4cHAAqO4,4325
40
41
  numba_cuda/numba/cuda/simulator_init.py,sha256=W_bPRtmPGOQVuiprbgt7ENnnnELv_LPCeLDIsfsvFZ8,460
41
42
  numba_cuda/numba/cuda/stubs.py,sha256=W3tozv4ganMnfbdFqyPjgQXYeX8GQhwx_xXgv8jk6iM,22270
42
- numba_cuda/numba/cuda/target.py,sha256=hBflzmxCGlmTugWT1sYhZj9f4HkQAMK2RQ9lO85pMW4,17052
43
+ numba_cuda/numba/cuda/target.py,sha256=MWpdHs2K17Lus4e318FNbR533q24MhovGS6Q1ob9x_4,11354
43
44
  numba_cuda/numba/cuda/testing.py,sha256=tG1FBm_gqW4esDxCaecMvCRKvwYEg7Yu2Q60ARNnes0,6873
44
45
  numba_cuda/numba/cuda/types.py,sha256=WVfjcly_VUpG9FfKueiEPzZm2NV8Hg0XAFg3bNzPdVc,1314
45
46
  numba_cuda/numba/cuda/ufuncs.py,sha256=txw27IxG80W1Yo7e-XwL2AMcQo0fMnxMjBIMy-n5pCo,23317
@@ -59,7 +60,7 @@ numba_cuda/numba/cuda/cudadrv/linkable_code.py,sha256=bWBvnndrzWu24SXm7cilCwNFXS
59
60
  numba_cuda/numba/cuda/cudadrv/mappings.py,sha256=-dTPHvAkDjdH6vS5OjgrB71AFuqKO6CRgf7hpOk2wiw,802
60
61
  numba_cuda/numba/cuda/cudadrv/ndarray.py,sha256=HtULWWFyDlgqvrH5459yyPTvU4UbUo2DSdtcNfvbH00,473
61
62
  numba_cuda/numba/cuda/cudadrv/nvrtc.py,sha256=XM9_Vllv7HzH5wZIR2lwFictyX68XDtNbyLkXlL6NTI,11003
62
- numba_cuda/numba/cuda/cudadrv/nvvm.py,sha256=cAoQmZ0bO8i3wPTQq5D0UeMtfnXdGebqYpU4W0kUIEY,24237
63
+ numba_cuda/numba/cuda/cudadrv/nvvm.py,sha256=AgrWDNnGfIjvnTsQcEix60EnhFSI8Nbg7oOf5VWk87g,25038
63
64
  numba_cuda/numba/cuda/cudadrv/rtapi.py,sha256=WdeUoWzsYNYodx8kMRLVIjnNs0QzwpCihd2Q0AaqItE,226
64
65
  numba_cuda/numba/cuda/cudadrv/runtime.py,sha256=Tj9ACrzQqNmDSO6xfpzw12EsQknSywQ-ZGuWMbDdHnQ,4255
65
66
  numba_cuda/numba/cuda/kernels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -110,7 +111,7 @@ numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py,sha256=0KPe4E9wOZsSV_0QI0Lmj
110
111
  numba_cuda/numba/cuda/tests/cudadrv/test_linker.py,sha256=_l2_EQEko2Jet5ooj4XMT0L4BjOuqLjbONGj1_MVI50,10161
111
112
  numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py,sha256=kYXYMkx_3GPAITKp4reLeM8KSzKkpxiC8nxnBvXpaTA,4979
112
113
  numba_cuda/numba/cuda/tests/cudadrv/test_mvc.py,sha256=984jATSa01SRoSrVqxPeO6ujJ7w2jsnZa39ABInFLVI,1529
113
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py,sha256=oZywLDuX-l1LJvIIU4QCsE7UCwtIKbBP7u6GxVDpD_g,11316
114
+ numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py,sha256=EPS4-U2tnqFCG-QF-9j2POMKaYiWogHIbpknMwdYGD8,11335
114
115
  numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py,sha256=DF7KV5uh-yMztks0f47NhpalV64dvsNy-f8HY6GhAhE,7373
115
116
  numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py,sha256=u_TthSS2N-2J4eBIuF4PGg33AjD-wxly7MKpz0vRAKc,944
116
117
  numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py,sha256=MQWZx1j3lbEpWmIpQ1bV9szrGOV3VHN0QrEnJRjAhW4,508
@@ -145,8 +146,8 @@ numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py,sha256=73FCQbNaA
145
146
  numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py,sha256=y7cNQZOZJo5Sv16ql3E5QaRksw-U3RkXss9YDcNeiTk,2137
146
147
  numba_cuda/numba/cuda/tests/cudapy/test_datetime.py,sha256=2in1Cq8y9zAFoka7H72wF1D0awEd3n7bv56sUPgoNAQ,3508
147
148
  numba_cuda/numba/cuda/tests/cudapy/test_debug.py,sha256=3MYNiMe75rgBF1T0vsJ7r-nkW5jPvov_tDms9KXo2UU,3449
148
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py,sha256=8Tm1iD2x1BRryB1QY6qp6tdjJCE6Tx9p0LzcYwiExIU,7922
149
- numba_cuda/numba/cuda/tests/cudapy/test_device_func.py,sha256=2EIJjaCGnHDAjpN2t5g2LNbqfhMxYTC51rT5baKA5mc,9988
149
+ numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py,sha256=SbeIIASsv5eZapp6i9KZlztN3-OPFiXg6YmtbYIh0eY,11288
150
+ numba_cuda/numba/cuda/tests/cudapy/test_device_func.py,sha256=eDVymTQXTzW0WeAgTMDKYtOi1YAM310IUxGp3Y1ICjs,13162
150
151
  numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py,sha256=oX-l_L4H8rME1IolwhAyordSGJ152nnuqGAFdWjfgas,26587
151
152
  numba_cuda/numba/cuda/tests/cudapy/test_enums.py,sha256=0GWiwvZ1FTzSl1FfMxttkWaWrowASfXrSDT8XAR4ZHw,3560
152
153
  numba_cuda/numba/cuda/tests/cudapy/test_errors.py,sha256=jwHbNb2Ro5pbGOPFetmUhI-vG4s36OKCqMJ-lgWxHMY,2620
@@ -238,14 +239,14 @@ numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py,sha256=7kJOPHEcrjy_kTA
238
239
  numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py,sha256=n0_-xFaw6QqiZbhe55oy7lnEeOwqTvA55p5EUFiTpNw,2006
239
240
  numba_cuda/numba/cuda/tests/nrt/__init__.py,sha256=43EXdiXXRBd6yIcVGMrU9F_EJCD9Uw3mzOP3SB53AEE,260
240
241
  numba_cuda/numba/cuda/tests/nrt/mock_numpy.py,sha256=Cx2DGhm2bJheShP2Ja1w9YLlRTeAMM7u1UYHsPnTzA8,4552
241
- numba_cuda/numba/cuda/tests/nrt/test_nrt.py,sha256=b3rtK018qslhUU5UsAAa3s-mjlnlfxAwTJmARTVD2j4,7650
242
- numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py,sha256=Wq46oICum9IXnbQ97vV8V7g-3U01PLQEQbaGSNdRuMg,3163
242
+ numba_cuda/numba/cuda/tests/nrt/test_nrt.py,sha256=wByXeagVoxsAu_pmfuYQ7vmeJt82h4VXwCBsDYQfsps,7727
243
+ numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py,sha256=SnVvTis8YyaqsElRaGQ-34dnWgGavvc2Ovm2xZ_PD3Q,3240
243
244
  numba_cuda/numba/cuda/tests/test_binary_generation/Makefile,sha256=P2WzCc5d64JGq6pJwHEwmKVmJOJxPBtsMTbnuzqYkik,2679
244
245
  numba_cuda/numba/cuda/tests/test_binary_generation/generate_raw_ltoir.py,sha256=V0raLZLGSiWbE_K-JluI0CnmNkXbhlMVj-TH7P1OV8E,5014
245
246
  numba_cuda/numba/cuda/tests/test_binary_generation/test_device_functions.cu,sha256=cUf-t6ZM9MK_x7X_aKwsrKW1LdR97XcpR-qnYr5faOE,453
246
247
  numba_cuda/numba/cuda/tests/test_binary_generation/undefined_extern.cu,sha256=q3oxZziT8KDodeNcEBiWULH6vMrHCWucmJmtrg8C0d0,128
247
- numba_cuda-0.5.0.dist-info/LICENSE,sha256=eHeYE-XjASmwbxfsP5AImgfzRwZurZGqH1f6OFwJ4io,1326
248
- numba_cuda-0.5.0.dist-info/METADATA,sha256=ZcZ1vxC3J23snRGKPsm6spYu7Y7n9TVLWXaS5jmqgKA,1836
249
- numba_cuda-0.5.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
250
- numba_cuda-0.5.0.dist-info/top_level.txt,sha256=C50SsH-8tXDmt7I0Y3nlJYhS5s6pqWflCPdobe9vx2M,11
251
- numba_cuda-0.5.0.dist-info/RECORD,,
248
+ numba_cuda-0.7.0.dist-info/LICENSE,sha256=eHeYE-XjASmwbxfsP5AImgfzRwZurZGqH1f6OFwJ4io,1326
249
+ numba_cuda-0.7.0.dist-info/METADATA,sha256=tq7106PKB0M6Qf-HpEjH_BoUBndW2MA7XsFVAKmbbqc,1836
250
+ numba_cuda-0.7.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
251
+ numba_cuda-0.7.0.dist-info/top_level.txt,sha256=C50SsH-8tXDmt7I0Y3nlJYhS5s6pqWflCPdobe9vx2M,11
252
+ numba_cuda-0.7.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5