# HG changeset patch # User Nina Engelhardt # Date 1328886955 -3600 # Node ID 2021f42cc6721fe66a4b8ed115c67b34a298d38f # Parent eea8cf5846c7f2ab35b1d2a3ac9a1cea9288a541 scheduling consequence graph construction script diff -r eea8cf5846c7 -r 2021f42cc672 scripts/ucc_and_loop_graph_treatment/parse_loop_graph.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/ucc_and_loop_graph_treatment/parse_loop_graph.py Fri Feb 10 16:15:55 2012 +0100 @@ -0,0 +1,156 @@ +#!/usr/bin/python + +import sys +import csv +import networkx as nx +import matplotlib.pyplot as plt + +def read_from_file(filename): + d = {} + reader = csv.reader(filename) + for row in reader: + try: + if row[0] == "unit": + if not d.has_key("unit"): # not key in d: + d["unit"] = [] + d["unit"].append( ( int(row[1]),int(row[2]) ) ) + if row[0] == "ctlDep": + if not d.has_key("ctlDep"): + d["ctlDep"] = [] + d["ctlDep"].append( ( (int(row[1]),int(row[2])) , (int(row[3]),int(row[4])) ) ) + if row[0] == "commDep": + if not d.has_key("commDep"): + d["commDep"] = [] + d["commDep"].append(( (int(row[1]),int(row[2])) , (int(row[3]),int(row[4])) )) + if row[0] == "dynDep": + if not d.has_key("dynDep"): + d["dynDep"] = [] + d["dynDep"].append(( (int(row[1]),int(row[2])) , (int(row[3]),int(row[4])) )) + if row[0] == "hwDep": + if not d.has_key("hwDep"): + d["hwDep"] = [] + d["hwDep"].append(( (int(row[1]),int(row[2])) , (int(row[3]),int(row[4])) )) + except Exception as e: + print e + continue + return d + +def add_attributes_to_nodes_from_file(g,filename): + counterreader = (csv.reader)(filename,skipinitialspace=True) + for row in counterreader: + if row[0] == "event": + n = (int(row[2]),int(row[3])) + g.node[n][row[1]] = int(row[4]) + g.node["start"]['weight'] = 0 + g.node["end"]['weight'] = 0 + for n in g: + try: + if n!="start" and n!="end": + g.node[n]['weight'] = g.node[n]['CoreLoop_afterWork'] - g.node[n]['CoreLoop_beforeWork'] + g.node[n]['MasterLoop_afterReqHdlr'] - g.node[n]['MasterLoop_beforeReqHdlr'] + g.node[n]['MasterLoop_afterAssign'] - g.node[n]['MasterLoop_beforeAssign'] + except KeyError as e: + print e,n + + +# counterreader = (csv.reader)(filename) +# for row in counterreader: +# n = (int(row[0]),int(row[1])) +# g.node[n]['suspend_point'] = row[2] +# g.node[n]['schedule_check_cycles'] = int(row[4])-int(row[19]) +# g.node[n]['sync_cycles'] = int(row[25])-int(row[24]) +# g.node[n]['assign_cycles'] = int(row[10])-int(row[7]) +# g.node[n]['work_comm_cycles'] = int(row[16])-int(row[13]) +# g.node[n]['status_cycles'] = int(row[22])-int(row[16]) +# g.node[n]['weight'] = g.node[n]['schedule_check_cycles'] + g.node[n]['sync_cycles'] + g.node[n]['assign_cycles'] + g.node[n]['work_comm_cycles'] + g.node[n]['status_cycles'] + +def loopgraph_from_dict(d): + g = nx.DiGraph() + g.add_node("start") + g.add_node("end") + if d.has_key("unit"): + g.add_nodes_from(d["unit"]) + if d.has_key("ctlDep"): + g.add_edges_from(d["ctlDep"]) + if d.has_key("commDep"): + g.add_edges_from(d["commDep"]) + if d.has_key("dynDep"): + g.add_edges_from(d["dynDep"]) + if d.has_key("hwDep"): + g.add_edges_from(d["hwDep"]) + for node in g: + if node != "start" and node != "end": + if len(g.predecessors(node)) == 0: + g.add_edge("start",node) + if len(g.successors(node)) == 0: + g.add_edge(node,"end") + return g + +def path_length(graph,path): + length = 0 + for node in path: + try: + length += graph.node[node]['weight'] + except KeyError as e: + pass + return length + + +def find_critical_path(graph, start, end, path=[]): + path = path + [end] + if start == end: + return path + if not graph.has_node(end): + return None + longest = None + for node in graph.predecessors(end): + if node not in path: + newpath = find_critical_path(graph, start, node, path) + if newpath: + if not longest or path_length(graph,newpath) > path_length(graph,longest): + longest = newpath + return longest + +def build_cg(loopfile,counterfile): + d = read_from_file(loopfile) + print "Parsed file", loopfile.name, "and found:" + if d.has_key("unit"): + print len(d["unit"]), "Units" + if d.has_key("ctlDep"): + print len(d["ctlDep"]), "Control Dependencies" + if d.has_key("commDep"): + print len(d["commDep"]), "Communication Dependencies" + if d.has_key("dynDep"): + print len(d["dynDep"]), "Dynamically chosen Dependencies" + if d.has_key("hwDep"): + print len(d["hwDep"]), "Hardware constraints" + g = loopgraph_from_dict(d) + add_attributes_to_nodes_from_file(g,counterfile) + critical_path = find_critical_path(g,"start","end") + if critical_path == None: + print "No path found!" + nx.draw(g) + else: + print "Expected execution time:\t",path_length(g,critical_path),"cycles" + try: + print "Actual execution time:\t", g.node[(2,98)]['MasterLoop_beforeReqHdlr'] - g.node[(2,1)]['MasterLoop_beforeAssign'], "cycles" + except KeyError: + pass + colors = [] + for node in g.nodes(): + if node in critical_path: + colors.append('r') + else: + colors.append('w') + nx.draw(g, node_color=colors) + plt.show() + + +def main(): + if len(sys.argv)<2: + sys.exit() + uccfile = open(sys.argv[1]) + counterfile = open(sys.argv[2]) + build_cg(uccfile,counterfile) + + +if __name__ == "__main__": + main() diff -r eea8cf5846c7 -r 2021f42cc672 scripts/ucc_and_loop_graph_treatment/parse_ucc.py --- a/scripts/ucc_and_loop_graph_treatment/parse_ucc.py Mon Feb 06 16:58:25 2012 +0100 +++ b/scripts/ucc_and_loop_graph_treatment/parse_ucc.py Fri Feb 10 16:15:55 2012 +0100 @@ -2,7 +2,8 @@ import sys import csv - +import networkx as nx +import matplotlib.pyplot as plt def read_from_file(filename): d = {} @@ -35,6 +36,19 @@ continue return d +def uccgraph_from_dict(d): + g = nx.Graph() + g.add_nodes_from(d["unit"]) + g.add_edges_from(d["ctlDep"]) + g.add_edges_from(d["commDep"]) + for senders,receivers in d["NtoN"]: + g.add_node("NtoN0") + for node in senders: + g.add_edge(node,"NtoN0") + for node in receivers: + g.add_edge("NtoN0",node) + return g + def main(): if len(sys.argv)<1: sys.exit() @@ -49,6 +63,10 @@ print len(d["commDep"]), "Communication Dependencies" if d.has_key("NtoN"): print len(d["NtoN"]), "N to N communicating groups" + g = uccgraph_from_dict(d) + nx.draw_spectral(g) + plt.show() + if __name__ == "__main__": main()