paper(ipcq): regen alternatives figures + comparison plot + allreduce section
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 305 KiB |
|
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,21 +467,27 @@ 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."""
|
||||
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")
|
||||
_draw_flow_case(axes[1, 0], "rdma")
|
||||
_draw_flow_case(axes[1, 1], "ipcq")
|
||||
fig.suptitle(
|
||||
"Per-send architecture = $\\Sigma$ control overhead + "
|
||||
"data-path DMA + receiver wake",
|
||||
fontsize=14.5, 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)
|
||||
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")
|
||||
_draw_flow_case(axes[1, 0], "rdma")
|
||||
_draw_flow_case(axes[1, 1], "ipcq")
|
||||
fig.suptitle(
|
||||
"Per-send architecture = $\\Sigma$ control overhead + "
|
||||
"data-path DMA + receiver wake",
|
||||
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))
|
||||
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)
|
||||
_flow_legend(fig, leg_y=0.010)
|
||||
fig.tight_layout(rect=(0, 0.05, 1, 0.97))
|
||||
out = _OUT_DIR / "ipcq_alternatives_architecture_stacked.png"
|
||||
fig.savefig(out, dpi=150, bbox_inches="tight")
|
||||
plt.close(fig)
|
||||
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 * _FS, fontweight="bold", y=0.997)
|
||||
_flow_legend(fig, leg_y=0.010)
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 260 KiB After Width: | Height: | Size: 381 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 209 KiB |