diff --git a/docs/diagrams/cube_view.svg b/docs/diagrams/cube_view.svg index 522b909..1900de0 100644 --- a/docs/diagrams/cube_view.svg +++ b/docs/diagrams/cube_view.svg @@ -190,9 +190,9 @@ 256GB/s r2c0 - - M_CPU - + + M_CPU + r2c1 @@ -201,9 +201,9 @@ r2c5 r3c0 - - SRAM - + + SRAM + r3c1 @@ -274,38 +274,38 @@ UCIe-S.c3 256GB/s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PE Router diff --git a/src/kernbench/topology/visualizer.py b/src/kernbench/topology/visualizer.py index 39965e6..e61a4fe 100644 --- a/src/kernbench/topology/visualizer.py +++ b/src/kernbench/topology/visualizer.py @@ -603,8 +603,12 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str: bx, by = bx_base + 4, py + offset_x - blk_h / 2 else: bx, by = px + offset_x - blk_w / 2, py - r_size - blk_h - 4 + elif kind in ("mcpu", "sram"): + # M_CPU/SRAM: place to the left of router (avoid mesh overlap) + bx = px - r_size - blk_w - 6 + by = py - blk_h / 2 + bi * (blk_h + 2) else: - # PE/M_CPU/SRAM: place above (top half) or below (bottom half) + # PE: place above (top half) or below (bottom half) bx = px + offset_x - blk_w / 2 if is_top: by = py - r_size - blk_h - 4 - bi * (blk_h + 2) @@ -651,8 +655,15 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str: f'x2="{px + r_size:.0f}" y2="{py:.0f}" ' f'stroke="{style["stroke"]}" stroke-width="1" opacity="0.6"/>' ) + elif kind in ("mcpu", "sram"): + # Horizontal connector (block right edge → router left edge) + parts.append( + f' ' + ) else: - # Vertical connector + # Vertical connector (PE above/below router) ly1 = by + blk_h if is_top else by ly2 = py - r_size if is_top else py + r_size parts.append( @@ -674,6 +685,8 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str: ) # ── Router → HBM_CTRL lines (drawn last, on top of everything) ── + # Lines go from router to the HBM zone edge, angled toward HBM center + # to visually distinguish from vertical mesh links for rkey, rval in routers.items(): if rval is None: continue @@ -683,12 +696,13 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str: r_edge_y = py + r_size if py < hbm_y else py - r_size if abs(r_edge_y - hbm_edge_y) > 10: has_pe = any(a.endswith(".dma") for a in rval.get("attach", [])) - # PE routers: thicker, more visible sw = "1.5" if has_pe else "0.7" - op = "0.6" if has_pe else "0.2" + op = "0.6" if has_pe else "0.15" + # Angle toward HBM center x (hcx) — slight offset, not fully straight + dx = (hcx - px) * 0.3 # 30% pull toward center parts.append( f' ' )