numba-dpex icon indicating copy to clipboard operation
numba-dpex copied to clipboard

Calling functions inside prange doesn't work

Open DrTodd13 opened this issue 1 year ago • 1 comments

import dpnp
import numba_dpex
import numba
import numba.cpython.unsafe.tuple as UT

@numba_dpex.dpjit
def njfiller(i1, i2):
    return i1 + i1

@numba_dpex.dpjit
def do_fill(A, sz, starts):
    for i in numba.pndindex(sz):
        arg = sz
        A[i] = njfiller(0,1)

A = dpnp.ones((100,100))
do_fill(A, (100,100), (0,0))
print("DONE")
Traceback (most recent call last):
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/lowerer.py", line 1389, in lower
    self.gpu_lower.lower()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 168, in lower
    self.lower_normal_function(self.fndesc)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 222, in lower_normal_function
    entry_block_tail = self.lower_function_body()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 251, in lower_function_body
    self.lower_block(block)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 265, in lower_block
    self.lower_inst(inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 439, in lower_inst
    val = self.lower_assign(ty, inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 620, in lower_assign
    res = self.context.get_constant_generic(self.builder, ty,
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/base.py", line 509, in get_constant_generic
    return impl(self, builder, ty, val)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/experimental/function_type.py", line 66, in lower_constant_dispatcher
    return context.add_dynamic_addr(builder, id(pyval),
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/base.py", line 1086, in add_dynamic_addr
    assert self.allow_dynamic_globals, "dyn globals disabled in this target"
AssertionError: dyn globals disabled in this target

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/errors.py", line 823, in new_error_context
    yield
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 265, in lower_block
    self.lower_inst(inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 439, in lower_inst
    val = self.lower_assign(ty, inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 626, in lower_assign
    return self.lower_expr(ty, value)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 1162, in lower_expr
    res = self.lower_call(resty, expr)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 891, in lower_call
    res = self._lower_call_normal(fnty, expr, signature)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 1125, in _lower_call_normal
    impl = self.context.get_function(fnty, signature)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/base.py", line 559, in get_function
    return self.get_function(fn, sig, _firstcall=False)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/base.py", line 561, in get_function
    raise NotImplementedError("No definition for lowering %s%s" % (key, sig))
NotImplementedError: No definition for lowering <function get_global_id at 0x7f665003dca0>(uint32,) -> int64

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/parfor_lowering_pass.py", line 206, in _lower_parfor_as_kernel
    psrfor_kernel = create_kernel_for_parfor(
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/utils/kernel_builder.py", line 438, in create_kernel_for_parfor
    sycl_kernel = _compile_kernel_parfor(
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/utils/kernel_builder.py", line 75, in _compile_kernel_parfor
    kernel.compile(
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/kernel_interface/spirv_kernel.py", line 123, in compile
    cres = compile_with_dpex(
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_lock.py", line 35, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/compiler.py", line 80, in compile_with_dpex
    cres = compiler.compile_ir(
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 779, in compile_ir
    return pipeline.compile_ir(func_ir=func_ir, lifted=lifted,
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 462, in compile_ir
    return self._compile_ir()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 527, in _compile_ir
    return self._compile_core()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 499, in _compile_core
    raise e
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 486, in _compile_core
    pm.run(self.state)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 368, in run
    raise patched_exception
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 356, in run
    self._runPass(idx, pass_inst, state)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_lock.py", line 35, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 311, in _runPass
    mutated |= check(pss.run_pass, internal_state)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 273, in check
    mangled = func(compiler_state)
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/passes.py", line 436, in run_pass
    lower.lower()
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/lowerer.py", line 1426, in lower
    self.cpu_lower.lower()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 168, in lower
    self.lower_normal_function(self.fndesc)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 222, in lower_normal_function
    entry_block_tail = self.lower_function_body()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 251, in lower_function_body
    self.lower_block(block)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 265, in lower_block
    self.lower_inst(inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/contextlib.py", line 137, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/errors.py", line 837, in new_error_context
    raise newerr.with_traceback(tb)
numba.core.errors.LoweringError: Failed in dpex_offload_nopython mode pipeline (step: Custom Lowerer with auto-offload support)
^[[1m^[[1mNo definition for lowering <function get_global_id at 0x7f665003dca0>(uint32,) -> int64
^[[1m
File "<string>", line 2:^[[0m
^[[1m<source missing, REPL/exec in use?>^[[0m
^[[0m
^[[0m^[[1mDuring: lowering "parfor__index_12 = call $4load_method.1.30($const6.2.31, func=$4load_method.1.30, args=[Var($const6.2.31, <string>:2)], kws=(), vararg=None, varkwarg=None, target=None)" at <string> (2)^[[0m

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/errors.py", line 823, in new_error_context
    yield
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 265, in lower_block
    self.lower_inst(inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 567, in lower_inst
    func(self, inst)
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/parfor_lowering_pass.py", line 269, in lower_parfor_dpex
    parfor.lowerer(lowerer, parfor)
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/parfor_lowering_pass.py", line 218, in _lower_parfor_as_kernel
    raise UnsupportedParforError
numba_dpex.core.exceptions.UnsupportedParforError: Expression cannot be offloaded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/t2.py", line 22, in <module>
    do_fill(A, (100,100), (0,0))
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/dispatcher.py", line 487, in _compile_for_args
    raise e
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/dispatcher.py", line 420, in _compile_for_args
    return_val = self.compile(tuple(argtypes))
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/dispatcher.py", line 965, in compile
    cres = self._compiler.compile(args, return_type)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/dispatcher.py", line 125, in compile
    status, retval = self._compile_cached(args, return_type)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/dispatcher.py", line 139, in _compile_cached
    retval = self._compile_core(args, return_type)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/dispatcher.py", line 152, in _compile_core
    cres = compiler.compile_extra(self.targetdescr.typing_context,
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 716, in compile_extra
    return pipeline.compile_extra(func)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 452, in compile_extra
    return self._compile_bytecode()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 520, in _compile_bytecode
    return self._compile_core()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 499, in _compile_core
    raise e
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler.py", line 486, in _compile_core
    pm.run(self.state)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 368, in run
    raise patched_exception
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 356, in run
    self._runPass(idx, pass_inst, state)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_lock.py", line 35, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 311, in _runPass
    mutated |= check(pss.run_pass, internal_state)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/compiler_machinery.py", line 273, in check
    mangled = func(compiler_state)
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/parfor_lowering_pass.py", line 372, in run_pass
    lower.lower()
  File "/localdisk/work/taanders/github/numba-dpex/numba_dpex/core/passes/parfor_lowering_pass.py", line 310, in lower
    self.dpex_lower.lower()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 168, in lower
    self.lower_normal_function(self.fndesc)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 222, in lower_normal_function
    entry_block_tail = self.lower_function_body()
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 251, in lower_function_body
    self.lower_block(block)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/lowering.py", line 265, in lower_block
    self.lower_inst(inst)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/contextlib.py", line 137, in __exit__
    self.gen.throw(typ, value, traceback)
  File "/localdisk/work/taanders/miniconda3/envs/dppl39/lib/python3.9/site-packages/numba/core/errors.py", line 837, in new_error_context
    raise newerr.with_traceback(tb)
numba.core.errors.LoweringError: Failed in dpex_dpjit_nopython mode pipeline (step: Custom lowerer for dpex parfor nodes)
^[[1m^[[1mExpression cannot be offloaded
^[[1m
File "../../../../../tmp/t2.py", line 12:^[[0m
^[[1mdef do_fill(A, sz, starts):
^[[1m    for i in numba.pndindex(sz):
^[[0m    ^[[1m^^[[0m^[[0m
^[[0m
^[[0m^[[1mDuring: lowering "id=0[LoopNest(index_variable = parfor_index.12, range = (0, sz_size0.3, 1)), LoopNest(index_variable = parfor_index.13, range = (0, sz_size1.4, 1))]{14: <ir.Block at /tmp/t2.py (12)>}Var($parfor_index_tuple_var.14, t2.py:12)" at /tmp/t2.py (12)^[[0m

DrTodd13 avatar Apr 05 '23 21:04 DrTodd13

I was able to reproduce the issue. It looks like the problem is not that dpjit does not support dpjit function calls. In fact I was able to run this code:

import dpnp
import numba_dpex
import numba

@numba_dpex.dpjit
def njfiller(i1, i2):
    return i1 + i2

@numba_dpex.dpjit
def do_fill(A):
    # for i in numba.prange(A.size):
    for i in range(A.size):
        A[i] = njfiller(dpnp.float32(0), dpnp.float32(1))

A = dpnp.zeros(100, dtype=dpnp.float32)
do_fill(A)
print(A)

The issue is happening whenever I'm trying to call any function inside numba.prange. It is the same issue I've been facing in https://github.com/IntelPython/numba-dpex/issues/1063

ZzEeKkAa avatar Aug 23 '23 13:08 ZzEeKkAa