public ProgramGraph CreateUnrolledProgramGraph(int k) { ProgramGraph g = new ProgramGraph(); ValueNode[] ap = new ValueNode[k + 1]; ValueNode[] bp = new ValueNode[k + 1]; ValueNode[] cp = new ValueNode[k + 1]; for (int i = 0; i < k + 1; i++) { ap[i] = new TestRegisterNode("a[" + i + "]", Datatype.AddressValue); bp[i] = new TestRegisterNode("b[" + i + "]", Datatype.AddressValue); cp[i] = new TestRegisterNode("c[" + i + "]", Datatype.AddressValue); g.AddNode(ap[i]); g.AddNode(bp[i]); g.AddNode(cp[i]); } ValueNode k0 = new TestRegisterNode("k0", Datatype.FloatValue); ValueNode k1 = new TestRegisterNode("k1", Datatype.FloatValue); g.AddNode(k0); g.AddNode(k1); for (int i = 0; i < k; i++) { CreateSingleLoop( g, ap[i], bp[i], cp[i], k0, k1, ap[i + 1], bp[i + 1], cp[i + 1]); } g.InitInputValues(); g.InitOutputValues(); g.OutputValues.Add(k0); g.OutputValues.Add(k1); g.CyclicDependencies[ap[0]] = ap[k]; g.CyclicDependencies[ap[k]] = ap[0]; g.CyclicDependencies[bp[0]] = bp[k]; g.CyclicDependencies[bp[k]] = bp[0]; g.CyclicDependencies[cp[0]] = cp[k]; g.CyclicDependencies[cp[k]] = cp[0]; return g; }
public ProgramGraph CreateUnrolledProgramGraph(int k) { ProgramGraph g = new ProgramGraph(); ValueNode[] xp = new ValueNode[k + 1]; ValueNode[] yp = new ValueNode[k + 1]; ValueNode[] y = new ValueNode[k + 1]; ValueNode[] x = new ValueNode[k + 1]; for (int i = 0; i < k + 1; i++) { xp[i] = new TestRegisterNode("xp[" + i + "]", Datatype.AddressValue); yp[i] = new TestRegisterNode("yp[" + i + "]", Datatype.AddressValue); y[i] = new TestRegisterNode("y[" + i + "]", Datatype.FloatValue); x[i] = new TestRegisterNode("x[" + i + "]", Datatype.FloatValue); g.AddNode(xp[i]); g.AddNode(yp[i]); g.AddNode(x[i]); g.AddNode(y[i]); } ValueNode pc0 = new FloatMemoryNode("c0"); ValueNode pc1 = new FloatMemoryNode("c1"); ValueNode pc2 = new FloatMemoryNode("c2"); OperationNode lc0 = new LoadOperationNode(); OperationNode lc1 = new LoadOperationNode(); OperationNode lc2 = new LoadOperationNode(); ValueNode c0 = new FloatRegisterNode(); ValueNode c1 = new FloatRegisterNode(); ValueNode c2 = new FloatRegisterNode(); g.AddNode(pc0); g.AddNode(pc1); g.AddNode(pc2); g.AddNode(lc0); g.AddNode(lc1); g.AddNode(lc2); g.AddNode(c0); g.AddNode(c1); g.AddNode(c2); g.AddEdge(pc0, lc0); g.AddEdge(lc0, c0); g.AddEdge(pc1, lc1); g.AddEdge(lc1, c1); g.AddEdge(pc2, lc2); g.AddEdge(lc2, c2); for (int i = 0; i < k; i++) { CreateSingleLoop( g, xp[i], yp[i], x[i], y[i], c0, c1, c2, xp[i + 1], yp[i + 1], x[i + 1], y[i + 1]); } g.InitInputValues(); g.InitOutputValues(); g.OutputValues.Add(x[k]); g.OutputValues.Add(y[k]); x[k].OutputFlag = true; y[k].OutputFlag = true; g.CyclicDependencies[xp[0]] = xp[k]; g.CyclicDependencies[xp[k]] = xp[0]; g.CyclicDependencies[yp[0]] = yp[k]; g.CyclicDependencies[yp[k]] = yp[0]; g.CyclicDependencies[y[0]] = y[k]; g.CyclicDependencies[y[k]] = y[0]; g.CyclicDependencies[x[0]] = x[k]; g.CyclicDependencies[x[k]] = x[0]; return g; }
public ProgramGraph CreateUnrolledProgramGraph(int k) { ProgramGraph g = new ProgramGraph(); ValueNode[] px = new ValueNode[k + 1]; ValueNode[] py = new ValueNode[k + 1]; for (int i = 0; i < k + 1; i++) { px[i] = new TestRegisterNode("x[" + i + "]", Datatype.AddressValue); py[i] = new TestRegisterNode("y[" + i + "]", Datatype.AddressValue); g.AddNode(px[i]); g.AddNode(py[i]); } ValueNode[] x = new ValueNode[k]; ValueNode[] y = new ValueNode[k]; for (int i = 0; i < k; i++) { x[i] = new FloatRegisterNode(); y[i] = new FloatRegisterNode(); g.AddNode(x[i]); g.AddNode(y[i]); } ValueNode[] x0 = new ValueNode[k + 1]; ValueNode[] x1 = new ValueNode[k + 1]; for (int i = 0; i < k + 1; i++) { x0[i] = new TestRegisterNode("x0[" + i + "]", Datatype.FloatValue); x1[i] = new TestRegisterNode("x1[" + i + "]", Datatype.FloatValue); g.AddNode(x0[i]); g.AddNode(x1[i]); } ValueNode pc0 = new FloatMemoryNode("c0"); ValueNode pc1 = new FloatMemoryNode("c1"); ValueNode pc2 = new FloatMemoryNode("c2"); ValueNode pc3 = new FloatMemoryNode("c3"); ValueNode pc4 = new FloatMemoryNode("c4"); OperationNode lc0 = new LoadOperationNode(); OperationNode lc1 = new LoadOperationNode(); OperationNode lc2 = new LoadOperationNode(); OperationNode lc3 = new LoadOperationNode(); OperationNode lc4 = new LoadOperationNode(); ValueNode c0 = new FloatRegisterNode(); ValueNode c1 = new FloatRegisterNode(); ValueNode c2 = new FloatRegisterNode(); ValueNode c3 = new FloatRegisterNode(); ValueNode c4 = new FloatRegisterNode(); g.AddNode(pc0); g.AddNode(pc1); g.AddNode(pc2); g.AddNode(pc3); g.AddNode(pc4); g.AddNode(lc0); g.AddNode(lc1); g.AddNode(lc2); g.AddNode(lc3); g.AddNode(lc4); g.AddNode(c0); g.AddNode(c1); g.AddNode(c2); g.AddNode(c3); g.AddNode(c4); g.AddEdge(pc0, lc0); g.AddEdge(lc0, c0); g.AddEdge(pc1, lc1); g.AddEdge(lc1, c1); g.AddEdge(pc2, lc2); g.AddEdge(lc2, c2); g.AddEdge(pc3, lc3); g.AddEdge(lc3, c3); g.AddEdge(pc4, lc4); g.AddEdge(lc4, c4); for (int i = 0; i < k; i++) { CreateLoadIncGraph( g, x[i], px[i], px[i + 1], 4); CreateStoreIncGraph( g, y[i], py[i], py[i + 1], 4); CreateSingleFilterLoop( g, x[i], x0[i], x1[i], c0, c1, c2, c3, c4, x0[i + 1], x1[i + 1], y[i]); } g.InitInputValues(); g.InitOutputValues(); g.CyclicDependencies[x0[0]] = x0[k]; g.CyclicDependencies[x0[k]] = x0[0]; g.CyclicDependencies[x1[0]] = x1[k]; g.CyclicDependencies[x1[k]] = x1[0]; g.CyclicDependencies[px[0]] = px[k]; g.CyclicDependencies[px[k]] = px[0]; g.CyclicDependencies[py[0]] = py[k]; g.CyclicDependencies[py[k]] = py[0]; return g; }
public ProgramGraph CreateUnrolledProgramGraph(int k) { ProgramGraph g = new ProgramGraph(); ValueNode[] ap = new ValueNode[k + 1]; ValueNode[] bp = new ValueNode[k + 1]; ValueNode[] s = new ValueNode[k + 1]; ValueNode[] cp = new ValueNode[k + 1]; ValueNode[] dp = new ValueNode[k + 1]; ValueNode[] t = new ValueNode[k + 1]; for (int i = 0; i < k + 1; i++) { ap[i] = new TestRegisterNode("a[" + i + "]", Datatype.AddressValue); bp[i] = new TestRegisterNode("b[" + i + "]", Datatype.AddressValue); s[i] = new TestRegisterNode("s[" + i + "]", Datatype.FloatValue); g.AddNode(ap[i]); g.AddNode(bp[i]); g.AddNode(s[i]); cp[i] = new TestRegisterNode("c[" + i + "]", Datatype.AddressValue); dp[i] = new TestRegisterNode("d[" + i + "]", Datatype.AddressValue); t[i] = new TestRegisterNode("t[" + i + "]", Datatype.FloatValue); g.AddNode(cp[i]); g.AddNode(dp[i]); g.AddNode(t[i]); } for (int i = 0; i < k; i++) { CreateSingleLoop( g, ap[i], bp[i], s[i], ap[i + 1], bp[i + 1], s[i + 1]); CreateSingleLoop( g, cp[i], dp[i], t[i], cp[i + 1], dp[i + 1], t[i + 1]); } g.InitInputValues(); g.InitOutputValues(); g.CyclicDependencies[s[0]] = s[k]; g.CyclicDependencies[s[k]] = s[0]; g.CyclicDependencies[ap[0]] = ap[k]; g.CyclicDependencies[ap[k]] = ap[0]; g.CyclicDependencies[bp[0]] = bp[k]; g.CyclicDependencies[bp[k]] = bp[0]; g.CyclicDependencies[t[0]] = t[k]; g.CyclicDependencies[t[k]] = t[0]; g.CyclicDependencies[cp[0]] = cp[k]; g.CyclicDependencies[cp[k]] = cp[0]; g.CyclicDependencies[dp[0]] = dp[k]; g.CyclicDependencies[dp[k]] = dp[0]; return g; }
public ProgramGraph CreateUnrolledProgramGraph(int k) { ProgramGraph g = new ProgramGraph(); ValueNode[] px = new ValueNode[k]; ValueNode[] x = new ValueNode[k]; ValueNode[] py = new ValueNode[k]; ValueNode[] my = new ValueNode[k]; ValueNode[] y = new ValueNode[k]; OperationNode[] lx = new OperationNode[k]; OperationNode[] sy = new OperationNode[k]; for (int i = 0; i < k; i++) { px[i] = new FloatMemoryNode("x[" + i + "]"); lx[i] = new LoadOperationNode(); x[i] = new FloatRegisterNode(); g.AddNode(px[i]); g.AddNode(lx[i]); g.AddNode(x[i]); g.AddEdge(px[i], lx[i]); g.AddEdge(lx[i], x[i]); y[i] = new FloatRegisterNode(); py[i] = new FloatMemoryNode("y[" + i + "]"); sy[i] = new StoreOperationNode(); my[i] = new FloatMemoryNode(null); g.AddNode(y[i]); g.AddNode(py[i]); g.AddNode(sy[i]); g.AddNode(my[i]); g.AddEdge(y[i], sy[i]); g.AddEdge(py[i], sy[i]); g.AddEdge(sy[i], my[i]); } ValueNode[] x0 = new ValueNode[k + 1]; ValueNode[] x1 = new ValueNode[k + 1]; for (int i = 0; i < k + 1; i++) { x0[i] = new FloatRegisterNode(); x1[i] = new FloatRegisterNode(); g.AddNode(x0[i]); g.AddNode(x1[i]); } ValueNode px00 = new FloatMemoryNode("x0[0]"); ValueNode px10 = new FloatMemoryNode("x1[0]"); OperationNode lx00 = new LoadOperationNode(); OperationNode lx10 = new LoadOperationNode(); g.AddNode(px00); g.AddNode(px10); g.AddNode(lx00); g.AddNode(lx10); g.AddEdge(px00, lx00); g.AddEdge(lx00, x0[0]); g.AddEdge(px10, lx10); g.AddEdge(lx10, x1[0]); ValueNode px0k = new FloatMemoryNode("x0[" + k + "]"); ValueNode px1k = new FloatMemoryNode("x1[" + k + "]"); ValueNode mx0k = new FloatMemoryNode(null); ValueNode mx1k = new FloatMemoryNode(null); OperationNode sx0k = new StoreOperationNode(); OperationNode sx1k = new StoreOperationNode(); g.AddNode(px0k); g.AddNode(px1k); g.AddNode(mx0k); g.AddNode(mx1k); g.AddNode(sx0k); g.AddNode(sx1k); g.AddEdge(x0[k], sx0k); g.AddEdge(px0k, sx0k); g.AddEdge(sx0k, mx0k); g.AddEdge(x1[k], sx1k); g.AddEdge(px1k, sx1k); g.AddEdge(sx1k, mx1k); ValueNode pc0 = new FloatMemoryNode("c0"); ValueNode pc1 = new FloatMemoryNode("c1"); ValueNode pc2 = new FloatMemoryNode("c2"); ValueNode pc3 = new FloatMemoryNode("c3"); ValueNode pc4 = new FloatMemoryNode("c4"); OperationNode lc0 = new LoadOperationNode(); OperationNode lc1 = new LoadOperationNode(); OperationNode lc2 = new LoadOperationNode(); OperationNode lc3 = new LoadOperationNode(); OperationNode lc4 = new LoadOperationNode(); ValueNode c0 = new FloatRegisterNode(); ValueNode c1 = new FloatRegisterNode(); ValueNode c2 = new FloatRegisterNode(); ValueNode c3 = new FloatRegisterNode(); ValueNode c4 = new FloatRegisterNode(); g.AddNode(pc0); g.AddNode(pc1); g.AddNode(pc2); g.AddNode(pc3); g.AddNode(pc4); g.AddNode(lc0); g.AddNode(lc1); g.AddNode(lc2); g.AddNode(lc3); g.AddNode(lc4); g.AddNode(c0); g.AddNode(c1); g.AddNode(c2); g.AddNode(c3); g.AddNode(c4); g.AddEdge(pc0, lc0); g.AddEdge(lc0, c0); g.AddEdge(pc1, lc1); g.AddEdge(lc1, c1); g.AddEdge(pc2, lc2); g.AddEdge(lc2, c2); g.AddEdge(pc3, lc3); g.AddEdge(lc3, c3); g.AddEdge(pc4, lc4); g.AddEdge(lc4, c4); for (int i = 0; i < k; i++) { CreateSingleFilterLoop( g, x[i], x0[i], x1[i], c0, c1, c2, c3, c4, x0[i + 1], x1[i + 1], y[i]); } g.InitInputValues(); g.InitOutputValues(); return g; }