switch to new Singeli block execution

This commit is contained in:
dzaima 2023-06-15 18:05:47 +03:00
parent 4af7aeb09a
commit 9da567cd57
4 changed files with 21 additions and 21 deletions

@ -1 +1 @@
Subproject commit b54e3a8e0ac55c92dd9fb0e14548e4b2d80b43c2 Subproject commit 642b1bc73113a1c86480d1292f6a607858619972

View File

@ -243,61 +243,61 @@ def tptr{l,s} = { # create "pointer" generator with given load & store definitio
def r{i,x} = s{i,x} def r{i,x} = s{i,x}
} }
def unroll{vars,begin,end,block & knum{begin} & knum{end}} = { def unroll{vars,begin,end,iter & knum{begin} & knum{end}} = {
def f{i,l & i==l} = 0 def f{i,l & i==l} = 0
def f{i,l & i!=l} = { def f{i,l & i!=l} = {
exec{i, vars, block} iter{i, vars}
f{i+1, l} f{i+1, l}
} }
f{begin,end} f{begin,end}
} }
def collect{vars,begin,end,block & knum{begin} & knum{end}} = { def collect{vars,begin,end,iter & knum{begin} & knum{end}} = {
def f{s,e & s==e} = tup{} def f{s,e & s==e} = tup{}
def f{s,e & s<e} = { def f{s,e & s<e} = {
def m = s + ((e-s)>>1) def m = s + ((e-s)>>1)
def r0 = f{s, m} def r0 = f{s, m}
merge{r0, f{m, e}} merge{r0, f{m, e}}
} }
def f{s,e & s+1==e} = tup{exec{s, vars, block}} def f{s,e & s+1==e} = tup{iter{s, vars}}
f{begin,end} f{begin,end}
} }
def for{vars,begin,end,block} = { def for{vars,begin,end,iter} = {
i:u64 = begin i:u64 = begin
while (i < end) { while (i < end) {
exec{i, vars, block} iter{i, vars}
++i ++i
} }
} }
def forNZ{vars,begin,end,block} = { def forNZ{vars,begin,end,iter} = {
i:u64 = begin i:u64 = begin
assert{i!=end} assert{i!=end}
while (i < end) { while (i < end) {
exec{i, vars, block} iter{i, vars}
++i ++i
} }
} }
def forUnroll{exp,unr}{vars,begin,end,block} = { def forUnroll{exp,unr}{vars,begin,end,iter} = {
i:u64 = begin i:u64 = begin
while ((i+unr) <= end) { while ((i+unr) <= end) {
exec{each{{j}=>i+j, iota{unr}}, vars, block} iter{each{{j}=>i+j, iota{unr}}, vars}
i+= unr i+= unr
} }
if (unr==2) { if (i!=end) exec{tup{i}, vars, block} } if (unr==2) { if (i!=end) iter{tup{i}, vars} }
else if (unr>1) { else if (unr>1) {
if (exp) { if (exp) {
def stop = makelabel{} def stop = makelabel{}
each{{j} => { each{{j} => {
if (i+j >= end) goto{stop} if (i+j >= end) goto{stop}
exec{tup{i+j}, vars, block} iter{tup{i+j}, vars}
}, iota{unr}} }, iota{unr}}
setlabel{stop} setlabel{stop}
} else { } else {
@for(j from i to end) exec{tup{j}, vars, block} @for(j from i to end) iter{tup{j}, vars}
} }
} }
} }
def forXUnroll{unr}{vars,begin,end,block} = { def forXUnroll{unr}{vars,begin,end,iter} = {
@forUnroll{unr}(is from begin to end) each{{i} => exec{i, vars, block}, is} @forUnroll{unr}(is from begin to end) each{{i} => iter{i, vars}, is}
} }

View File

@ -104,7 +104,7 @@ def mlExec{i, block, vars0, bulk, M} = {
def vproc{S=='m'} = tptr{{_}=>M, '!'} def vproc{S=='m'} = tptr{{_}=>M, '!'}
def vproc{t & ktup{t}} = vproc2{...t} def vproc{t & ktup{t}} = vproc2{...t}
exec{i, each{{c} => vproc{c}, vars0}, block} block{i, each{vproc, vars0}}
} }
# i0 - initial batch index; not used as begin because it's in a different scale compared to end # i0 - initial batch index; not used as begin because it's in a different scale compared to end

View File

@ -54,14 +54,14 @@ def kernel{src:P, dst:P, kw, kh, w, h} = {
} }
def for_mult{k}{vars,begin,end,block} = { def for_mult{k}{vars,begin,end,iter} = {
assert{begin == 0} assert{begin == 0}
@for (i to end/k) exec{k*i, vars, block} @for (i to end/k) iter{k*i, vars}
} }
def for_mult_max{k, m}{vars,begin,end,block} = { def for_mult_max{k, m}{vars,begin,end,iter} = {
@for_mult{k} (i0 to end) { @for_mult{k} (i0 to end) {
i:=i0; if (i>m) i = m i:=i0; if (i>m) i = m
exec{i, vars, block} iter{i, vars}
} }
} }