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 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} = {
exec{i, vars, block}
iter{i, vars}
f{i+1, l}
}
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} = {
def m = s + ((e-s)>>1)
def r0 = f{s, m}
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}
}
def for{vars,begin,end,block} = {
def for{vars,begin,end,iter} = {
i:u64 = begin
while (i < end) {
exec{i, vars, block}
iter{i, vars}
++i
}
}
def forNZ{vars,begin,end,block} = {
def forNZ{vars,begin,end,iter} = {
i:u64 = begin
assert{i!=end}
while (i < end) {
exec{i, vars, block}
iter{i, vars}
++i
}
}
def forUnroll{exp,unr}{vars,begin,end,block} = {
def forUnroll{exp,unr}{vars,begin,end,iter} = {
i:u64 = begin
while ((i+unr) <= end) {
exec{each{{j}=>i+j, iota{unr}}, vars, block}
iter{each{{j}=>i+j, iota{unr}}, vars}
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) {
if (exp) {
def stop = makelabel{}
each{{j} => {
if (i+j >= end) goto{stop}
exec{tup{i+j}, vars, block}
iter{tup{i+j}, vars}
}, iota{unr}}
setlabel{stop}
} 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} = {
@forUnroll{unr}(is from begin to end) each{{i} => exec{i, vars, block}, is}
def forXUnroll{unr}{vars,begin,end,iter} = {
@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{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

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}
@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) {
i:=i0; if (i>m) i = m
exec{i, vars, block}
iter{i, vars}
}
}