Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.

Commit 55bd60e

Browse files
authored
Fix slicing for openmp target mappings (#38)
- Pass start of NameSlice to array*data start of slice value. - Add two slicing tests. - Fix not equal assertion. - Change array data struct transfer to use start index and number of elements to match the way the runtime does it. - Better naming and comments for the tests that do slices of arrays and access either the part transferred or not. - Remove commented code that isn't needed anymore. Give better explanation of why we need lowerer.loadvar for variables created inside the lowerer.
1 parent 352d2ab commit 55bd60e

File tree

2 files changed

+79
-46
lines changed

2 files changed

+79
-46
lines changed

numba/openmp.py

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,59 +1429,55 @@ def add_struct_tags(self, var_table):
14291429
the_slice = cur_tag.arg.the_slice[0][0]
14301430
assert the_slice.step is None
14311431
if isinstance(the_slice.start, int):
1432-
omp_slice_start = the_slice.start
1432+
start_index_var = ir.Var(None, f"{cur_tag_var}_start_index_var{target_num}{uniqueness}", array_var.loc)
1433+
start_assign = ir.Assign(ir.Const(the_slice.start, array_var.loc), start_index_var, array_var.loc)
1434+
1435+
typemap[start_index_var.name] = types.int64
1436+
lowerer.lower_inst(start_assign)
1437+
extras_before.append(start_assign)
1438+
lowerer._alloca_var(start_index_var.name, typemap[start_index_var.name])
1439+
lowerer.loadvar(start_index_var.name)
14331440
else:
1434-
omp_slice_start = the_slice.start
1435-
assert isinstance(omp_slice_start, str)
1436-
omp_slice_start = ir.Var(None, omp_slice_start, array_var.loc)
1441+
start_index_var = the_slice.start
1442+
assert isinstance(start_index_var, str)
1443+
start_index_var = ir.Var(None, start_index_var, array_var.loc)
14371444
if isinstance(the_slice.stop, int):
1438-
size_var = the_slice.stop
1445+
end_index_var = ir.Var(None, f"{cur_tag_var}_end_index_var{target_num}{uniqueness}", array_var.loc)
1446+
end_assign = ir.Assign(ir.Const(the_slice.stop, array_var.loc), end_index_var, array_var.loc)
1447+
typemap[end_index_var.name] = types.int64
1448+
lowerer.lower_inst(end_assign)
1449+
extras_before.append(end_assign)
1450+
lowerer._alloca_var(end_index_var.name, typemap[end_index_var.name])
1451+
lowerer.loadvar(end_index_var.name)
14391452
else:
1440-
size_var = the_slice.stop
1441-
assert isinstance(size_var, str)
1442-
size_var = ir.Var(None, size_var, array_var.loc)
1453+
end_index_var = the_slice.stop
1454+
assert isinstance(end_index_var, str)
1455+
end_index_var = ir.Var(None, end_index_var, array_var.loc)
1456+
1457+
num_elements_var = ir.Var(None, f"{cur_tag_var}_num_elements_var{target_num}{uniqueness}", array_var.loc)
1458+
size_binop = ir.Expr.binop(operator.sub, end_index_var, start_index_var, array_var.loc)
1459+
size_assign = ir.Assign(size_binop, num_elements_var, array_var.loc)
1460+
calltypes[size_binop] = typing.signature(types.int64, types.int64, types.int64)
14431461
else:
1444-
omp_slice_start = 0
1445-
size_var = ir.Var(None, f"{cur_tag_var}_size_var{target_num}{uniqueness}", array_var.loc)
1446-
#size_var = array_var.scope.redefine("size_var", array_var.loc)
1462+
start_index_var = 0
1463+
num_elements_var = ir.Var(None, f"{cur_tag_var}_num_elements_var{target_num}{uniqueness}", array_var.loc)
14471464
size_getattr = ir.Expr.getattr(array_var, "size", array_var.loc)
1448-
size_assign = ir.Assign(size_getattr, size_var, array_var.loc)
1449-
typemap[size_var.name] = types.int64
1450-
lowerer.lower_inst(size_assign)
1451-
extras_before.append(size_assign)
1452-
lowerer._alloca_var(size_var.name, typemap[size_var.name])
1453-
1454-
# see core/datamodel/models.py
1455-
loaded_size = lowerer.loadvar(size_var.name)
1456-
loaded_op = loaded_size.operands[0]
1457-
loaded_pointee = loaded_op.type.pointee
1458-
loaded_str = str(loaded_pointee) + " * " + loaded_size._get_reference()
1459-
1460-
#--------
1461-
"""
1462-
itemsize_var = ir.Var(None, cur_tag_var + "_itemsize_var", array_var.loc)
1463-
itemsize_getattr = ir.Expr.getattr(array_var, "itemsize", array_var.loc)
1464-
itemsize_assign = ir.Assign(itemsize_getattr, itemsize_var, array_var.loc)
1465-
typemap[itemsize_var.name] = types.int64
1466-
lowerer.lower_inst(itemsize_assign)
1467-
#--------
1468-
1469-
totalsize_var = ir.Var(None, cur_tag_var + "_totalsize_var", array_var.loc)
1470-
totalsize_binop = ir.Expr.binop(operator.mul, size_var, itemsize_var, array_var.loc)
1471-
totalsize_assign = ir.Assign(totalsize_binop, totalsize_var, array_var.loc)
1472-
calltypes[totalsize_binop] = typing.signature(types.int64, types.int64, types.int64)
1473-
typemap[totalsize_var.name] = types.int64
1474-
lowerer.lower_inst(totalsize_assign)
1475-
#--------
1476-
"""
1465+
size_assign = ir.Assign(size_getattr, num_elements_var, array_var.loc)
1466+
1467+
typemap[num_elements_var.name] = types.int64
1468+
lowerer.lower_inst(size_assign)
1469+
extras_before.append(size_assign)
1470+
lowerer._alloca_var(num_elements_var.name, typemap[num_elements_var.name])
1471+
1472+
# see core/datamodel/models.py
1473+
lowerer.loadvar(num_elements_var.name) # alloca the var
14771474

14781475
# see core/datamodel/models.py
1479-
if isinstance(size_var, ir.Var):
1480-
loaded_size = lowerer.loadvar(size_var.name)
1481-
loaded_op = loaded_size.operands[0]
1482-
loaded_pointee = loaded_op.type.pointee
1483-
loaded_str = str(loaded_pointee) + " * " + loaded_size._get_reference()
1484-
struct_tags.append(openmp_tag(cur_tag.name + ".STRUCT", cur_tag_var + "*data", non_arg=True, omp_slice=(0, size_var)))
1476+
if isinstance(start_index_var, ir.Var):
1477+
lowerer.loadvar(start_index_var.name) # alloca the var
1478+
if isinstance(num_elements_var, ir.Var):
1479+
lowerer.loadvar(num_elements_var.name) # alloca the var
1480+
struct_tags.append(openmp_tag(cur_tag.name + ".STRUCT", cur_tag_var + "*data", non_arg=True, omp_slice=(start_index_var, num_elements_var)))
14851481
struct_tags.append(openmp_tag("QUAL.OMP.MAP.TO.STRUCT", cur_tag_var + "*shape", non_arg=True, omp_slice=(0, 1)))
14861482
struct_tags.append(openmp_tag("QUAL.OMP.MAP.TO.STRUCT", cur_tag_var + "*strides", non_arg=True, omp_slice=(0, 1)))
14871483
# Peel off NameSlice, it served its purpose and is not

numba/tests/test_openmp.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3575,6 +3575,43 @@ def test_impl(n):
35753575
r = test_impl(n)
35763576
np.testing.assert_array_equal(r, np.full(n, 42))
35773577

3578+
def target_map_slice_in_mapping(self, device):
3579+
target_pragma = f"target device({device}) map(a[50:100]) map(to: b[100:150])"
3580+
@njit
3581+
def test_impl(n):
3582+
a = np.zeros(n)
3583+
b = np.arange(n)
3584+
with openmp(target_pragma):
3585+
for i in range(50):
3586+
# These b accesses are within the transferred region.
3587+
a[i+50] = b[i+100]
3588+
return a
3589+
n = 200
3590+
r = test_impl(n)
3591+
np.testing.assert_array_equal(r[0:50], np.zeros(50))
3592+
np.testing.assert_array_equal(r[50:100], np.arange(n)[100:150])
3593+
np.testing.assert_array_equal(r[100:200], np.zeros(100))
3594+
3595+
def target_map_slice_read_out_mapping(self, device):
3596+
target_pragma = f"target device({device}) map(a[50:100]) map(to: b[100:150])"
3597+
@njit
3598+
def test_impl(n):
3599+
a = np.zeros(n)
3600+
b = np.arange(n)
3601+
with openmp(target_pragma):
3602+
for i in range(50):
3603+
# These b accesses are outside the transferred region.
3604+
# Should get whatever happens to be in memory at that point.
3605+
# We assume that isn't arange(50:100).
3606+
a[i+50] = b[i+50]
3607+
return a
3608+
n = 200
3609+
r = test_impl(n)
3610+
np.testing.assert_array_equal(r[0:50], np.zeros(50))
3611+
# Make sure that the range 50-100 was not transferred.
3612+
assert not np.array_equal(r[50:100], np.arange(n)[50:100])
3613+
np.testing.assert_array_equal(r[100:200], np.zeros(100))
3614+
35783615
def target_map_tofrom_array(self, device):
35793616
target_pragma = f"target device({device}) map(tofrom: a)"
35803617
@njit

0 commit comments

Comments
 (0)