block → iter

This commit is contained in:
dzaima 2023-06-15 18:11:57 +03:00
parent 9da567cd57
commit dee29a1a02

View File

@ -90,7 +90,7 @@ def hCast{T,p:P & match{P,*void}} = *T~~p
# tup{'b',VT,p:P} - loadBatchBit # tup{'b',VT,p:P} - loadBatchBit
# tup{'g',VT,p:*T} - gives a generator supporting g{} for loadBatch and g{newValue} for storeBatch # tup{'g',VT,p:*T} - gives a generator supporting g{} for loadBatch and g{newValue} for storeBatch
# tup{'g',p:*T} - the above, but without load support # tup{'g',p:*T} - the above, but without load support
def mlExec{i, block, vars0, bulk, M} = { def mlExec{i, iter, vars0, bulk, M} = {
def vproc2{T,p:P} = tptr{{i} => loadBatch{p, i, T}, {i,x} => storeBatch{p, i, x, M}} def vproc2{T,p:P} = tptr{{i} => loadBatch{p, i, T}, {i,x} => storeBatch{p, i, x, M}}
def vproc2{S=='b', p:P} = tptr{{i} => b_getBatch{bulk, hCast{u64,p}, i}, '!'} def vproc2{S=='b', p:P} = tptr{{i} => b_getBatch{bulk, hCast{u64,p}, i}, '!'}
def vproc2{S=='b',T,p:P} = tptr{{i} => loadBatchBit{T, hCast{u64,p}, i}, '!'} def vproc2{S=='b',T,p:P} = tptr{{i} => loadBatchBit{T, hCast{u64,p}, i}, '!'}
@ -104,18 +104,18 @@ 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}
block{i, each{vproc, vars0}} iter{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
def maskedLoop{bulk, i0}{vars,begin==0,end,block} = { def maskedLoop{bulk, i0}{vars,begin==0,end,iter} = {
l:u64 = end l:u64 = end
m:u64 = l / bulk m:u64 = l / bulk
@for (i from i0 to m) mlExec{i, block, vars, bulk, maskNone} @for (i from i0 to m) mlExec{i, iter, vars, bulk, maskNone}
left:= l & (bulk-1) left:= l & (bulk-1)
if (left!=0) mlExec{m, block, vars, bulk, maskAfter{left}} if (left!=0) mlExec{m, iter, vars, bulk, maskAfter{left}}
} }
def maskedLoop{bulk} = maskedLoop{bulk,0} def maskedLoop{bulk} = maskedLoop{bulk,0}
@ -129,36 +129,36 @@ def maskedLoop{bulk} = maskedLoop{bulk,0}
# begin must be 0 # begin must be 0
# end is scalar element count # end is scalar element count
# index given is a tuple of batch indexes to process # index given is a tuple of batch indexes to process
def muLoop{bulk, unr, fromunr}{vars,begin==0,end,block} = { def muLoop{bulk, unr, fromunr}{vars,begin==0,end,iter} = {
l:u64 = end l:u64 = end
def step = 123123123 def step = 123123123
m:u64 = l / bulk m:u64 = l / bulk
if (unr==1) { if (unr==1) {
@for (i from 0 to m) mlExec{tup{i}, block, vars, bulk, maskNone} @for (i from 0 to m) mlExec{tup{i}, iter, vars, bulk, maskNone}
left:= l & (bulk-1) left:= l & (bulk-1)
if (left!=0) mlExec{tup{m}, block, vars, bulk, maskAfter{left}} if (left!=0) mlExec{tup{m}, iter, vars, bulk, maskAfter{left}}
} else { } else {
if (m > 0) { if (m > 0) {
i:u64 = 0 i:u64 = 0
if (unr <= m) { if (unr <= m) {
while ((i+unr) <= m) { while ((i+unr) <= m) {
def is = each{{j}=>i+j, iota{unr}} def is = each{{j}=>i+j, iota{unr}}
mlExec{each{{j}=>i+j, iota{unr}}, block, vars, bulk, maskNone} mlExec{each{{j}=>i+j, iota{unr}}, iter, vars, bulk, maskNone}
i+= unr i+= unr
} }
fromunr{} fromunr{}
} }
if (unr==2) { if (unr==2) {
if (i!=m) mlExec{tup{i}, block, vars, bulk, maskNone} if (i!=m) mlExec{tup{i}, iter, vars, bulk, maskNone}
} else { } else {
@for(j from i to m) mlExec{tup{j}, block, vars, bulk, maskNone} @for(j from i to m) mlExec{tup{j}, iter, vars, bulk, maskNone}
} }
} }
left:= l & (bulk-1) left:= l & (bulk-1)
if (left!=0) mlExec{tup{m}, block, vars, bulk, maskAfter{left}} if (left!=0) mlExec{tup{m}, iter, vars, bulk, maskAfter{left}}
} }
} }
def muLoop{bulk, unr} = muLoop{bulk, unr, {}=>0} def muLoop{bulk, unr} = muLoop{bulk, unr, {}=>0}