Hi, I found that I could not use parallel=True, kw=None and nested loops with if statements together. But if one of those conditions aren’t met, it works again.
Is it supposed to function like that?
Example:
import numpy as np
from numba import njit, prange
@njit(parallel=True)
def foo(max_val=None):
if max_val is None:
max_val = 20
arr = np.arange(30)
val = 0
for i in prange(len(arr)):
val += arr[i]
for j in range(len(arr)):
if arr[j] > max_val:
break
return val
print(foo())
# LoweringError: Failed in nopython mode pipeline (step: native lowering)
# cannot store {i64, i1} to {i64, i8}*: mismatching types
#
# File "../../../../../../opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/numba/parfors/parfor.py", line 402:
# def arange_4(start, stop, step, dtype):
# <source elided>
# val = start
# for i in numba.parfors.parfor.internal_prange(nitems):
# ^
#
# During: lowering "id=51[LoopNest(index_variable = parfor_index.2083, range = (0, arange_parallel_impl__locals__arange_4_v142_nitems, 1))]{42: <ir.Block at /opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/numba/parfors/parfor.py (402)>, 3713: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (23)>, 90: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (25)>, 92: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (25)>, 93: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (27)>, 3711: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (27)>}Var(parfor_index.2083, parfor.py:402)" at /opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/numba/parfors/parfor.py (402)
@njit(parallel=True)
def bar(max_val=0):
if max_val == 0:
max_val = 20
arr = np.arange(30)
val = 0
for i in prange(len(arr)):
val += arr[i]
for j in range(len(arr)):
if arr[j] > max_val:
break
return val
print(bar())
# 435
@njit(parallel=True)
def baz(max_val=None):
if max_val is None:
max_val = 20
arr = np.arange(30)
val = 0
for i in prange(len(arr)):
val += arr[i]
for j in range(len(arr)):
boo = arr[j] > max_val
return val
print(baz())
# 13485
@njit(parallel=False)
def qux(max_val=None):
if max_val is None:
max_val = 20
arr = np.arange(30)
val = 0
for i in prange(len(arr)):
val += arr[i]
for j in range(len(arr)):
if arr[j] > max_val:
break
return val
print(qux())
# 435