Skip to content

Commit

Permalink
Merge pull request #130 from weiya711/add_sparse_dense_conversion_graph
Browse files Browse the repository at this point in the history
Add sparse dense conversion graph
  • Loading branch information
bobcheng15 authored Apr 30, 2024
2 parents 91a2915 + a8c09c6 commit f839b4c
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 62 deletions.
20 changes: 20 additions & 0 deletions compiler/sam-outputs/onyx-dot/mat_dn2sp.gv
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
digraph SAM {
comment="X=ss01,B=dd01"
5 [comment="type=fiberlookup,index=i,tensor=B,mode=0,format=dense,src=true,root=true" label="FiberLookup i: B0\ndense" color=green4 shape=box style=filled type="fiberlookup" index="i" tensor="B" mode="0" format="dense" src="true" root="true"]
2 [comment="type=fiberwrite,index=i,tensor=X,mode=0,format=compressed,segsize=2,crdsize=B0_dim,sink=true" label="FiberWrite i: X0\ncompressed" color=green3 shape=box style=filled type="fiberwrite" index="i" tensor="X" mode="0" format="compressed" segsize="2" crdsize="B0_dim" sink="true"]
4 [comment="type=fiberlookup,index=j,tensor=B,mode=1,format=dense,src=true,root=false" label="FiberLookup j: B1\ndense" color=green4 shape=box style=filled type="fiberlookup" index="j" tensor="B" mode="1" format="dense" src="true" root="false"]
1 [comment="type=fiberwrite,index=j,tensor=X,mode=1,format=compressed,segsize=B0_dim+1,crdsize=B0_dim*B1_dim,sink=true" label="FiberWrite j: X1\ncompressed" color=green3 shape=box style=filled type="fiberwrite" index="j" tensor="X" mode="1" format="compressed" segsize="B0_dim+1" crdsize="B0_dim*B1_dim" sink="true"]
3 [comment="type=arrayvals,tensor=B" label="Array Vals: B" color=green2 shape=box style=filled type="arrayvals" tensor="B"]
0 [comment="type=fiberwrite,mode=vals,tensor=X,size=1*B0_dim*B1_dim,sink=true" label="FiberWrite Vals: X" color=green3 shape=box style=filled type="fiberwrite" tensor="X" mode="vals" size="1*B0_dim*B1_dim" sink="true"]
6 [comment="type=crddrop,outer=j,inner=val,mode=0" label="CrdDrop Compression j, val" color=orange style=filled type="crddrop" outer="j" inner="val" mode="0"]
7 [comment="type=crddrop,outer=i,inner=j" label="CrdDrop i,j" color=orange shape=box style=filled type="crddrop" outer="i" inner="j"]
5 -> 4 [label="ref" style=bold type="ref" comment=""]
4 -> 3 [label="ref" style=bold type="ref" comment=""]
3 -> 6 [label="val" type="val" comment="inner-val"]
4 -> 6 [label="crd_outer-j" style=dashed type="crd" comment="outer-j"]
6 -> 7 [label="crd_inner-j" style=dashed type="crd" comment="outer-j"]
5 -> 7 [label="crd_outer-i" style=dashed type="crd" comment="outer_i"]
6 -> 0 [label="val" type="val" comment="inner-val"]
7 -> 1 [label="crd_innner-j" style=dashed type="crd" comment="inner-j"]
7 -> 2 [label="crd_outer-i" style=dashed type="crd" comment="outer-i"]
}
32 changes: 32 additions & 0 deletions compiler/sam-outputs/onyx-dot/mat_sp2dn.gv
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
digraph SAM {
comment="X=ss01,B=dd01,C=ss01"
10 [comment="type=fiberlookup,index=i,tensor=B,mode=0,format=dense,src=true,root=true" label="FiberLookup i: B0\ndense" color=green4 shape=box style=filled type="fiberlookup" index="i" tensor="B" mode="0" format="dense" src="true" root="true"]
9 [comment="type=union,index=i" label="union i" color=purple shape=box style=filled type="union" index="i"]
2 [comment="type=fiberwrite,index=i,tensor=X,mode=0,format=compressed,segsize=2,crdsize=B0_dim,sink=true" label="FiberWrite i: X0\ncompressed" color=green3 shape=box style=filled type="fiberwrite" index="i" tensor="X" mode="0" format="compressed" segsize="2" crdsize="B0_dim" sink="true"]
7 [comment="type=fiberlookup,index=j,tensor=B,mode=1,format=dense,src=true,root=false" label="FiberLookup j: B1\ndense" color=green4 shape=box style=filled type="fiberlookup" index="j" tensor="B" mode="1" format="dense" src="true" root="false"]
6 [comment="type=union,index=j" label="union j" color=purple shape=box style=filled type="union" index="j"]
1 [comment="type=fiberwrite,index=j,tensor=X,mode=1,format=compressed,segsize=B0_dim+1,crdsize=B0_dim*B1_dim,sink=true" label="FiberWrite j: X1\ncompressed" color=green3 shape=box style=filled type="fiberwrite" index="j" tensor="X" mode="1" format="compressed" segsize="B0_dim+1" crdsize="B0_dim*B1_dim" sink="true"]
4 [comment="type=arrayvals,tensor=B" label="Array Vals: B" color=green2 shape=box style=filled type="arrayvals" tensor="B"]
3 [comment="type=add,sub=0" label="Add" color=brown shape=box style=filled type="add" sub="0"]
0 [comment="type=fiberwrite,mode=vals,tensor=X,size=1*B0_dim*B1_dim,sink=true" label="FiberWrite Vals: X" color=green3 shape=box style=filled type="fiberwrite" tensor="X" mode="vals" size="1*B0_dim*B1_dim" sink="true"]
5 [comment="type=arrayvals,tensor=C" label="Array Vals: C" color=green2 shape=box style=filled type="arrayvals" tensor="C"]
8 [comment="type=fiberlookup,index=j,tensor=C,mode=1,format=compressed,src=true,root=false" label="FiberLookup j: C1\ncompressed" color=green4 shape=box style=filled type="fiberlookup" index="j" tensor="C" mode="1" format="compressed" src="true" root="false"]
11 [comment="type=fiberlookup,index=i,tensor=C,mode=0,format=compressed,src=true,root=true" label="FiberLookup i: C0\ncompressed" color=green4 shape=box style=filled type="fiberlookup" index="i" tensor="C" mode="0" format="compressed" src="true" root="true"]
10 -> 9 [label="crd_in-B" style=dashed type="crd" comment="in-B"]
9 -> 2 [label="crd" style=dashed type="crd"]
9 -> 7 [label="ref_out-B" style=bold type="ref" comment="out-B"]
7 -> 6 [label="crd_in-B" style=dashed type="crd" comment="in-B"]
6 -> 1 [label="crd" style=dashed type="crd"]
6 -> 4 [label="ref_out-B" style=bold type="ref" comment="out-B"]
4 -> 3 [label="val" type="val"]
3 -> 0 [label="val" type="val"]
6 -> 5 [label="ref_out-C" style=bold type="ref" comment="out-C"]
5 -> 3 [label="val" type="val"]
7 -> 6 [label="ref_in-B" style=bold type="ref" comment="in-B"]
9 -> 8 [label="ref_out-C" style=bold type="ref" comment="out-C"]
8 -> 6 [label="crd_in-C" style=dashed type="crd" comment="in-C"]
8 -> 6 [label="ref_in-C" style=bold type="ref" comment="in-C"]
10 -> 9 [label="ref_in-B" style=bold type="ref" comment="in-B"]
11 -> 9 [label="crd_in-C" style=dashed type="crd" comment="in-C"]
11 -> 9 [label="ref_in-C" style=bold type="ref" comment="in-C"]
}
82 changes: 20 additions & 62 deletions sam/onyx/parse_dot.py
Original file line number Diff line number Diff line change
Expand Up @@ -922,9 +922,6 @@ def rewrite_lookup(self):

