diff --git a/tests/analytical_visualization/topology_map.py b/tests/analytical_visualization/topology_map.py index 53a974c..e37e629 100644 --- a/tests/analytical_visualization/topology_map.py +++ b/tests/analytical_visualization/topology_map.py @@ -258,12 +258,27 @@ def _draw_one_sip(ax, cfg: FullConfig, sip_idx: int, pe_w = (inner_w - (PE_COLS - 1) * pe_gap) / PE_COLS pe_h = (inner_h - (PE_ROWS - 1) * pe_gap) / PE_ROWS pes_used = cfg.topo.pes_per_cube_used if is_used else 0 + # When cp_placement=pe, multiple CP ranks live inside this cube's PEs + # (cp_rank = pe_id // tp). Color each PE by its cp_rank so all four + # groups are visible; otherwise fall back to the whole-cube pe_fill. + _cp_packed = is_used and cfg.topo.cp_placement == "pe" and cfg.topo.cp > 1 for pr in range(PE_ROWS): for pc in range(PE_COLS): pe_id = pr * PE_COLS + pc px = x + pe_pad + pc * (pe_w + pe_gap) py = y + pe_pad + (PE_ROWS - 1 - pr) * (pe_h + pe_gap) - fill = pe_fill if pe_id < pes_used else _INACTIVE_PE + if pe_id >= pes_used: + fill = _INACTIVE_PE + elif _cp_packed: + _pe_cp_rank = pe_id // cfg.topo.tp + _pe_color, _pe_pe_fill = _cp_color( + info[0] if is_used else 0, + _pe_cp_rank, + cfg.topo.cp, + ) + fill = _pe_pe_fill + else: + fill = pe_fill pe_rect = patches.Rectangle( (px, py), pe_w, pe_h, facecolor=fill, edgecolor="#666", linewidth=0.3,