|
24 | 24 | import vta.testing |
25 | 25 | from vta.testing import simulator |
26 | 26 |
|
| 27 | +np.random.seed(0xdeadb) |
27 | 28 |
|
28 | 29 | def test_save_load_out(): |
29 | 30 | """Test save/store output command""" |
@@ -88,68 +89,73 @@ def _run(env, remote): |
88 | 89 | def test_padded_load(): |
89 | 90 | """Test padded load.""" |
90 | 91 | 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], |
103 | 107 | m + pad_before[1] + pad_after[1], |
104 | 108 | 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) |
120 | 120 |
|
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) |
140 | 140 |
|
141 | | - if env.TARGET in ["sim", "tsim"]: |
142 | | - simulator.clear_stats() |
| 141 | + if env.TARGET in ["sim", "tsim"]: |
| 142 | + simulator.clear_stats() |
143 | 143 |
|
144 | | - f(x_nd, y_nd) |
| 144 | + f(x_nd, y_nd) |
145 | 145 |
|
146 | | - np.testing.assert_equal(y_np, y_nd.asnumpy()) |
| 146 | + np.testing.assert_equal(y_np, y_nd.asnumpy()) |
147 | 147 |
|
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") |
153 | 159 |
|
154 | 160 | vta.testing.run(_run) |
155 | 161 |
|
|
0 commit comments