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 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}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user