コード例 #1
0
ファイル: chained_tasklet_test.py プロジェクト: zurvar/dace
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
コード例 #2
0
ファイル: compile_sdfg_test.py プロジェクト: am-ivanov/dace
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
コード例 #3
0
ファイル: ger_test.py プロジェクト: thobauma/dace
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
ファイル: loop_to_map_test.py プロジェクト: gibchikafa/dace
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
コード例 #7
0
    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"]:
コード例 #8
0
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
コード例 #9
0
ファイル: chained_tasklet_test.py プロジェクト: orausch/dace
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'))
コード例 #10
0
ファイル: ger_test.py プロジェクト: zurvar/dace
        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.")
コード例 #11
0
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")