def test_p3(in_transient, out_transient): sdfg = reduction_test_3.to_sdfg() sdfg.apply_strict_transformations() state = sdfg.nodes()[0] A = np.random.rand(M.get(), N.get()).astype(np.float64) B = np.random.rand(M.get(), N.get()).astype(np.float64) C1 = np.zeros([N.get()], dtype=np.float64) C2 = np.zeros([N.get()], dtype=np.float64) C3 = np.zeros([N.get()], dtype=np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, N=N, M=M) del csdfg expand_reduce(sdfg, state, create_in_transient=in_transient, create_out_transient=out_transient) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, N=N, M=M) del csdfg expand_maps(sdfg, state) fusion(sdfg, state) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C3, N=N, M=M) del csdfg assert np.linalg.norm(C1) > 0.01 assert np.allclose(C1, C2) assert np.allclose(C1, C3)
def test_p1(in_transient, out_transient): sdfg = reduction_test_1.to_sdfg() sdfg.apply_strict_transformations() state = sdfg.nodes()[0] for node in state.nodes(): if isinstance(node, dace.libraries.standard.nodes.Reduce): reduce_node = node assert ReduceExpansion.can_be_applied(state, \ {ReduceExpansion._reduce: state.nodes().index(reduce_node)}, \ 0, \ sdfg) == True A = np.random.rand(M.get(), N.get()).astype(np.float64) B = np.random.rand(M.get(), N.get()).astype(np.float64) C1 = np.zeros([N.get()], dtype=np.float64) C2 = np.zeros([N.get()], dtype=np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, N=N, M=M) del csdfg expand_reduce(sdfg, state, create_in_transient=in_transient, create_out_transient=out_transient) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, N=N, M=M) del csdfg assert np.linalg.norm(C1) > 0.01 assert np.allclose(C1, C2)
def test_quantitatively(sdfg, graph): A = np.random.rand(N.get()).astype(np.float64) B = np.random.rand(M.get()).astype(np.float64) C = np.random.rand(O.get()).astype(np.float64) out1_base = np.ndarray((N.get(), M.get()), np.float64) out2_base = np.ndarray((1), np.float64) out3_base = np.ndarray((N.get(), M.get(), O.get()), np.float64) out1 = np.ndarray((N.get(), M.get()), np.float64) out2 = np.ndarray((1), np.float64) out3 = np.ndarray((N.get(), M.get(), O.get()), np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C, out1=out1_base, out2=out2_base, out3=out3_base, N=N, M=M, O=O) expand_reduce(sdfg, graph) expand_maps(sdfg, graph) subgraph = SubgraphView(graph, [node for node in graph.nodes()]) assert SubgraphFusion.match(sdfg, subgraph) == True fusion(sdfg, graph) sdfg.validate() csdfg = sdfg.compile() csdfg(A=A, B=B, C=C, out1=out1, out2=out2, out3=out3, N=N, M=M, O=O) assert np.allclose(out1, out1_base) assert np.allclose(out2, out2_base) assert np.allclose(out3, out3_base) print('PASS')
def test_p1(in_transient, out_transient): sdfg = reduction_test_1.to_sdfg() sdfg.simplify() state = sdfg.nodes()[0] for node in state.nodes(): if isinstance(node, dace.libraries.standard.nodes.Reduce): reduce_node = node rexp = ReduceExpansion() rexp.setup_match(sdfg, sdfg.sdfg_id, 0, {ReduceExpansion.reduce: state.node_id(reduce_node)}, 0) assert rexp.can_be_applied(state, 0, sdfg) == True A = np.random.rand(M.get(), N.get()).astype(np.float64) B = np.random.rand(M.get(), N.get()).astype(np.float64) C1 = np.zeros([N.get()], dtype=np.float64) C2 = np.zeros([N.get()], dtype=np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, N=N, M=M) del csdfg expand_reduce(sdfg, state, create_in_transient=in_transient, create_out_transient=out_transient) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, N=N, M=M) del csdfg assert np.linalg.norm(C1) > 0.01 assert np.allclose(C1, C2)
def test_p1(): sdfg = test_program.to_sdfg() sdfg.apply_strict_transformations() state = sdfg.nodes()[0] for node in state.nodes(): if isinstance(node, dace.libraries.standard.nodes.Reduce): reduce_node = node assert ReduceExpansion.can_be_applied(state, \ {ReduceExpansion._reduce: state.nodes().index(reduce_node)}, \ 0, \ sdfg) == True A = np.random.rand(M.get(), N.get()).astype(np.float64) B = np.random.rand(M.get(), N.get()).astype(np.float64) C1 = np.zeros([N.get()], dtype=np.float64) C2 = np.zeros([N.get()], dtype=np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, N=N, M=M) expand_reduce(sdfg, state) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, N=N, M=M) assert np.allclose(C1, C2) print(np.linalg.norm(C1)) print(np.linalg.norm(C2)) print("PASS")
def test_p2(): sdfg = test_program2.to_sdfg() sdfg.apply_strict_transformations() state = sdfg.nodes()[0] A = np.random.rand(M.get(), N.get()).astype(np.float64) B = np.random.rand(M.get(), N.get()).astype(np.float64) C1 = np.zeros([N.get()], dtype=np.float64) C2 = np.zeros([N.get()], dtype=np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, N=N, M=M) expand_reduce(sdfg, state) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, N=N, M=M) assert np.allclose(C1, C2) print(np.linalg.norm(C1)) print(np.linalg.norm(C2)) print("PASS")
def test_2fuse(): sdfg = softmax.to_sdfg() sdfg._name = 'softmax_2part' sdfg.apply_strict_transformations() X_in = np.random.rand(H.get(), B.get(), SN.get(), SM.get()).astype(np.float32) csdfg = sdfg.compile() res1 = csdfg(X_in=X_in, H=H, B=B, SN=SN, SM=SM) subgraph = get_partition(sdfg, sdfg.nodes()[0]) expand_reduce(sdfg, sdfg.nodes()[0], subgraph) expand_maps(sdfg, sdfg.nodes()[0], subgraph) fusion(sdfg, sdfg.nodes()[0], subgraph) csdfg = sdfg.compile() res2 = csdfg(X_in=X_in, H=H, B=B, SN=SN, SM=SM) assert np.allclose(res1, res2) print("PASS") return
def test_p2(in_transient, out_transient): sdfg = reduction_test_2.to_sdfg() sdfg.simplify() state = sdfg.nodes()[0] A = np.random.rand(M.get(), N.get()).astype(np.float64) B = np.random.rand(M.get(), N.get()).astype(np.float64) C1 = np.zeros([N.get()], dtype=np.float64) C2 = np.zeros([N.get()], dtype=np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, N=N, M=M) del csdfg expand_reduce(sdfg, state, create_in_transient=in_transient, create_out_transient=out_transient) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, N=N, M=M) assert np.linalg.norm(C1) > 0.01 assert np.allclose(C1, C2)
def test_1fuse(): sdfg = softmax.to_sdfg() sdfg._name = 'softmax_fused' sdfg.apply_strict_transformations() X_in = np.random.rand(H.get(), B.get(), SN.get(), SM.get()).astype(np.float32) csdfg = sdfg.compile() res1 = csdfg(X_in=X_in, H=H, B=B, SN=SN, SM=SM) expand_reduce(sdfg, sdfg.nodes()[0]) expand_maps(sdfg, sdfg.nodes()[0]) fusion(sdfg, sdfg.nodes()[0]) #sdfg.specialize({'SM':SM}) csdfg = sdfg.compile() res2 = csdfg(X_in=X_in, H=H, B=B, SN=SN, SM=SM) print(np.linalg.norm(res1)) print(np.linalg.norm(res2)) assert np.allclose(res1, res2) print("PASS") return
def test_1fuse(): sdfg = softmax.to_sdfg() sdfg.name = 'softmax_fused' sdfg.simplify() X_in = np.random.rand(H.get(), B.get(), SN.get(), SM.get()).astype(np.float32) csdfg = sdfg.compile() res1 = csdfg(X_in=X_in, H=H, B=B, SN=SN, SM=SM) del csdfg expand_reduce(sdfg, sdfg.nodes()[0]) expand_maps(sdfg, sdfg.nodes()[0]) fusion(sdfg, sdfg.nodes()[0]) csdfg = sdfg.compile() res2 = csdfg(X_in=X_in, H=H, B=B, SN=SN, SM=SM) del csdfg print(np.linalg.norm(res1)) print(np.linalg.norm(res2)) assert np.allclose(res1, res2) print("PASS") return
def test_qualitatively(sdfg, graph): expand_reduce(sdfg, graph) expand_maps(sdfg, graph) fusion(sdfg, graph) sdfg.validate() print("PASS")