4859149392e50b1e8b1bb136d4f220a02ed320ca
New ``_attention_mesh_mlo_2d.py`` decomposes a ``(mesh_rows x mesh_cols)`` cube sub-mesh into two stages of bidirectional AllReduce-mlo: Stage 1 — row reduce (E/W edges, mesh_cols-1 steps) Stage 2 — col reduce (N/S edges, mesh_rows-1 steps) After both stages every cube holds the same final ``(m, l, o)`` and writes the normalized output. The online-softmax mlo merge is associative, so row-then-col partitioning is mathematically equivalent to a 1D ring AllReduce-mlo over all ``mesh_rows * mesh_cols`` cubes but uses fewer hops: - 2x4 (8 cubes / KV-group): 4 steps vs 7 (1.75x faster) - 4x4 (16 cubes / full SIP): 6 steps vs 15 (2.5x faster) Motivation: the original 1D ring kernel ``_attention_mesh_mlo.py`` hit ``IpcqInvalidDirection`` at cube 4 when ``n_ranks=8`` on the 4x4 cube mesh — cube 4 has no W neighbor at the row 0/1 boundary. N/S edges are already installed by ``configure_sfr_intercube_multisip`` so the 2D kernel runs on existing wiring without SFR changes. The kernel accepts ``cube_start: int = 0`` and subtracts it from ``program_id(axis=1)`` so the ring math uses launch-local rank. This matters because kernbench's ``program_id(axis=1)`` returns the physical cube id (ADR-0022), so a launch starting at cube 8 would otherwise compute ``my_row = 8//4 = 2`` (out of sub-mesh bounds) and deadlock. Default ``cube_start=0`` keeps the existing multi_user_decode validation behavior bit-for-bit. Bench dispatch: ``multi_user_decode`` in milestone-gqa-llama70b now uses the 2D kernel via a new ``mesh_shape`` column in ``_PANEL_DISPATCH``. At validation ``N_RANKS_MULTI_USER=4``, the shape is ``(1, 4)`` — a degenerate single-row mesh, equivalent in step count and op_log structure to the prior 1D ring at n_ranks=4. The other three panels keep their 1D kernels. Tests: 4 new unit tests in ``test_mesh_mlo_2d_correctness.py`` — 1x4 (degenerate row), 2x4 (8-KV-group target), 4x4 (full SIP), and 2x4 at cube_start=8 (the second sub-mesh per SIP). Existing milestone (12 tests) and mesh-kernels-rank-axis (7 tests) suites stay green — no regression. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
kernbench
A discrete-event simulator for AI accelerator hardware, built on SimPy. It models the full data path — from host PCIe injection through IO chiplet, NOC mesh, crossbar, and HBM — to measure end-to-end latency with contention and queueing.
Architecture
Host (CLI)
|
+-- kernbench run -> run a benchmark (QKV GEMM, AllReduce, ...)
+-- kernbench probe -> latency/BW analysis for predefined traffic patterns
|
v
+---------------------------------------------------+
| Runtime API (runtime_api/) |
| MemoryWriteMsg, MemoryReadMsg, PeDmaMsg, |
| KernelLaunchMsg |
+---------------------------------------------------+
| Simulation Engine (sim_engine/) |
| SimPy processes, wire model, BW occupancy |
+---------------------------------------------------+
| Components (components/) |
| pcie_ep, io_cpu, m_cpu, noc, xbar, hbm_ctrl, |
| pe_cpu, pe_dma, pe_gemm, pe_math, pe_tcm, ... |
+---------------------------------------------------+
| Topology (topology/) |
| YAML-driven graph: 4x4 cube mesh, UCIe links, |
| IO chiplet with NOC, HBM slices |
+---------------------------------------------------+
Prerequisites
- Python 3.10+
- Dependencies:
simpy,pyyaml,pytest
Installation
# Create virtual environment
python -m venv .venv
# Activate (Windows)
.venv\Scripts\activate
# Activate (Linux/macOS)
source .venv/bin/activate
# Install in editable mode
pip install -e ".[dev]"
Usage
Probe — Latency and Bandwidth Analysis
The probe command runs predefined traffic patterns (H2D write, D2H read,
PE DMA) and reports latency breakdown, bottleneck bandwidth, and utilization.
# Run all probe cases
kernbench probe --topology topology.yaml
# Run a specific case
kernbench probe --topology topology.yaml --case pe-local-hbm
Output includes:
- Summary tables — actual latency, overhead/drain/wire breakdown, effective BW, utilization
- BW saturation sweep — utilization at 4KB through 1MB to show saturation threshold
- Per-hop route traces — cumulative timestamps at every node along the path
Run — Execute a Benchmark
# Run a benchmark on all devices
kernbench run --topology topology.yaml --bench qkv_gemm
# Run on a specific device
kernbench run --topology topology.yaml --bench qkv_gemm --device sip:0
Available benchmarks (in benches/):
qkv_gemm— single-PE QKV GEMMqkv_gemm_multi_pe— multi-PE QKV GEMMipcq_allreduce— IPCQ AllReduce
Tests
# Run all tests (278 tests)
pytest
# Run a specific test file
pytest tests/test_probe.py -v
# Run a single test
pytest tests/test_probe.py::test_h2d_latency_monotonic -v
# Run with output shown
pytest -s tests/test_probe.py
Key test files:
| File | Coverage |
|---|---|
test_probe.py |
Probe latency invariants, monotonicity, determinism, BW sweep |
test_engine.py |
SimPy engine: submit/wait/complete, routing, multi-SIP |
test_bw_occupancy.py |
Wire BW contention, HOL blocking, back-to-back serialization |
test_iochiplet_noc_d2h.py |
IO chiplet NOC topology, H2D/D2H data paths |
test_noc_mesh.py |
2D mesh NOC routing, Manhattan distance |
test_pe_components.py |
PE-internal components: cpu, scheduler, dma, gemm |
test_routing.py |
XY routing, address resolution, path finding |
test_topology_compile.py |
YAML topology compilation, node/edge validation |
Topology Configuration
The system is configured via topology.yaml. Key parameters:
| Parameter | Default | Description |
|---|---|---|
ns_per_mm |
0.01 | Wire propagation delay (10 ps/mm) |
cube_mesh |
4x4 | Cube grid dimensions per SIP |
ucie.overhead_ns |
8.0 | UCIe protocol overhead per port (16ns per crossing) |
hbm_ctrl.efficiency |
0.8 | HBM effective BW factor (256 to 204.8 GB/s) |
xbar.overhead_ns |
2.0 | Crossbar arbitration delay |
xbar_to_hbm_bw_gbs |
256.0 | Raw HBM bandwidth per slice |
Project Structure
kernbench/
+-- src/kernbench/
| +-- cli/ # CLI entry points (main, probe, report)
| +-- common/ # Shared types (Completion, RequestHandle, Trace)
| +-- components/ # Hardware component models (SimPy processes)
| +-- di/ # Dependency injection
| +-- policy/ # Routing (XY), address decoding (PhysAddr)
| +-- runtime_api/ # Host-facing API (messages, bench runner)
| +-- sim_engine/ # Discrete-event engine, transaction, wire model
| +-- topology/ # YAML builder, mesh generator, graph types
| +-- triton_emu/ # Triton kernel emulation
+-- benches/ # Benchmark implementations
+-- tests/ # pytest test suite (278 tests)
+-- docs/ # ADRs, latency model docs, diagrams
+-- topology.yaml # System topology configuration
+-- CHANGES.md # Changelog
Documentation
- CHANGES.md — changelog with detailed descriptions of each release
- docs/onboarding/latency-model.md — latency model explanation with worked examples
- docs/onboarding/ — onboarding guides (architecture overview, latency model, CCL author guide, intro presentation)
- docs/adr/ — Architecture Decision Records
Description
Languages
Python
97.6%
HTML
2.4%