for node in nodes_to_proc:
if 'fiberlookup' in node.get_comment():
print("PRINTING NODES")
print(node.get_attributes())
print(node.get_name())
# Rewrite this node to a read
root = bool(node.get_root())
root = False
Expand All @@ -935,50 +932,6 @@ def rewrite_lookup(self):
og_label = attrs['label']
del attrs['label']

dense_ = attrs['format'].strip('"') == 'dense'
print(f"IS DENSE: {dense_}")

# if dense_:

# rd_scan = pydot.Node(f"rd_scan_{self.get_next_seq()}",
# **attrs, label=f"{og_label}_rd_scan", hwnode=f"{HWNodeType.ReadScanner}",
# fa_color=self.fa_color)

# self.fa_color += 1

# crd_out_edge = [edge for edge in self.graph.get_edges() if edge.get_source() == node.get_name() and
# "crd" in edge.get_label()][0]
# ref_out_edge = [edge for edge in self.graph.get_edges() if edge.get_source() == node.get_name() and
# "ref" in edge.get_label()][0]
# ref_in_edge = None
# if not root:
# # Then we have ref in edge...
# ref_in_edge = [edge for edge in self.graph.get_edges()
# if edge.get_destination() == node.get_name() and
# "ref" in edge.get_label()][0]
# # Now add the nodes and move the edges...
# self.graph.add_node(rd_scan)

