1 # source code of yield-based parallel reduction schedule:
2 # https://git.libre-soc.org/?p=libreriscv.git;a=blob;f=openpower/sv/preduce.py;hb=HEAD
3 from preduce
import preduce_y
6 def preduce(vl
, vec
, pred
):
9 print(" start", step
, pred
, vec
)
12 for i
in range(0, vl
, step
):
14 other_pred
= other
< vl
and pred
[other
]
15 if pred
[i
] and other_pred
:
19 print(" row", step
, pred
, vec
)
23 def preducei(vl
, vec
, pred
):
26 ix
= list(range(vl
)) # indices move rather than copy data
27 print(" start", step
, pred
, vec
)
30 for i
in range(0, vl
, step
):
33 oi
= ix
[other
] if other
< vl
else None
34 other_pred
= other
< vl
and pred
[oi
]
35 if pred
[ci
] and other_pred
:
38 ix
[i
] = oi
# leave data in-place, copy index instead
39 print(" row", step
, pred
, vec
, ix
)
44 if __name__
== '__main__':
45 vec
= [1, 2, 3, 4, 9, 5, 6]
46 prd
= [0, 1, 1, 1, 0, 0, 1]
48 res
= preduce(len(vec
), vec
, prd
)
50 res2
= preducei(len(vec
), vec
, prd
)
53 preduce_y(len(vec
), vec
, prd
)
58 vec
= [1, 2, 3, 4, 9, 5, 6]
59 prd
= [1, 0, 0, 1, 1, 0, 1]
61 res
= preduce(len(vec
), vec
, prd
)
63 res2
= preducei(len(vec
), vec
, prd
)
66 preduce_y(len(vec
), vec
, prd
)
71 vec
= [1, 2, 3, 4, 9, 5, 6, 8]
72 prd
= [0, 0, 0, 0, 1, 1, 1, 1]
74 res
= preduce(len(vec
), vec
, prd
)
76 res2
= preducei(len(vec
), vec
, prd
)
79 preduce_y(len(vec
), vec
, prd
)
84 vec
= [1, 2, 3, 4, 9, 5, 6, 8]
85 prd
= [0, 1, 0, 0, 0, 1, 0, 1]
87 res
= preduce(len(vec
), vec
, prd
)
89 res2
= preducei(len(vec
), vec
, prd
)
92 preduce_y(len(vec
), vec
, prd
)
97 vec
= [1, 2, 3, 4, 9, 5, 6]
98 prd
= [1, 0, 1, 1, 0, 0, 1]
100 res
= preduce(len(vec
), vec
, prd
)
102 res2
= preducei(len(vec
), vec
, prd
)
105 preduce_y(len(vec
), vec
, prd
)
110 vec
= [1, 2, 3, 4, 9, 5, 6]
111 prd
= [1, 1, 1, 1, 1, 1, 1]
113 res
= preduce(len(vec
), vec
, prd
)
115 res2
= preducei(len(vec
), vec
, prd
)
118 preduce_y(len(vec
), vec
, prd
)