def _test_quantitatively(sdfg): graph = sdfg.nodes()[0] A = np.random.rand(N.get()).astype(np.float64) B = np.random.rand(N.get()).astype(np.float64) C1 = np.random.rand(N.get()).astype(np.float64) C2 = np.random.rand(N.get()).astype(np.float64) D1 = np.random.rand(N.get()).astype(np.float64) D2 = np.random.rand(N.get()).astype(np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, D=D1, N=N) del csdfg subgraph = SubgraphView(graph, [node for node in graph.nodes()]) me = MultiExpansion(subgraph) assert me.can_be_applied(sdfg, subgraph) == True me.apply(sdfg) sf = SubgraphFusion(subgraph) assert sf.can_be_applied(sdfg, subgraph) == True sf.apply(sdfg) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, D=D2, N=N) assert np.allclose(C1, C2) assert np.allclose(D1, D2)
def test_quantitatively(sdfg): graph = sdfg.nodes()[0] A = np.random.rand(N.get()).astype(np.float64) B = np.random.rand(N.get()).astype(np.float64) C1 = np.random.rand(N.get()).astype(np.float64) C2 = np.random.rand(N.get()).astype(np.float64) D1 = np.random.rand(N.get()).astype(np.float64) D2 = np.random.rand(N.get()).astype(np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C1, D=D1, N=N) subgraph = SubgraphView(graph, [node for node in graph.nodes()]) expansion = MultiExpansion() fusion = SubgraphFusion() assert expansion.match(sdfg, subgraph) == True expansion.apply(sdfg, subgraph) assert fusion.match(sdfg, subgraph) == True fusion.apply(sdfg, subgraph) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C2, D=D2, N=N) assert np.allclose(C1, C2) assert np.allclose(D1, D2)
def invoke_stencil(tile_size, offset=False, unroll=False, view=False): A = np.random.rand(N.get()).astype(np.float64) B1 = np.zeros((N.get()), dtype=np.float64) B2 = np.zeros((N.get()), dtype=np.float64) B3 = np.zeros((N.get()), dtype=np.float64) if offset: sdfg = stencil_offset.to_sdfg() else: sdfg = stencil.to_sdfg() sdfg.simplify() graph = sdfg.nodes()[0] if view: sdfg.view() # baseline sdfg.name = 'baseline' csdfg = sdfg.compile() csdfg(A=A, B=B1, N=N) del csdfg subgraph = SubgraphView(graph, [n for n in graph.nodes()]) st = StencilTiling() st.setup_match(subgraph) st.tile_size = (tile_size, ) st.schedule = dace.dtypes.ScheduleType.Sequential assert st.can_be_applied(sdfg, subgraph) if unroll: st.unroll_loops = True st.apply(sdfg) if view: sdfg.view() sdfg.name = 'tiled' sdfg.validate() csdfg = sdfg.compile() csdfg(A=A, B=B2, N=N) del csdfg assert np.allclose(B1, B2) sdfg.simplify() subgraph = SubgraphView(graph, [n for n in graph.nodes()]) sf = SubgraphFusion() sf.setup_match(subgraph) assert sf.can_be_applied(sdfg, subgraph) # also test consolidation sf.consolidate = True sf.apply(sdfg) sdfg.name = 'fused' csdfg = sdfg.compile() csdfg(A=A, B=B3, N=N) del csdfg print(np.linalg.norm(B1)) print(np.linalg.norm(B3)) assert np.allclose(B1, B2) assert np.allclose(B1, B3) print("PASS")
def test_p1(): N.set(20) M.set(30) O.set(50) P.set(40) Q.set(42) R.set(25) sdfg = subgraph_fusion_parallel.to_sdfg() sdfg.simplify() state = sdfg.nodes()[0] 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) D = np.random.rand(M.get()).astype(np.float64) E = np.random.rand(N.get()).astype(np.float64) F = np.random.rand(P.get()).astype(np.float64) G = np.random.rand(M.get()).astype(np.float64) H = np.random.rand(P.get()).astype(np.float64) I = np.random.rand(N.get()).astype(np.float64) J = np.random.rand(R.get()).astype(np.float64) X = np.random.rand(N.get()).astype(np.float64) Y = np.random.rand(M.get()).astype(np.float64) Z = np.random.rand(P.get()).astype(np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C, D=D, E=E, F=F, G=G, H=H, I=I, J=J, X=X, Y=Y, Z=Z,\ N=N, M=M, O=O, P=P, R=R,Q=Q) del csdfg subgraph = SubgraphView(state, [node for node in state.nodes()]) expansion = MultiExpansion() expansion.setup_match(subgraph) fusion = SubgraphFusion() fusion.setup_match(subgraph) me = MultiExpansion() me.setup_match(subgraph) assert me.can_be_applied(sdfg, subgraph) me.apply(sdfg) sf = SubgraphFusion() sf.setup_match(subgraph) assert sf.can_be_applied(sdfg, subgraph) sf.apply(sdfg) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C, D=D, E=E, F=F, G=G, H=H, I=I, J=J, X=X, Y=Y, Z=Z,\ N=N, M=M, O=O, P=P, R=R,Q=Q) print("PASS")
def invoke_stencil(tile_size, offset=False, unroll=False): A = np.random.rand(N.get() * 2).astype(np.float64) B1 = np.zeros((N.get()), dtype=np.float64) B2 = np.zeros((N.get()), dtype=np.float64) B3 = np.zeros((N.get()), dtype=np.float64) if offset: sdfg = stencil_offset.to_sdfg() else: sdfg = stencil.to_sdfg() sdfg.simplify() graph = sdfg.nodes()[0] # baseline sdfg.name = f'baseline_{tile_size}_{offset}_{unroll}' csdfg = sdfg.compile() csdfg(A=A, B=B1, N=N) del csdfg subgraph = SubgraphView(graph, [n for n in graph.nodes()]) st = StencilTiling() st.setup_match(subgraph) st.tile_size = (tile_size, ) st.unroll_loops = unroll assert st.can_be_applied(sdfg, subgraph) # change schedule so that OMP never fails st.schedule = dace.dtypes.ScheduleType.Sequential st.apply(sdfg) sdfg.name = f'tiled_{tile_size}_{offset}_{unroll}' csdfg = sdfg.compile() csdfg(A=A, B=B2, N=N) del csdfg sdfg.simplify() subgraph = SubgraphView(graph, [n for n in graph.nodes()]) sf = SubgraphFusion() sf.setup_match(subgraph) assert sf.can_be_applied(sdfg, subgraph) sf.apply(sdfg) sdfg.name = f'fused_{tile_size}_{offset}_{unroll}' csdfg = sdfg.compile() csdfg(A=A, B=B3, N=N) del csdfg print(np.linalg.norm(B1)) print(np.linalg.norm(B3)) print("PASS")
def apply(self, sdfg): subgraph = self.subgraph_view(sdfg) graph = subgraph.graph scope_dict = graph.scope_dict() map_entries = helpers.get_outermost_scope_maps(sdfg, graph, subgraph, scope_dict) first_entry = next(iter(map_entries)) if self.allow_expansion: expansion = MultiExpansion() expansion.setup_match(subgraph, self.sdfg_id, self.state_id) expansion.permutation_only = not self.expansion_split if expansion.can_be_applied(sdfg, subgraph): expansion.apply(sdfg) sf = SubgraphFusion() sf.setup_match(subgraph, self.sdfg_id, self.state_id) if sf.can_be_applied(sdfg, self.subgraph_view(sdfg)): # set SubgraphFusion properties sf.debug = self.debug sf.transient_allocation = self.transient_allocation sf.schedule_innermaps = self.schedule_innermaps sf.apply(sdfg) self._global_map_entry = sf._global_map_entry return elif self.allow_tiling == True: st = StencilTiling() st.setup_match(subgraph, self.sdfg_id, self.state_id) if st.can_be_applied(sdfg, self.subgraph_view(sdfg)): # set StencilTiling properties st.debug = self.debug st.unroll_loops = self.stencil_unroll_loops st.strides = self.stencil_strides st.apply(sdfg) # StencilTiling: update nodes new_entries = st._outer_entries subgraph = helpers.subgraph_from_maps(sdfg, graph, new_entries) sf = SubgraphFusion() sf.setup_match(subgraph, self.sdfg_id, self.state_id) # set SubgraphFusion properties sf.debug = self.debug sf.transient_allocation = self.transient_allocation sf.schedule_innermaps = self.schedule_innermaps sf.apply(sdfg) self._global_map_entry = sf._global_map_entry return warnings.warn("CompositeFusion::Apply did not perform as expected")
def test_p1(): N.set(20) M.set(30) O.set(50) P.set(40) Q.set(42) R.set(25) sdfg = program.to_sdfg() sdfg.apply_strict_transformations() state = sdfg.nodes()[0] 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) D = np.random.rand(M.get()).astype(np.float64) E = np.random.rand(N.get()).astype(np.float64) F = np.random.rand(P.get()).astype(np.float64) G = np.random.rand(M.get()).astype(np.float64) H = np.random.rand(P.get()).astype(np.float64) I = np.random.rand(N.get()).astype(np.float64) J = np.random.rand(R.get()).astype(np.float64) X = np.random.rand(N.get()).astype(np.float64) Y = np.random.rand(M.get()).astype(np.float64) Z = np.random.rand(P.get()).astype(np.float64) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C, D=D, E=E, F=F, G=G, H=H, I=I, J=J, X=X, Y=Y, Z=Z,\ N=N, M=M, O=O, P=P, R=R,Q=Q) del csdfg subgraph = SubgraphView(state, [node for node in state.nodes()]) expansion = MultiExpansion(subgraph) fusion = SubgraphFusion(subgraph) assert MultiExpansion.can_be_applied(sdfg, subgraph) expansion.apply(sdfg) assert SubgraphFusion.can_be_applied(sdfg, subgraph) fusion.apply(sdfg) csdfg = sdfg.compile() csdfg(A=A, B=B, C=C, D=D, E=E, F=F, G=G, H=H, I=I, J=J, X=X, Y=Y, Z=Z,\ N=N, M=M, O=O, P=P, R=R,Q=Q) print("PASS")
def test_p1(): sdfg = disjoint_test_1.to_sdfg() sdfg.simplify() state = sdfg.nodes()[0] assert len(sdfg.nodes()) == 1 A = np.random.rand(M.get(), 2).astype(np.float64) A1 = A.copy() A2 = A.copy() csdfg = sdfg.compile() csdfg(A=A1, N=N, M=M) del csdfg subgraph = SubgraphView(state, state.nodes()) sf = SubgraphFusion(subgraph) assert sf.can_be_applied(sdfg, subgraph) sf.apply(sdfg) csdfg = sdfg.compile() csdfg(A=A2, M=M) del csdfg assert np.allclose(A1, A2)