Skip to content

Commit 5b1ca85

Browse files
liangfutmoreau89
authored andcommitted
[VTA] Bug fix for padded load with large inputs (#4293)
* bug fix for padded load with large inputs * Update TensorLoad.scala * Update test_vta_insn.py
1 parent 9e6371f commit 5b1ca85

2 files changed

Lines changed: 75 additions & 70 deletions

File tree

vta/hardware/chisel/src/main/scala/core/TensorLoad.scala

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,20 +103,21 @@ class TensorLoad(tensorType: String = "none", debug: Boolean = false)(
103103
when(dec.xpad_1 =/= 0.U) {
104104
state := sXPad1
105105
}.elsewhen(dec.ypad_1 =/= 0.U) {
106-
state := sYPad1
107-
}
108-
.otherwise {
109-
state := sIdle
110-
}
111-
}.elsewhen(dataCtrl.io.stride || dataCtrl.io.split) {
106+
state := sYPad1
107+
}
108+
.otherwise {
109+
state := sIdle
110+
}
111+
}.elsewhen(dataCtrl.io.stride) {
112112
when(dec.xpad_1 =/= 0.U) {
113113
state := sXPad1
114114
}.elsewhen(dec.xpad_0 =/= 0.U) {
115-
state := sXPad0
116-
}
117-
.otherwise {
118-
state := sReadCmd
119-
}
115+
state := sXPad0
116+
}.otherwise {
117+
state := sReadCmd
118+
}
119+
}.elsewhen(dataCtrl.io.split) {
120+
state := sReadCmd
120121
}
121122
}
122123
}
@@ -168,13 +169,11 @@ class TensorLoad(tensorType: String = "none", debug: Boolean = false)(
168169
xPadCtrl0.io.start := dec.xpad_0 =/= 0.U &
169170
((state === sIdle & io.start) |
170171
(state === sYPad0 & yPadCtrl0.io.done) |
171-
(io.vme_rd.data
172-
.fire() & ~dataCtrlDone & (dataCtrl.io.stride | dataCtrl.io.split) & dec.xpad_1 === 0.U) |
172+
(io.vme_rd.data.fire() & ~dataCtrlDone & dataCtrl.io.stride & dec.xpad_1 === 0.U) |
173173
(state === sXPad1 & xPadCtrl1.io.done & ~dataCtrlDone))
174174

175175
xPadCtrl1.io.start := dec.xpad_1 =/= 0.U & io.vme_rd.data.fire() &
176-
((dataCtrl.io.done) |
177-
(~dataCtrl.io.done & (dataCtrl.io.stride | dataCtrl.io.split) & dec.xpad_1 =/= 0.U))
176+
((dataCtrl.io.done) | (~dataCtrl.io.done & dataCtrl.io.stride & dec.xpad_1 =/= 0.U))
178177

179178
yPadCtrl0.io.inst := io.inst
180179
yPadCtrl1.io.inst := io.inst

vta/tests/python/unittest/test_vta_insn.py

Lines changed: 61 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import vta.testing
2525
from vta.testing import simulator
2626

27+
np.random.seed(0xdeadb)
2728

2829
def test_save_load_out():
2930
"""Test save/store output command"""
@@ -88,68 +89,73 @@ def _run(env, remote):
8889
def test_padded_load():
8990
"""Test padded load."""
9091
def _run(env, remote):
91-
# declare
92-
n = 3
93-
m = 5
94-
pad_before = [2, 1, 0, 0]
95-
pad_after = [1, 2, 0, 0]
96-
x = tvm.placeholder(
97-
(n, m, env.BATCH, env.BLOCK_OUT),
98-
name="x",
99-
dtype=env.acc_dtype)
100-
x_buf = topi.nn.pad(x, pad_before, pad_after, name="y")
101-
# insert no-op that won't be optimized away
102-
y_buf = tvm.compute((n + pad_before[0] + pad_after[0],
92+
def check_padded_load(pad_before, pad_after, test_name=None):
93+
# declare
94+
n = 3
95+
m = 5
96+
x = tvm.placeholder(
97+
(n, m, env.BATCH, env.BLOCK_OUT),
98+
name="x",
99+
dtype=env.acc_dtype)
100+
x_buf = topi.nn.pad(x, pad_before, pad_after, name="y")
101+
# insert no-op that won't be optimized away
102+
y_buf = tvm.compute((n + pad_before[0] + pad_after[0],
103+
m + pad_before[1] + pad_after[1],
104+
env.BATCH,
105+
env.BLOCK_OUT), lambda *i: x_buf(*i)>>0, "y_buf")
106+
y = tvm.compute((n + pad_before[0] + pad_after[0],
103107
m + pad_before[1] + pad_after[1],
104108
env.BATCH,
105-
env.BLOCK_OUT), lambda *i: x_buf(*i)>>0, "y_buf")
106-
y = tvm.compute((n + pad_before[0] + pad_after[0],
107-
m + pad_before[1] + pad_after[1],
108-
env.BATCH,
109-
env.BLOCK_OUT), lambda *i: y_buf(*i).astype(env.inp_dtype), "y")
110-
# schedule
111-
s = tvm.create_schedule(y.op)
112-
s[x_buf].set_scope(env.acc_scope)
113-
s[x_buf].pragma(x_buf.op.axis[0], env.dma_copy)
114-
s[y_buf].set_scope(env.acc_scope)
115-
s[y_buf].pragma(y_buf.op.axis[0], env.alu)
116-
s[y].pragma(y.op.axis[0], env.dma_copy)
117-
# build
118-
with vta.build_config():
119-
mod = vta.build(s, [x, y], "ext_dev", env.target_host)
109+
env.BLOCK_OUT), lambda *i: y_buf(*i).astype(env.inp_dtype), "y")
110+
# schedule
111+
s = tvm.create_schedule(y.op)
112+
s[x_buf].set_scope(env.acc_scope)
113+
s[x_buf].pragma(x_buf.op.axis[0], env.dma_copy)
114+
s[y_buf].set_scope(env.acc_scope)
115+
s[y_buf].pragma(y_buf.op.axis[0], env.alu)
116+
s[y].pragma(y.op.axis[0], env.dma_copy)
117+
# build
118+
with vta.build_config():
119+
mod = vta.build(s, [x, y], "ext_dev", env.target_host)
120120

121-
if not remote:
122-
return
123-
temp = util.tempdir()
124-
mod.save(temp.relpath("padded_load.o"))
125-
remote.upload(temp.relpath("padded_load.o"))
126-
f = remote.load_module("padded_load.o")
127-
# verify
128-
ctx = remote.ext_dev(0)
129-
x_np = np.random.randint(-10, 10, size=(
130-
n, m, env.BATCH, env.BLOCK_OUT)).astype(x.dtype)
131-
y_np = np.zeros((n + pad_before[0] + pad_after[0],
132-
m + pad_before[1] + pad_after[1],
133-
env.BATCH,
134-
env.BLOCK_OUT)).astype(y.dtype)
135-
y_np[pad_before[0]:pad_before[0] + n,
136-
pad_before[1]:pad_before[1] + m,
137-
:] = x_np
138-
x_nd = tvm.nd.array(x_np, ctx)
139-
y_nd = tvm.nd.empty(y_np.shape, ctx=ctx, dtype=y_np.dtype)
121+
if not remote:
122+
return
123+
temp = util.tempdir()
124+
mod.save(temp.relpath("padded_load.o"))
125+
remote.upload(temp.relpath("padded_load.o"))
126+
f = remote.load_module("padded_load.o")
127+
# verify
128+
ctx = remote.ext_dev(0)
129+
x_np = np.random.randint(0, 10, size=(
130+
n, m, env.BATCH, env.BLOCK_OUT)).astype(x.dtype)
131+
y_np = np.zeros((n + pad_before[0] + pad_after[0],
132+
m + pad_before[1] + pad_after[1],
133+
env.BATCH,
134+
env.BLOCK_OUT)).astype(y.dtype)
135+
y_np[pad_before[0]:pad_before[0] + n,
136+
pad_before[1]:pad_before[1] + m,
137+
:] = x_np
138+
x_nd = tvm.nd.array(x_np, ctx)
139+
y_nd = tvm.nd.empty(y_np.shape, ctx=ctx, dtype=y_np.dtype)
140140

141-
if env.TARGET in ["sim", "tsim"]:
142-
simulator.clear_stats()
141+
if env.TARGET in ["sim", "tsim"]:
142+
simulator.clear_stats()
143143

144-
f(x_nd, y_nd)
144+
f(x_nd, y_nd)
145145

146-
np.testing.assert_equal(y_np, y_nd.asnumpy())
146+
np.testing.assert_equal(y_np, y_nd.asnumpy())
147147

148-
if env.TARGET in ["sim", "tsim"]:
149-
sim_stats = simulator.stats()
150-
print("Padded load execution statistics:")
151-
for k, v in sim_stats.items():
152-
print("\t{:<16}: {:>16}".format(k, v))
148+
if env.TARGET in ["sim", "tsim"]:
149+
sim_stats = simulator.stats()
150+
print("Padded {} load execution statistics:".format(test_name))
151+
for k, v in sim_stats.items():
152+
print("\t{:<16}: {:>16}".format(k, v))
153+
154+
check_padded_load([2, 0, 0, 0], [0, 0, 0, 0], test_name="Y0")
155+
check_padded_load([0, 2, 0, 0], [0, 0, 0, 0], test_name="Y1")
156+
check_padded_load([0, 0, 0, 0], [2, 0, 0, 0], test_name="X0")
157+
check_padded_load([0, 0, 0, 0], [0, 2, 0, 0], test_name="X1")
158+
check_padded_load([1, 1, 0, 0], [1, 1, 0, 0], test_name="all")
153159

154160
vta.testing.run(_run)
155161

0 commit comments

Comments
 (0)