def test(): print('SDFG consecutive tasklet test') # Externals (parameters, symbols) N = dp.symbol('N') N.set(20) input = dp.ndarray([N], dp.int32) output = dp.ndarray([N], dp.int32) input[:] = dp.int32(5) output[:] = dp.int32(0) # Construct SDFG mysdfg = SDFG('ctasklet') state = mysdfg.add_state() A_ = state.add_array('A', [N], dp.int32) B_ = state.add_array('B', [N], dp.int32) map_entry, map_exit = state.add_map('mymap', dict(i='0:N')) tasklet = state.add_tasklet('mytasklet', {'a'}, {'b'}, 'b = 5*a') state.add_edge(map_entry, None, tasklet, 'a', Memlet.simple(A_, 'i')) tasklet2 = state.add_tasklet('mytasklet2', {'c'}, {'d'}, 'd = 2*c') state.add_edge(tasklet, 'b', tasklet2, 'c', Memlet()) state.add_edge(tasklet2, 'd', map_exit, None, Memlet.simple(B_, 'i')) # Add outer edges state.add_edge(A_, None, map_entry, None, Memlet.simple(A_, '0:N')) state.add_edge(map_exit, None, B_, None, Memlet.simple(B_, '0:N')) mysdfg(A=input, B=output, N=N) diff = np.linalg.norm(10 * input - output) / N.get() print("Difference:", diff) assert diff <= 1e-5
def test(): # Externals (parameters, symbols) N = dp.symbol('N') N.set(20) input = dp.ndarray([N], dp.int32) output = dp.ndarray([N], dp.int32) input[:] = dp.int32(5) output[:] = dp.int32(0) # Construct SDFG mysdfg = SDFG('mysdfg') state = mysdfg.add_state() A_ = state.add_array('A', [N], dp.int32) # NOTE: The names A and B are not B_ = state.add_array('B', [N], dp.int32) # reserved, this is just to # clarify that # variable name != array name # Easy way to add a tasklet tasklet, map_entry, map_exit = state.add_mapped_tasklet('mytasklet', dict(i='0:N'), dict(a=Memlet.simple(A_, 'i')), 'b = 5*a', dict(b=Memlet.simple(B_, 'i'))) # Alternatively (the explicit way): #map_entry, map_exit = state.add_map('mymap', dict(i='0:N')) #tasklet = state.add_tasklet('mytasklet', {'a'}, {'b'}, 'b = 5*a') #state.add_edge(map_entry, None, tasklet, 'a', Memlet.simple(A_, 'i')) #state.add_edge(tasklet, 'b', map_exit, None, Memlet.simple(B_, 'i')) # Add outer edges state.add_edge(A_, None, map_entry, None, Memlet.simple(A_, '0:N')) state.add_edge(map_exit, None, B_, None, Memlet.simple(B_, '0:N')) mysdfg(A=input, B=output, N=N) diff = np.linalg.norm(5 * input - output) / N.get() print("Difference:", diff) assert diff <= 1e-5
def run_ger(target: str, n: int, m: int, tile_size_x: int, tile_size_y: int, alpha: float = 1, veclen: int = 1, eps: float = 1e-6): if target == "pure": ger_node, state, sdfg = pure_graph("pure", dace.float32, veclen) ger_node.expand(sdfg, state) sdfg.apply_transformations_repeated([InlineSDFG]) elif target == "fpga": sdfg = fpga_graph(dace.float32, veclen, tile_size_x, tile_size_y) else: raise ValueError("Unsupported target") x = aligned_ndarray(np.random.rand(m).astype(np.float32), alignment=4 * veclen) y = aligned_ndarray(np.random.rand(n).astype(np.float32), alignment=4 * veclen) A = aligned_ndarray(np.random.rand(m, n).astype(np.float32), alignment=4 * veclen) res = aligned_ndarray(np.empty(A.shape, dtype=A.dtype), alignment=4 * veclen) ref = aligned_ndarray(np.empty(A.shape, dtype=A.dtype), alignment=4 * veclen) res[:] = A[:] ref[:] = A[:] with dace.config.set_temporary('compiler', 'allow_view_arguments', value=True): sdfg(x=x, y=y, A=A, res=res, m=dace.int32(m), n=dace.int32(n), alpha=alpha) ref = scipy.linalg.blas.sger(alpha=alpha, x=x, y=y, a=ref) diff = np.linalg.norm(res - ref) if diff >= eps * n * m: raise RuntimeError(f"Validation failed: {diff}") else: print("Validation successful.") return sdfg
def test(): print('SDFG multiple tasklet test') # Externals (parameters, symbols) N = dp.symbol('N') N.set(20) input = dp.ndarray([N], dp.int32) output = dp.ndarray([N], dp.int32) input[:] = dp.int32(5) output[:] = dp.int32(0) # Construct SDFG mysdfg = SDFG('multiple_tasklets') state = mysdfg.add_state() A = state.add_array('A', [N], dp.int32) B = state.add_array('B', [N], dp.int32) map_entry, map_exit = state.add_map('mymap', dict(i='0:N:2')) # Tasklet 1 t1 = state.add_tasklet('task1', {'a'}, {'b'}, 'b = 5*a') state.add_edge(map_entry, None, t1, 'a', Memlet.simple(A, 'i')) state.add_edge(t1, 'b', map_exit, None, Memlet.simple(B, 'i')) # Tasklet 2 t2 = state.add_tasklet('task2', {'a'}, {'b'}, 'b = a + a + a + a + a') state.add_edge(map_entry, None, t2, 'a', Memlet.simple(A, 'i+1')) state.add_edge(t2, 'b', map_exit, None, Memlet.simple(B, 'i+1')) state.add_edge(A, None, map_entry, None, Memlet.simple(A, '0:N')) state.add_edge(map_exit, None, B, None, Memlet.simple(B, '0:N')) mysdfg(A=input, B=output, N=N) diff = np.linalg.norm(5 * input - output) / N.get() print("Difference:", diff) assert diff <= 1e-5
def run_loop_to_map(n, *args): # Use mangled temporary file to avoid name clashes when run in parallel with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_path = temp_file.name sdfg = make_sdfg(*args, temp_path) if n is None: n = dace.int32(16) a = 4 * np.ones((n, ), dtype=np.float64) b = 3 * np.ones((n, ), dtype=np.float64) c = np.zeros((n, ), dtype=np.float64) d = np.zeros((n, ), dtype=np.float64) e = np.empty((1, ), dtype=np.uint16) num_transformations = sdfg.apply_transformations(LoopToMap) sdfg(A=a, B=b, C=c, D=d, E=e, N=n) if not all(c[:] == 0.25) or not all(d[:] == 5): raise ValueError("Validation failed.") if e[0] != n: raise ValueError("Validation failed.") numbers_written = [] with open(temp_path, "r") as f: for line in f: numbers_written.append(int(line.strip())) if not all(sorted(numbers_written) == np.arange(n)): raise ValueError("Validation failed.") os.remove(temp_path) # Clean up return num_transformations
def apply_and_verify(sdfg, n): if n is None: n = dace.int32(16) a = 4 * np.ones((n, ), dtype=np.float64) b = 3 * np.ones((n, ), dtype=np.float64) c = np.zeros((n, ), dtype=np.float64) d = np.zeros((n, ), dtype=np.float64) e = np.empty((1, ), dtype=np.uint16) num_transformations = sdfg.apply_transformations(LoopToMap) try: os.remove("loop_to_map_test.txt") except FileNotFoundError: pass sdfg(A=a, B=b, C=c, D=d, E=e, N=n) if not all(c[:] == 0.25) or not all(d[:] == 5): raise ValueError("Validation failed.") if e[0] != n: raise ValueError("Validation failed.") numbers_written = [] with open("loop_to_map_test.txt", "r") as f: for line in f: numbers_written.append(int(line.strip())) if not all(sorted(numbers_written) == np.arange(n)): raise ValueError("Validation failed.") os.remove("loop_to_map_test.txt") return num_transformations
args = vars(parser.parse_args()) # Specialize vector width regardless W.set(args["W"]) num_stages = 2 * W.get() - 1 vtype.veclen = W.get() if args["specialize"]: N.set(args["N"]) sdfg = make_sdfg(True) sdfg.specialize(dict(W=W, N=N)) else: sdfg = make_sdfg(False) sdfg.specialize(dict(W=W)) N.set(args["N"]) sdfg.add_constant("num_stages", dace.int32(num_stages)) ratio = dtype(args["ratio"]) print("Predicate-Based Filter. size={}, ratio={} ({}specialized)".format( N.get(), ratio, "" if args["specialize"] else "not ")) A = dace.ndarray([N], dtype=dtype) B = dace.ndarray([N], dtype=dtype) outsize = dace.scalar(dace.uint32) outsize[0] = 0 A[:] = np.random.rand(N.get()).astype(dtype.type) B[:] = dtype(0) if args["specialize"]:
def test_nested_sdfg(): print('SDFG consecutive tasklet (nested SDFG) test') # Externals (parameters, symbols) N = dp.symbol('N') N.set(20) input = dp.ndarray([N], dp.int32) output = dp.ndarray([N], dp.int32) input[:] = dp.int32(5) output[:] = dp.int32(0) # Construct outer SDFG mysdfg = SDFG('ctasklet') state = mysdfg.add_state() A_ = state.add_array('A', [N], dp.int32) B_ = state.add_array('B', [N], dp.int32) # Construct inner SDFG nsdfg = dp.SDFG('ctasklet_inner') nstate = nsdfg.add_state() a = nstate.add_array('a', [N], dp.int32) b = nstate.add_array('b', [N], dp.int32) map_entry, map_exit = nstate.add_map('mymap', dict(i='0:N/2')) tasklet = nstate.add_tasklet('mytasklet', {'aa'}, {'bb'}, 'bb = 5*aa') nstate.add_memlet_path(a, map_entry, tasklet, dst_conn='aa', memlet=Memlet('a[k*N/2+i]')) tasklet2 = nstate.add_tasklet('mytasklet2', {'cc'}, {'dd'}, 'dd = 2*cc') nstate.add_edge(tasklet, 'bb', tasklet2, 'cc', Memlet()) nstate.add_memlet_path(tasklet2, map_exit, b, src_conn='dd', memlet=Memlet('b[k*N/2+i]')) # Add outer edges omap_entry, omap_exit = state.add_map('omap', dict(k='0:2')) nsdfg_node = state.add_nested_sdfg(nsdfg, None, {'a'}, {'b'}) state.add_memlet_path(A_, omap_entry, nsdfg_node, dst_conn='a', memlet=Memlet('A[0:N]')) state.add_memlet_path(nsdfg_node, omap_exit, B_, src_conn='b', memlet=Memlet('B[0:N]')) mysdfg.validate() mysdfg(A=input, B=output, N=N) diff = np.linalg.norm(10 * input - output) / N.get() print("Difference:", diff) assert diff <= 1e-5 mysdfg.apply_strict_transformations() mysdfg(A=input, B=output, N=N) diff = np.linalg.norm(10 * input - output) / N.get() print("Difference:", diff) assert diff <= 1e-5
import numpy as np import dace as dp from dace.sdfg import SDFG from dace.memlet import Memlet from dace.data import Scalar # Constructs an SDFG with two consecutive tasklets if __name__ == '__main__': print('SDFG consecutive tasklet test') # Externals (parameters, symbols) N = dp.symbol('N') N.set(20) input = dp.ndarray([N], dp.int32) output = dp.ndarray([N], dp.int32) input[:] = dp.int32(5) output[:] = dp.int32(0) # Construct SDFG mysdfg = SDFG('ctasklet') state = mysdfg.add_state() A_ = state.add_array('A', [N], dp.int32) B_ = state.add_array('B', [N], dp.int32) mysdfg.add_scalar('something', dp.int32) map_entry, map_exit = state.add_map('mymap', dict(i='0:N')) tasklet = state.add_tasklet('mytasklet', {'a'}, {'b'}, 'b = 5*a') state.add_edge(map_entry, None, tasklet, 'a', Memlet.simple(A_, 'i')) tasklet2 = state.add_tasklet('mytasklet2', {'c'}, {'d'}, 'd = 2*c') state.add_edge(tasklet, 'b', tasklet2, 'c', Memlet.simple('something', '0'))
ger_node.expand(sdfg, state) sdfg.apply_transformations_repeated([InlineSDFG]) elif args.target == "fpga": sdfg = fpga_graph(dace.float32, veclen, tile_size_x, tile_size_y) else: print("Unsupported target") exit(-1) x = aligned_ndarray(np.random.rand(m).astype(np.float32), alignment=4 * veclen) y = aligned_ndarray(np.random.rand(n).astype(np.float32), alignment=4 * veclen) A = aligned_ndarray(np.random.rand(m, n).astype(np.float32), alignment=4 * veclen) res = aligned_ndarray(np.empty(A.shape, dtype=A.dtype), alignment=4 * veclen) ref = aligned_ndarray(np.empty(A.shape, dtype=A.dtype), alignment=4 * veclen) res[:] = A[:] ref[:] = A[:] sdfg(x=x, y=y, A=A, res=res, m=dace.int32(m), n=dace.int32(n), alpha=alpha) ref = scipy.linalg.blas.sger(alpha=alpha, x=x, y=y, a=ref) diff = np.linalg.norm(res - ref) if diff >= args.eps * n * m: raise RuntimeError(f"Validation failed: {diff}") else: print("Validation successful.")
def test(): print('SDFG memlet lifetime validation test') # Externals (parameters, symbols) N = dp.symbol('N') N.set(20) input = dp.ndarray([N], dp.int32) output = dp.ndarray([N], dp.int32) input[:] = dp.int32(5) output[:] = dp.int32(0) # Construct SDFG 1 sdfg1 = SDFG('shouldntwork1') state = sdfg1.add_state() A = state.add_array('A', [N], dp.int32) B = state.add_array('B', [N], dp.int32) T = state.add_transient('T', [1], dp.int32) tasklet_gen = state.add_tasklet('mytasklet', {'a'}, {'b'}, 'b = 5*a') map_entry, map_exit = state.add_map('mymap', dict(k='0:N')) map_entry.add_in_connector('IN_1') map_entry.add_out_connector('OUT_1') map_exit.add_in_connector('IN_1') map_exit.add_out_connector('OUT_1') state.add_edge(B, None, map_entry, 'IN_1', Memlet.simple(B, '0')) state.add_edge(map_entry, 'OUT_1', T, None, Memlet.simple(T, '0')) state.add_edge(T, None, map_exit, 'IN_1', Memlet.simple(B, '0')) state.add_edge(map_exit, 'OUT_1', tasklet_gen, 'a', Memlet.simple(B, '0')) state.add_edge(tasklet_gen, 'b', A, None, Memlet.simple(A, '0')) try: sdfg1.validate() raise AssertionError("SDFG passed validation, test FAILED") except InvalidSDFGError: print("Test passed, exception successfully caught") # Construct SDFG 3 sdfg2 = SDFG('shouldntwork2') state = sdfg2.add_state() A = state.add_array('A', [N], dp.int32) B = state.add_array('B', [N], dp.int32) T = state.add_transient('T', [N], dp.int32) tasklet_gen = state.add_tasklet('mytasklet', {'a'}, {'b'}, 'b = 5*a') map1_entry, map1_exit = state.add_map('mymap1', dict(k='0:N')) map2_entry, map2_exit = state.add_map('mymap2', dict(k='0:N')) map1_entry.add_in_connector('IN_1') map1_entry.add_out_connector('OUT_1') map1_exit.add_in_connector('IN_1') map1_exit.add_out_connector('OUT_1') map2_entry.add_in_connector('IN_1') map2_entry.add_out_connector('OUT_1') map2_exit.add_in_connector('IN_1') map2_exit.add_out_connector('OUT_1') state.add_edge(A, None, map1_entry, 'IN_1', Memlet.simple(A, '0:N')) state.add_edge(map1_entry, 'OUT_1', tasklet_gen, 'a', Memlet.simple(A, 'i')) state.add_edge(tasklet_gen, 'b', map1_exit, 'IN_1', Memlet.simple(T, 'i')) state.add_edge(map1_exit, 'OUT_1', map2_entry, 'IN_1', Memlet.simple(T, '0:N')) state.add_edge(map2_entry, 'OUT_1', T, None, Memlet.simple(T, 'i')) state.add_edge(T, None, map2_exit, 'IN_1', Memlet.simple(B, 'i')) state.add_edge(map2_exit, 'OUT_1', B, None, Memlet.simple(B, '0:N')) try: sdfg2.validate() raise AssertionError("SDFG passed validation, test FAILED") except InvalidSDFGError: print("Test passed, exception successfully caught")