Skip to content

Commit 0c09403

Browse files
authored
Reduce List.zip usage in NBSlice (#14230)
- Change `NBSlice.resolveDimensionsSubscript` to take two arguments instead of a tuple to avoid List.zip when calling it. - Change `NBSlice.locationToIndex` to take two lists instead of a zipped list, to reduce the amount of memory allocations. - Adapt `NBSlice.resolveDimensionsSubscripts` to the changes above.
1 parent 46bc203 commit 0c09403

File tree

2 files changed

+24
-27
lines changed

2 files changed

+24
-27
lines changed

OMCompiler/Compiler/NBackEnd/Util/NBAdjacency.mo

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ public
210210
Subscript sub;
211211
list<list<Subscript>> subs_lst;
212212
list<Integer> slice = {}, dim_sizes, values;
213-
list<tuple<Integer, Integer>> ranges;
214213

215214
// no subscripts -> create full index list
216215
case {} then subscriptedIndices(start, length, {});
@@ -230,8 +229,7 @@ public
230229
dim_sizes := list(Dimension.size(dim) for dim in dims);
231230
for sub_lst in listReverse(subs_lst) loop
232231
values := list(Subscript.toInteger(s) for s in sub_lst);
233-
ranges := List.zip(dim_sizes, values);
234-
slice := Slice.locationToIndex(ranges, start) :: slice;
232+
slice := Slice.locationToIndex(dim_sizes, values, start) :: slice;
235233
end for;
236234
then slice;
237235

OMCompiler/Compiler/NBackEnd/Util/NBSlice.mo

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ public
355355
(var_start, _) := mapping.var_AtS[var_arr_idx];
356356
sizes := ComponentRef.sizes(stripped, false);
357357
int_subs := ComponentRef.subscriptsToInteger(cref);
358-
var_scal_idx := locationToIndex(List.zip(sizes, int_subs), var_start);
358+
var_scal_idx := locationToIndex(sizes, int_subs, var_start);
359359
indices := var_scal_idx :: indices;
360360
end for;
361361
// remove duplicates and sort
@@ -682,14 +682,16 @@ public
682682
function locationToIndex
683683
"reverse function to indexToLocation()
684684
maps a frame location to a scalar index starting from first index (one based!)"
685-
input list<tuple<Integer,Integer>> size_val_tpl_lst;
685+
input list<Integer> sizes;
686+
input list<Integer> values;
686687
input output Integer index;
687688
protected
688-
Integer size, val, factor = 1;
689+
Integer factor = 1, size;
690+
list<Integer> rest_sizes = sizes;
689691
algorithm
690-
for tpl in size_val_tpl_lst loop
691-
(size, val) := tpl;
692-
index := index + (val-1) * factor;
692+
for v in values loop
693+
size :: rest_sizes := rest_sizes;
694+
index := index + (v - 1) * factor;
693695
factor := factor * size;
694696
end for;
695697
end locationToIndex;
@@ -1083,7 +1085,7 @@ public
10831085
(var_start, _) := mapping.var_AtS[var_arr_idx];
10841086
sizes := ComponentRef.sizes(stripped, false);
10851087
int_subs := ComponentRef.subscriptsToInteger(replaced);
1086-
var_scal_idx := locationToIndex(List.zip(sizes, int_subs), var_start);
1088+
var_scal_idx := locationToIndex(sizes, int_subs, var_start);
10871089
indices := var_scal_idx :: indices;
10881090
end for;
10891091
end upgradeRowFull;
@@ -1205,7 +1207,7 @@ protected
12051207
// skip to an array element
12061208
case (Type.ARRAY(), rest) guard List.compareLength(rest, ty.dimensions) >= 0 algorithm
12071209
(rest, tail) := List.split(rest, listLength(ty.dimensions));
1208-
index := locationToIndex(List.zip(list(Dimension.size(dim, true) for dim in ty.dimensions), rest), index);
1210+
index := locationToIndex(list(Dimension.size(dim, true) for dim in ty.dimensions), rest, index);
12091211
then resolveSkips(index, ty.elementType, tail, cref, fullmap);
12101212

12111213
// skip for tuple or array, but the skip is too large
@@ -1594,15 +1596,15 @@ protected
15941596
Expression range;
15951597
Option<Iterator> map;
15961598
Integer start, step, stop;
1597-
list<list<tuple<Integer, Integer>>> ranges;
1599+
list<list<Integer>> values;
15981600
list<Expression> iterator_exps;
15991601
list<Integer> iterator_lst;
16001602
Integer sub_idx;
16011603

16021604
// only occurs for non-for-loop equations (no frames to replace)
16031605
case {} algorithm
1604-
ranges := resolveDimensionsSubscripts(sizes, subs, replacements);
1605-
then list(locationToIndex(r, first) for r in ranges);
1606+
values := resolveDimensionsSubscripts(sizes, subs, replacements);
1607+
then list(locationToIndex(sizes, v, first) for v in values);
16061608

16071609
// extract numeric information about the range
16081610
case (iterator, range, map) :: rest algorithm
@@ -1630,9 +1632,9 @@ protected
16301632

16311633
if listEmpty(rest) then
16321634
// bottom line, resolve current configuration and create index for it
1633-
ranges := resolveDimensionsSubscripts(sizes, subs, replacements);
1634-
for r in listReverse(ranges) loop
1635-
indices := locationToIndex(r, first) :: indices;
1635+
values := resolveDimensionsSubscripts(sizes, subs, replacements);
1636+
for v in listReverse(values) loop
1637+
indices := locationToIndex(sizes, v, first) :: indices;
16361638
end for;
16371639
else
16381640
// not last frame, go deeper
@@ -1694,31 +1696,28 @@ protected
16941696

16951697
function resolveDimensionsSubscripts
16961698
"uses the replacement module to replace all iterator crefs in the subscript with the current position.
1697-
Returns a list of tuples containing the size of each subscript and current position."
1699+
Returns the current positions for each subscript."
16981700
input list<Integer> sizes "dimension sizes";
16991701
input list<Expression> subs "subscript expressions";
17001702
input UnorderedMap<ComponentRef, Expression> replacements "replacement map for iterator crefs";
1701-
output list<list<tuple<Integer, Integer>>> ranges "tuple pairs (size, pos)";
1703+
output list<list<Integer>> values;
17021704
protected
17031705
list<Expression> replaced;
1704-
list<list<Integer>> values;
17051706
algorithm
17061707
// get all possible subscript combinations
17071708
replaced := list(Expression.map(sub, function Replacements.applySimpleExp(replacements = replacements)) for sub in subs);
1708-
values := list(resolveDimensionsSubscript(tpl) for tpl in List.zip(replaced, sizes));
1709+
values := list(resolveDimensionsSubscript(exp, size) threaded for exp in replaced, size in sizes);
17091710
values := List.combination(values);
1710-
ranges := list(List.zip(sizes, v) for v in values);
17111711
end resolveDimensionsSubscripts;
17121712

17131713
function resolveDimensionsSubscript
1714-
input tuple<Expression, Integer> tpl;
1714+
input Expression replaced;
1715+
input Integer size;
17151716
output list<Integer> res;
17161717
protected
17171718
Expression rep;
1718-
Integer size;
17191719
algorithm
1720-
(rep, size) := tpl;
1721-
rep := SimplifyExp.simplifyDump(rep, true, getInstanceName());
1720+
rep := SimplifyExp.simplifyDump(replaced, true, getInstanceName());
17221721
res := match rep
17231722
local
17241723
Integer start, step, stop;
@@ -1733,7 +1732,7 @@ protected
17331732

17341733
// resolve individual array elements
17351734
case Expression.ARRAY()
1736-
then List.flatten(list(resolveDimensionsSubscript((e, size)) for e in rep.elements));
1735+
then List.flatten(list(resolveDimensionsSubscript(e, size) for e in rep.elements));
17371736

17381737
// assume full dependency if it cannot be evaluated
17391738
else List.intRange(size);

0 commit comments

Comments
 (0)