paper(ipcq): regen alternatives figures + comparison plot + allreduce section

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-23 19:19:55 -07:00
parent 1dade267ff
commit faf011dae5
13 changed files with 55 additions and 37 deletions
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 381 KiB

@@ -145,9 +145,9 @@ with credit return, splitting the control plane into PE\_IPCQ and the
data plane into PE\_DMA, with head updates riding the payload and tail data plane into PE\_DMA, with head updates riding the payload and tail
updates riding a 16\,B side-channel credit (\S\ref{sec:allreduce}). updates riding a 16\,B side-channel credit (\S\ref{sec:allreduce}).
\begin{figure}[t] \begin{figure*}[t]
\centering \centering
\includegraphics[width=\linewidth]{ipcq_alternatives_architecture_stacked.png} \includegraphics[width=0.78\linewidth]{ipcq_alternatives_architecture_flow.png}
\caption{Per-send data and control flow for the four PE-to-PE \caption{Per-send data and control flow for the four PE-to-PE
signalling mechanisms (sender\,$\rightarrow$\,NoC\,$\rightarrow$\,receiver). signalling mechanisms (sender\,$\rightarrow$\,NoC\,$\rightarrow$\,receiver).
Doorbell and RDMA-CQ each issue two fabric transactions (payload then Doorbell and RDMA-CQ each issue two fabric transactions (payload then
@@ -158,7 +158,7 @@ the payload flit train and returns the tail credit on a side channel,
so a send is one MMIO write and a receive is a flip-flop read. This is so a send is one MMIO write and a receive is a flip-flop read. This is
a \emph{design schematic}, not a measured comparison.} a \emph{design schematic}, not a measured comparison.}
\label{fig:ipcq-arch} \label{fig:ipcq-arch}
\end{figure} \end{figure*}
\begin{figure}[t] \begin{figure}[t]
\centering \centering
@@ -243,6 +243,12 @@ _FLOW_DATA = "#6699CC" # blue flit (data)
_FLOW_CTRL = "#ED7D65" # orange flit (control) _FLOW_CTRL = "#ED7D65" # orange flit (control)
_FLOW_CRED = "#7BB661" # green (credit / ack) _FLOW_CRED = "#7BB661" # green (credit / ack)
# Font-size multiplier for the flow helpers. The stacked figure renders at
# full text width (a two-column figure*), so its fonts are scaled up here so
# they stay legible after the figure is fit to the page. Default 1.0 leaves
# the 2×2 flow figure unchanged.
_FS = 1.0
def _flow_swim(ax, x, y, w, h, label, sub=None): def _flow_swim(ax, x, y, w, h, label, sub=None):
ax.add_patch(mpatches.FancyBboxPatch( ax.add_patch(mpatches.FancyBboxPatch(
@@ -251,11 +257,11 @@ def _flow_swim(ax, x, y, w, h, label, sub=None):
facecolor="white", edgecolor="#3a3a3a", linewidth=1.6)) facecolor="white", edgecolor="#3a3a3a", linewidth=1.6))
ax.text(x + w / 2, y + h / 2 + (0.20 if sub else 0), ax.text(x + w / 2, y + h / 2 + (0.20 if sub else 0),
label, ha="center", va="center", label, ha="center", va="center",
fontsize=10.5, fontweight="bold", color="#111") fontsize=10.5 * _FS, fontweight="bold", color="#111")
if sub: if sub:
ax.text(x + w / 2, y + h / 2 - 0.35, sub, ax.text(x + w / 2, y + h / 2 - 0.35, sub,
ha="center", va="center", ha="center", va="center",
fontsize=8, color="#555", fontstyle="italic") fontsize=8 * _FS, color="#555", fontstyle="italic")
def _flow_flit(ax, x, y, color, letter="", size=0.32): def _flow_flit(ax, x, y, color, letter="", size=0.32):
@@ -265,7 +271,7 @@ def _flow_flit(ax, x, y, color, letter="", size=0.32):
facecolor=color, edgecolor="#222", linewidth=0.8)) facecolor=color, edgecolor="#222", linewidth=0.8))
if letter: if letter:
ax.text(x, y, letter, ha="center", va="center", ax.text(x, y, letter, ha="center", va="center",
fontsize=8.5, fontweight="bold", color="white") fontsize=8.5 * _FS, fontweight="bold", color="white")
def _flow_wire(ax, x1, x2, y, color="#888"): def _flow_wire(ax, x1, x2, y, color="#888"):
@@ -280,7 +286,7 @@ def _flow_dot(ax, x, y, color):
def _flow_label(ax, x, y, text, color="#222", fontsize=9): def _flow_label(ax, x, y, text, color="#222", fontsize=9):
ax.text(x, y, text, ha="center", va="center", ax.text(x, y, text, ha="center", va="center",
fontsize=fontsize, color=color, fontweight="bold") fontsize=fontsize * _FS, color=color, fontweight="bold")
def _flow_lead(ax, x_tail, y_tail, x_head, y_head, color="#777"): def _flow_lead(ax, x_tail, y_tail, x_head, y_head, color="#777"):
@@ -297,7 +303,7 @@ def _flow_setup(ax, kind):
facecolor="white", edgecolor=_COLOR[kind], facecolor="white", edgecolor=_COLOR[kind],
linewidth=0.9, alpha=0.85, zorder=0)) linewidth=0.9, alpha=0.85, zorder=0))
ax.text(10, 0.65, _TITLE[kind], ax.text(10, 0.65, _TITLE[kind],
ha="center", va="center", fontsize=11.5, ha="center", va="center", fontsize=11.5 * _FS,
fontweight="bold", fontweight="bold",
color=("#1B5E20" if kind == "ipcq" else "white"), color=("#1B5E20" if kind == "ipcq" else "white"),
bbox=dict( bbox=dict(
@@ -449,7 +455,7 @@ def _flow_legend(fig, leg_y=0.02):
facecolor=color, edgecolor="#222", linewidth=0.6, facecolor=color, edgecolor="#222", linewidth=0.6,
transform=fig.transFigure)) transform=fig.transFigure))
fig.text(lx + 0.025, y + 0.011, text, fig.text(lx + 0.025, y + 0.011, text,
ha="left", va="center", fontsize=10, ha="left", va="center", fontsize=10 * _FS,
fontweight="bold", color="#222") fontweight="bold", color="#222")
lx += 0.32 lx += 0.32
@@ -461,7 +467,11 @@ def _flow_legend(fig, leg_y=0.02):
def _plot_architecture_flow() -> Path: def _plot_architecture_flow() -> Path:
"""4 panels arranged 2×2 — each a horizontal Sender → NoC → Receiver """4 panels arranged 2×2 — each a horizontal Sender → NoC → Receiver
flow with small flit-style packets, dot-marker annotations and a flow with small flit-style packets, dot-marker annotations and a
bottom name plate. Aesthetic mirrors latency_model.png.""" bottom name plate. Aesthetic mirrors latency_model.png. Fonts scaled
up via _FS so the figure stays legible when fit to the page."""
global _FS
_FS = 1.5
try:
fig, axes = plt.subplots(2, 2, figsize=(18.0, 11.5)) fig, axes = plt.subplots(2, 2, figsize=(18.0, 11.5))
_draw_flow_case(axes[0, 0], "doorbell") _draw_flow_case(axes[0, 0], "doorbell")
_draw_flow_case(axes[0, 1], "hmq") _draw_flow_case(axes[0, 1], "hmq")
@@ -470,12 +480,14 @@ def _plot_architecture_flow() -> Path:
fig.suptitle( fig.suptitle(
"Per-send architecture = $\\Sigma$ control overhead + " "Per-send architecture = $\\Sigma$ control overhead + "
"data-path DMA + receiver wake", "data-path DMA + receiver wake",
fontsize=14.5, fontweight="bold", y=0.995) fontsize=14.5 * _FS, fontweight="bold", y=0.995)
_flow_legend(fig, leg_y=0.015) _flow_legend(fig, leg_y=0.015)
fig.tight_layout(rect=(0, 0.07, 1, 0.96)) fig.tight_layout(rect=(0, 0.07, 1, 0.96))
out = _OUT_DIR / "ipcq_alternatives_architecture_flow.png" out = _OUT_DIR / "ipcq_alternatives_architecture_flow.png"
fig.savefig(out, dpi=150, bbox_inches="tight") fig.savefig(out, dpi=150, bbox_inches="tight")
plt.close(fig) plt.close(fig)
finally:
_FS = 1.0
return out return out
@@ -483,19 +495,25 @@ def _plot_architecture_flow() -> Path:
def _plot_architecture_stacked() -> Path: def _plot_architecture_stacked() -> Path:
"""Same per-case flow content as the 2×2 figure, but stacked one """Same per-case flow content as the 2×2 figure, but stacked one
case per row (4 rows × 1 column). Wider panels give each case more case per row (4 rows × 1 column). Wider panels give each case more
horizontal room.""" horizontal room. Rendered at full text width (two-column figure*), so
fig, axes = plt.subplots(4, 1, figsize=(16.0, 19.0)) fonts are scaled up via _FS to stay legible after page fitting."""
global _FS
_FS = 1.9
try:
fig, axes = plt.subplots(4, 1, figsize=(13.0, 15.0))
for ax, kind in zip(axes, ["doorbell", "hmq", "rdma", "ipcq"]): for ax, kind in zip(axes, ["doorbell", "hmq", "rdma", "ipcq"]):
_draw_flow_case(ax, kind) _draw_flow_case(ax, kind)
fig.suptitle( fig.suptitle(
"Per-send architecture = $\\Sigma$ control overhead + " "Per-send architecture = $\\Sigma$ control overhead + "
"data-path DMA + receiver wake", "data-path DMA + receiver wake",
fontsize=14.5, fontweight="bold", y=0.997) fontsize=14.5 * _FS, fontweight="bold", y=0.997)
_flow_legend(fig, leg_y=0.010) _flow_legend(fig, leg_y=0.010)
fig.tight_layout(rect=(0, 0.05, 1, 0.97)) fig.tight_layout(rect=(0, 0.06, 1, 0.97))
out = _OUT_DIR / "ipcq_alternatives_architecture_stacked.png" out = _OUT_DIR / "ipcq_alternatives_architecture_stacked.png"
fig.savefig(out, dpi=150, bbox_inches="tight") fig.savefig(out, dpi=150, bbox_inches="tight")
plt.close(fig) plt.close(fig)
finally:
_FS = 1.0
return out return out
Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 209 KiB