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
updates riding a 16\,B side-channel credit (\S\ref{sec:allreduce}).
\begin{figure}[t]
\begin{figure*}[t]
\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
signalling mechanisms (sender\,$\rightarrow$\,NoC\,$\rightarrow$\,receiver).
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
a \emph{design schematic}, not a measured comparison.}
\label{fig:ipcq-arch}
\end{figure}
\end{figure*}
\begin{figure}[t]
\centering
@@ -243,6 +243,12 @@ _FLOW_DATA = "#6699CC" # blue flit (data)
_FLOW_CTRL = "#ED7D65" # orange flit (control)
_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):
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))
ax.text(x + w / 2, y + h / 2 + (0.20 if sub else 0),
label, ha="center", va="center",
fontsize=10.5, fontweight="bold", color="#111")
fontsize=10.5 * _FS, fontweight="bold", color="#111")
if sub:
ax.text(x + w / 2, y + h / 2 - 0.35, sub,
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):
@@ -265,7 +271,7 @@ def _flow_flit(ax, x, y, color, letter="", size=0.32):
facecolor=color, edgecolor="#222", linewidth=0.8))
if letter:
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"):
@@ -280,7 +286,7 @@ def _flow_dot(ax, x, y, color):
def _flow_label(ax, x, y, text, color="#222", fontsize=9):
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"):
@@ -297,7 +303,7 @@ def _flow_setup(ax, kind):
facecolor="white", edgecolor=_COLOR[kind],
linewidth=0.9, alpha=0.85, zorder=0))
ax.text(10, 0.65, _TITLE[kind],
ha="center", va="center", fontsize=11.5,
ha="center", va="center", fontsize=11.5 * _FS,
fontweight="bold",
color=("#1B5E20" if kind == "ipcq" else "white"),
bbox=dict(
@@ -449,7 +455,7 @@ def _flow_legend(fig, leg_y=0.02):
facecolor=color, edgecolor="#222", linewidth=0.6,
transform=fig.transFigure))
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")
lx += 0.32
@@ -461,7 +467,11 @@ def _flow_legend(fig, leg_y=0.02):
def _plot_architecture_flow() -> Path:
"""4 panels arranged 2×2 — each a horizontal Sender → NoC → Receiver
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))
_draw_flow_case(axes[0, 0], "doorbell")
_draw_flow_case(axes[0, 1], "hmq")
@@ -470,12 +480,14 @@ def _plot_architecture_flow() -> Path:
fig.suptitle(
"Per-send architecture = $\\Sigma$ control overhead + "
"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)
fig.tight_layout(rect=(0, 0.07, 1, 0.96))
out = _OUT_DIR / "ipcq_alternatives_architecture_flow.png"
fig.savefig(out, dpi=150, bbox_inches="tight")
plt.close(fig)
finally:
_FS = 1.0
return out
@@ -483,19 +495,25 @@ def _plot_architecture_flow() -> Path:
def _plot_architecture_stacked() -> Path:
"""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
horizontal room."""
fig, axes = plt.subplots(4, 1, figsize=(16.0, 19.0))
horizontal room. Rendered at full text width (two-column figure*), so
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"]):
_draw_flow_case(ax, kind)
fig.suptitle(
"Per-send architecture = $\\Sigma$ control overhead + "
"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)
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"
fig.savefig(out, dpi=150, bbox_inches="tight")
plt.close(fig)
finally:
_FS = 1.0
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