コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
ファイル: filter_fpga.py プロジェクト: orausch/dace
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)
コード例 #8
0
    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
コード例 #9
0
ファイル: dot.py プロジェクト: tobiasholenstein/dace
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)
コード例 #10
0
    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)
コード例 #11
0
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)