switch to new Singeli block execution
This commit is contained in:
parent
4af7aeb09a
commit
9da567cd57
@ -1 +1 @@
|
||||
Subproject commit b54e3a8e0ac55c92dd9fb0e14548e4b2d80b43c2
|
||||
Subproject commit 642b1bc73113a1c86480d1292f6a607858619972
|
||||
@ -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}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user