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
|
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,21 +467,27 @@ 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
|
||||||
fig, axes = plt.subplots(2, 2, figsize=(18.0, 11.5))
|
up via _FS so the figure stays legible when fit to the page."""
|
||||||
_draw_flow_case(axes[0, 0], "doorbell")
|
global _FS
|
||||||
_draw_flow_case(axes[0, 1], "hmq")
|
_FS = 1.5
|
||||||
_draw_flow_case(axes[1, 0], "rdma")
|
try:
|
||||||
_draw_flow_case(axes[1, 1], "ipcq")
|
fig, axes = plt.subplots(2, 2, figsize=(18.0, 11.5))
|
||||||
fig.suptitle(
|
_draw_flow_case(axes[0, 0], "doorbell")
|
||||||
"Per-send architecture = $\\Sigma$ control overhead + "
|
_draw_flow_case(axes[0, 1], "hmq")
|
||||||
"data-path DMA + receiver wake",
|
_draw_flow_case(axes[1, 0], "rdma")
|
||||||
fontsize=14.5, fontweight="bold", y=0.995)
|
_draw_flow_case(axes[1, 1], "ipcq")
|
||||||
_flow_legend(fig, leg_y=0.015)
|
fig.suptitle(
|
||||||
fig.tight_layout(rect=(0, 0.07, 1, 0.96))
|
"Per-send architecture = $\\Sigma$ control overhead + "
|
||||||
out = _OUT_DIR / "ipcq_alternatives_architecture_flow.png"
|
"data-path DMA + receiver wake",
|
||||||
fig.savefig(out, dpi=150, bbox_inches="tight")
|
fontsize=14.5 * _FS, fontweight="bold", y=0.995)
|
||||||
plt.close(fig)
|
_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
|
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."""
|
||||||
for ax, kind in zip(axes, ["doorbell", "hmq", "rdma", "ipcq"]):
|
global _FS
|
||||||
_draw_flow_case(ax, kind)
|
_FS = 1.9
|
||||||
fig.suptitle(
|
try:
|
||||||
"Per-send architecture = $\\Sigma$ control overhead + "
|
fig, axes = plt.subplots(4, 1, figsize=(13.0, 15.0))
|
||||||
"data-path DMA + receiver wake",
|
for ax, kind in zip(axes, ["doorbell", "hmq", "rdma", "ipcq"]):
|
||||||
fontsize=14.5, fontweight="bold", y=0.997)
|
_draw_flow_case(ax, kind)
|
||||||
_flow_legend(fig, leg_y=0.010)
|
fig.suptitle(
|
||||||
fig.tight_layout(rect=(0, 0.05, 1, 0.97))
|
"Per-send architecture = $\\Sigma$ control overhead + "
|
||||||
out = _OUT_DIR / "ipcq_alternatives_architecture_stacked.png"
|
"data-path DMA + receiver wake",
|
||||||
fig.savefig(out, dpi=150, bbox_inches="tight")
|
fontsize=14.5 * _FS, fontweight="bold", y=0.997)
|
||||||
plt.close(fig)
|
_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
|
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 |