def cli(n, tile_first): N.set(n) A = dace.ndarray([N], dtype=dace.float32) B = dace.ndarray([N], dtype=dace.float32) out_AB = dace.scalar(dace.float32) print('Dot product %d' % (N.get())) A[:] = np.random.rand(N.get()).astype(dace.float32.type) B[:] = np.random.rand(N.get()).astype(dace.float32.type) out_AB[0] = dace.float32(0) sdfg = dot.to_sdfg() if tile_first: sdfg.apply_transformations(MapTiling) sdfg.apply_transformations(FPGATransformSDFG) else: sdfg.apply_transformations(FPGATransformSDFG) sdfg.apply_transformations(MapTiling) sdfg(A=A, B=B, out=out_AB, N=N) diff_ab = np.linalg.norm(np.dot(A, B) - out_AB) / float(N.get()) print("Difference (A*B):", diff_ab) exit(0 if (diff_ab <= 1e-5) else 1)
def vector_reduce(x: dace.float32[N], s: dace.scalar(dace.float32)): #transient tmp = dace.define_local([N], dtype=x.dtype) @dace.map def sum(i: _[0:N]): in_x << x[i] out >> tmp[i] out = in_x dace.reduce(lambda a, b: a + b, tmp, s, axis=(0), identity=0)
def test_dot(): n = 64 N.set(n) A = dace.ndarray([N], dtype=dace.float32) out_AA = dace.scalar(dace.float64) A[:] = np.random.rand(n).astype(dace.float32.type) out_AA[0] = dace.float64(0) dot(A, A, out_AA, N=n) diff_aa = np.linalg.norm(np.dot(A, A) - out_AA) / float(n) print("Difference:", diff_aa) assert diff_aa <= 1e-5
def test_filter(): N.set(64) ratio = np.float32(0.5) print('Predicate-Based Filter. size=%d, ratio=%f' % (N.get(), ratio)) A = np.random.rand(N.get()).astype(np.float32) B = np.zeros_like(A) outsize = dace.scalar(dace.uint32) outsize[0] = 0 sdfg = pbf.to_sdfg() vectorize(sdfg, 'i') sdfg(A=A, B=B, outsz=outsize, ratio=ratio, N=N) if dace.Config.get_bool('profiling'): dace.timethis('filter', 'numpy', 0, regression, A, ratio) filtered = regression(A, ratio) if len(filtered) != outsize[0]: print( "Difference in number of filtered items: %d (DaCe) vs. %d (numpy)" % (outsize[0], len(filtered))) totalitems = min(outsize[0], N.get()) print('DaCe:', B[:totalitems].view(type=np.ndarray)) print('Regression:', filtered.view(type=np.ndarray)) exit(1) # Sort the outputs filtered = np.sort(filtered) B[:outsize[0]] = np.sort(B[:outsize[0]]) if len(filtered) == 0: print("==== Program end ====") exit(0) diff = np.linalg.norm(filtered - B[:outsize[0]]) / float(outsize[0]) print("Difference:", diff) if diff > 1e-5: totalitems = min(outsize[0], N.get()) print('DaCe:', B[:totalitems].view(type=np.ndarray)) print('Regression:', filtered.view(type=np.ndarray)) print("==== Program end ====") assert diff <= 1e-5
def test_vector_reduce(): N.set(24) # Initialize arrays: X, Y and Z X = np.random.rand(N.get()).astype(dace.float32.type) s = dace.scalar(dace.float32) sdfg = vector_reduce.to_sdfg() sdfg.apply_transformations(FPGATransformSDFG) sdfg(x=X, s=s, N=N) # Compute expected result s_exp = 0.0 for x in X: s_exp += x diff = np.linalg.norm(s_exp - s) / N.get() assert diff <= 1e-5 return sdfg
def run_dot(n, tile_first): N.set(n) A = dace.ndarray([N], dtype=dace.float32) B = dace.ndarray([N], dtype=dace.float32) out_AB = dace.scalar(dace.float32) A[:] = np.random.rand(N.get()).astype(dace.float32.type) B[:] = np.random.rand(N.get()).astype(dace.float32.type) out_AB[0] = dace.float32(0) sdfg = dot.to_sdfg() if tile_first: sdfg.apply_transformations(MapTiling) sdfg.apply_transformations(FPGATransformSDFG) else: sdfg.apply_transformations(FPGATransformSDFG) sdfg.apply_transformations(MapTiling) sdfg(A=A, B=B, out=out_AB, N=N) diff_ab = np.linalg.norm(np.dot(A, B) - out_AB) / float(N.get()) assert diff_ab <= 1e-5 return sdfg
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("N", type=int) parser.add_argument("ratio", type=float) parser.add_argument("-specialize", default=False, action="store_true", help="Fix all symbols at compile time/in hardware") args = vars(parser.parse_args()) N.set(args["N"]) A = dace.ndarray([N], dtype=dace.float32) B = dace.ndarray([N], dtype=dace.float32) outsize = dace.scalar(dace.uint32) outsize[0] = 0 ratio = np.float32(args["ratio"]) print("Predicate-Based Filter. size={}, ratio={} ({}specialized)".format( N.get(), ratio, "" if args["specialize"] else "not ")) A[:] = np.random.rand(N.get()).astype(dace.float32.type) B[:] = dace.float32(0) sdfg = make_sdfg(args["specialize"]) sdfg.draw_to_file() if args["specialize"]: sdfg.specialize(dict(N=N)) sdfg(A=A, B=B, outsize=outsize, ratio=ratio)
def product(i: _[0:N]): a << A[i] b << B[i] o >> out(1, lambda x, y: x + y) o = a * b if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("N", type=int, nargs="?", default=64) args = vars(parser.parse_args()) A = dace.ndarray([N], dtype=dace.float32) B = dace.ndarray([N], dtype=dace.float32) out_AB = dace.scalar(dace.float64) out_AA = dace.scalar(dace.float64) N.set(args["N"]) print('Dot product %d' % (N.get())) A[:] = np.random.rand(N.get()).astype(dace.float32.type) B[:] = np.random.rand(N.get()).astype(dace.float32.type) out_AB[0] = dace.float64(0) out_AA[0] = dace.float64(0) cdot = dace.compile(dot, A, B, out_AB) cdot(A, B, out_AB) # To allow reloading the SDFG code file with the same name
def dot(A: dace.float32[N], B: dace.float32[N], out: dace.float32[1]): @dace.map def product(i: _[0:N]): a << A[i] b << B[i] o >> out(1, lambda x, y: x + y) o = a * b if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("N", type=int, nargs="?", default=64) args = vars(parser.parse_args()) N.set(args["N"]) A = dace.ndarray([N], dtype=dace.float32) B = dace.ndarray([N], dtype=dace.float32) out_AB = dace.scalar(dace.float32) print('Dot product %d' % (N.get())) A[:] = np.random.rand(N.get()).astype(dace.float32.type) B[:] = np.random.rand(N.get()).astype(dace.float32.type) out_AB[0] = dace.float32(0) dot(A, B, out_AB) diff_ab = np.linalg.norm(np.dot(A, B) - out_AB) / float(N.get()) print("Difference (A*B):", diff_ab) exit(0 if (diff_ab <= 1e-5) else 1)
else: W.set(args["W"]) num_stages = 2 * W.get() - 1 sdfg = make_sdfg(False) sdfg.specialize() N.set(args["N"]) sdfg.add_constants({"num_stages": 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, allow_conflicts=True) outsize[0] = 0 A[:] = np.random.rand(N.get()).astype(dtype.type) B[:] = dtype(0) sdfg.draw_to_file() if args["specialize"]: sdfg.specialize() sdfg(A=A, B=B, outsize=outsize, ratio=ratio) else: sdfg(A=A, B=B, outsize=outsize, ratio=ratio, N=N) if dace.Config.get_bool('profiling'): dace.timethis('filter', 'numpy', 0, regression, A, ratio)
if __name__ == "__main__": print("==== Program start ====") parser = argparse.ArgumentParser() parser.add_argument("N", type=int, nargs="?", default=24) parser.add_argument("--compile-only", default=False, action="store_true", dest="compile-only") args = vars(parser.parse_args()) dace.config.Config.set("compiler", "intel_fpga", "mode", value="emulator") N.set(args["N"]) print('Vectors addition %d' % (N.get())) # Initialize arrays: X, Y and Z X = np.random.rand(N.get()).astype(dace.float32.type) s = dace.scalar(dace.float32) vector_reduce(X, s) #compute expected result s_exp = 0.0 for x in X: s_exp += x print(s) print(s_exp) diff = np.linalg.norm(s_exp - s) / N.get() print("Difference:", diff) print("==== Program end ====") exit(0 if diff <= 1e-5 else 1)