# # Now inject the read scanner to other nodes...
# rd_to_down_crd = pydot.Edge(src=rd_scan, dst=crd_out_edge.get_destination(),
# **crd_out_edge.get_attributes())
# rd_to_down_ref = pydot.Edge(src=rd_scan, dst=ref_out_edge.get_destination(),
# **ref_out_edge.get_attributes())
# self.graph.add_edge(rd_to_down_crd)
# self.graph.add_edge(rd_to_down_ref)
# if ref_in_edge is not None:
# up_to_ref = pydot.Edge(src=ref_in_edge.get_source(), dst=rd_scan, **ref_in_edge.get_attributes())
# self.graph.add_edge(up_to_ref)

# # Delte old stuff...
# ret = self.graph.del_node(node)
# ret = self.graph.del_edge(crd_out_edge.get_source(), crd_out_edge.get_destination())
# self.graph.del_edge(ref_out_edge.get_source(), ref_out_edge.get_destination())
# if ref_in_edge is not None:
# self.graph.del_edge(ref_in_edge.get_source(), ref_in_edge.get_destination())

# else:

rd_scan = pydot.Node(f"rd_scan_{self.get_next_seq()}",
**attrs, label=f"{og_label}_rd_scan", hwnode=f"{HWNodeType.ReadScanner}",
fa_color=self.fa_color)
Expand All @@ -994,22 +947,25 @@ def rewrite_lookup(self):
# Only instantiate the glb_write if it doesn't exist
tensor = attrs['tensor'].strip('"')
mode = attrs['mode'].strip('"')
print(mode)
if f'{tensor}_{mode}_fiberlookup' in self.shared_writes and \
self.shared_writes[f'{tensor}_{mode}_fiberlookup'][1] is not None:
glb_write = self.shared_writes[f'{tensor}_{mode}_fiberlookup'][1]
else:
glb_write = pydot.Node(f"glb_write_{self.get_next_seq()}",
**attrs, label=f"{og_label}_glb_write", hwnode=f"{HWNodeType.GLB}")
self.graph.add_node(glb_write)
if f'{tensor}_{mode}_fiberlookup' in self.shared_writes:
self.shared_writes[f'{tensor}_{mode}_fiberlookup'][1] = glb_write
is_dense = attrs['format'].strip('"') == 'dense'

# dense scanner is basically a counter that counts up to the dimension size
# and does not rely on the GLB tile to supply any data
glb_write = None
if not is_dense:
if f'{tensor}_{mode}_fiberlookup' in self.shared_writes and \
self.shared_writes[f'{tensor}_{mode}_fiberlookup'][1] is not None:
glb_write = self.shared_writes[f'{tensor}_{mode}_fiberlookup'][1]
else:
glb_write = pydot.Node(f"glb_write_{self.get_next_seq()}",
**attrs, label=f"{og_label}_glb_write", hwnode=f"{HWNodeType.GLB}")
self.graph.add_node(glb_write)
if f'{tensor}_{mode}_fiberlookup' in self.shared_writes:
self.shared_writes[f'{tensor}_{mode}_fiberlookup'][1] = glb_write
if self.local_mems is False:
memory = pydot.Node(f"memory_{self.get_next_seq()}", **attrs,
label=f"{og_label}_SRAM", hwnode=f"{HWNodeType.Memory}")

# Entertain multiple edges

# Now add the nodes and move the edges...
self.graph.add_node(rd_scan)
self.graph.add_node(wr_scan)
Expand All @@ -1018,9 +974,11 @@ def rewrite_lookup(self):
if self.local_mems is False:
self.graph.add_node(memory)
# Glb to WR
glb_to_wr = pydot.Edge(src=glb_write, dst=wr_scan, label=f"glb_to_wr_{self.get_next_seq()}",
style="bold")
self.graph.add_edge(glb_to_wr)
# Dense scanner doesn't need data from the GLB, hence no connection to the GLB
if not is_dense:
glb_to_wr = pydot.Edge(src=glb_write, dst=wr_scan, label=f"glb_to_wr_{self.get_next_seq()}",
style="bold")
self.graph.add_edge(glb_to_wr)
# write + read to buffet
wr_to_buff = pydot.Edge(src=wr_scan, dst=buffet, label=f'wr_to_buff_{self.get_next_seq()}')
self.graph.add_edge(wr_to_buff)
Expand Down

0 comments on commit f839b4c

Please sign in to comment.