Home · ASPLOS 2025 · Machine Learning Systems

PIM Is All You Need: A CXL-Enabled GPU-Free System for Large Language Model Inference

Yufeng Gu, Alireza Khadem, Sumanth Umesh, Ning Liang, Xavier Servot, Onur Mutlu and 2 others

Conference
ASPLOS 2025
Published
2025
Pages
862-881
Citations
42

Generating LLM tokens one at a time leaves a GPU's compute 79% idle while its memory bandwidth gasps — CENT deletes the GPU entirely, spreading Llama-scale models across 32 CXL-networked memory devices whose DRAM banks multiply-accumulate in place (99% of transformer arithmetic) with RISC-V-plus-accelerator sidecars for the softmax-shaped remainder, delivering 2.3× the throughput of four A100s at similar power, 2.9× less energy, and 5.2× more tokens per dollar.

The argument in one glance

  1. Problem

    LLM inference buys FLOPS and needs bytes

    Decoding generates one token at a time: every step streams ALL model weights and the growing KV cache through the chip to do matrix-vector multiplies, with almost no data reuse. Measured on 4 A100s running Llama2-70B, that leaves just 21% of GPU compute utilized (BERT and ResNet, by contrast, saturate it). A business model estimate puts ChatGPT-style serving at ~3617 HGX servers and ~$694K per day — for hardware whose selling point, compute throughput, mostly idles.

  2. What people did

    Batch harder, or move compute into the memory

    Batching fuses many users' matrix-vector ops into matrix-matrix ones — but each user's KV cache is unique and huge, so capacity caps the batch (at 32K context, 4 A100s saturate at batch 8–16), and the attention math stays per-user regardless. The architectural fix is Processing-In-Memory: put multiply-accumulate units next to DRAM banks, where aggregate internal bandwidth dwarfs any external interface. Samsung, SK Hynix, and UPMEM have all built such DRAM.

  3. Why it fell short

    PIM's density tax collides with LLM capacity — so everyone kept the GPU

    Near-bank compute is fabricated in the DRAM process and eats capacity: UPMEM DIMMs lose 50–75% density, HBM-PIM ~25%, GDDR6-AiM ~25%. LLMs need capacity most of all. Prior transformer-PIM systems (AttAcc, NeuPIMs) therefore built HYBRIDS — 8 GPUs plus 8 PIM stacks — keeping the most expensive component in the rack to run a prefill stage that is ~2% of end-to-end time. And processing-NEAR-memory alternatives (Samsung's CXL-PNM) put CMOS compute outside the chips, regaining density but surrendering the bandwidth advantage.

  4. This paper's idea

    A GPU-free rack: CXL-networked PIM with tiny CMOS sidecars

    CENT serves LLMs from 32 CXL devices and no GPU. Each device holds 32 GDDR6-PIM channels whose near-bank units do BF16 multiply-accumulates — over 99% of transformer arithmetic — in place, while a small controller-side PNM layer (exponent/reduction accelerators plus RISC-V cores) handles softmax, RMSNorm, and SiLU. CXL 3.0 links the devices with send/receive, broadcast, and gather primitives, supporting tensor-, pipeline-, and hybrid-parallel mappings. Versus 4 A100s at similar average power: 2.3× throughput, 2.9× less energy, 2.5× cheaper 3-year TCO, 5.2× more tokens per dollar.

Why this problem is worth solving

The economics of LLM serving hinge on a mismatch between what inference needs and what accelerators sell.

arithmetic operations per byte moved from memory — the ratio that decides whether a workload is limited by a chip’s FLOPS or by its memory bandwidth. Matrix-matrix multiplication reuses each loaded value many times (high intensity); matrix-vector multiplication uses each weight exactly once (low intensity, memory-bound)
is the deciding ratio, and autoregressive decoding sits at the wrong end of it: producing each token requires streaming the entire model — tens to hundreds of gigabytes — through the compute units for one matrix-vector pass each, then doing it again for the next token.

The classic remedy, batching, is blocked by a uniquely LLM-shaped obstacle: the

per-conversation storage of every past token’s key and value vectors, consulted by attention at each new token. It grows linearly with context length and is UNIQUE to each user — so it multiplies with batch size, and modern 128K–1M token context windows make it enormous
. Batching multiplies KV-cache footprint until memory runs out — measured on 4×A100, usable batch collapses from 128 at 4K context to 8 at 32K — and even inside a big batch, attention arithmetic stays per-user matrix-vector work. The result: 21% compute utilization, decoding 3.4× slower per token than prefill, and rental bills priced for the unused TFLOPS. Meanwhile every trend — bigger models (405B, 671B), longer contexts (reasoning traces, video) — pushes further toward memory-boundedness. If inference is a memory workload, the provocative question is whether the memory can just do it alone.

What people did before, and where it broke

PIM — DRAM chips with small compute units placed beside each bank. Because every bank can feed its unit simultaneously, aggregate internal bandwidth reaches hundreds of TB/s, versus single-digit TB/s at any external pin interface. The catch: the units are fabricated in the DRAM process, which is bad at logic — they cost die area and thus memory density
is the natural home for matrix-vector work, and silicon exists: Samsung’s HBM-PIM (FIMDRAM), SK Hynix’s GDDR6-AiM, UPMEM’s DIMMs. But turning PIM chips into an LLM system stumbled three ways:

  • The density tax fights the capacity hunger. Near-bank units cost 25–75% of memory density depending on technology. LLMs are the workload that can least afford it: parameters plus KV caches demand hundreds of gigabytes. A PIM-only box built from a few devices simply cannot hold the model.
  • Hybrids keep the cost problem in the rack. AttAcc and NeuPIMs (both covered elsewhere on this site) pair 8 A100-class GPUs with 8 PIM stacks — GPUs for the compute-heavy prefill, PIM for decode. But prefill is ~2% of end-to-end GPU inference time, so the hybrid retains the single most expensive component to accelerate the smallest slice; their 3-year TCO comes out 3.5× and 2.6× above CENT’s.
  • Near-memory compute gives back the bandwidth. Processing-near-memory (PNM) — CMOS compute in the controller or buffer device, as in Samsung’s CXL-PNM for GPT — preserves density and area-efficiency but reads memory at ordinary interface speeds, forfeiting exactly the internal-bandwidth advantage that made in-memory computing attractive.

The missing piece was capacity scaling without GPUs — and that is what

Compute Express Link — an open interconnect on the PCIe physical layer that lets a host attach and pool memory devices with load/store semantics; CXL 3.0 adds switching, up to 4,096 nodes, and ~8× lower latency than network RDMA
memory expansion supplies.

How CENT works

CENT's architecture, from bank to rack

  1. GDDR6-PIM channels

    Each CXL device carries 16 memory chips = 32 GDDR6-PIM channels (16 GB/device after PIM's density cost). Beside every DRAM bank sits a processing unit with 16 BF16 multiply-accumulate lanes fed straight from the bank I/O — matrix-vector products happen where the weights and KV cache live. Aggregate internal bandwidth across the system: 512 TB/s (the 4-A100 baseline's HBM: 8 TB/s).

  2. Near-bank work: >99% of the math new

    All GEMV work — QKV projections, attention scores against the K cache, weighted sums over the V cache, output projection, all FFN layers — runs as MAC_ABK (all-bank multiply-accumulate) and element-wise-multiply instructions broadcast across channels. Grouped-query attention is supported by unrolling its narrow GEMMs into GEMVs.

  3. PNM sidecar: the awkward 1% new

    In the CXL controller (CMOS, area-efficient), each device carries accelerators — 32 exponent processors using Taylor-series hardware, 32 reduction trees, 32 accumulators — plus BOOM RISC-V cores (250 mW each) for square roots, division, and anything future models invent. Together they cover Softmax, RMSNorm, RoPE rotations, and SiLU. A 64 KB Shared Buffer is the PIM↔PNM interchange, seen as 256-bit registers by channels and byte-addressable memory by the cores.

  4. A CXL 3.0 network with collective primitives new

    A 48-port switch connects 32 devices and the host CPU. On top of CXL transactions, CENT builds send/receive, broadcast, multicast, and gather. Latency ~8× below RDMA; bandwidth far below NVLink — deliberately acceptable, because inter-device traffic is tiny (a 16 KB embedding vector per transformer-block hop).

  5. Parallelism mappings new

    Pipeline Parallel: each device hosts a few transformer blocks; prompts flow device-to-device, and the pipeline depth IS the batch (32/40/80 concurrent queries for 7B/13B/70B) — the throughput mapping. Tensor Parallel: one block spread across all 32 devices via gather/broadcast — the latency mapping (batch 1). Hybrids trade between them; data parallelism stacks on top as the fleet grows.

  6. Host + software

    A Xeon host drives the devices through CXL reads/writes; instruction traces per transformer block are verified in a functional simulator; performance modeled in a modified Ramulator2 with GDDR6-PIM timings. The simulator is open source.

From the University of Michigan, ETH Zürich, and Google (ASPLOS 2025; Onur Mutlu among the authors). Total system: 512 GB GDDR6-PIM, 512 TFLOPS near-bank + 96 TFLOPS PNM, ~$14,873 hardware cost vs $42,128 for the 4×A100 baseline.

The idea

If decoding is a memory workload, build the server out of memory. CENT’s central bet is architectural subtraction. Prior systems treated PIM as an attachment to a GPU; CENT observes that the piece of inference the GPU is uniquely good at — high-intensity prefill GEMMs — is ~2% of end-to-end time, and its own PNM+PIM compute is still ~49% of the GPU baseline’s TFLOPS. So it removes the GPU, its 300 W board power, and its $10,000 price from the design entirely, and lets the density-taxed PIM chips multiply until capacity fits the model — which is exactly what CXL memory expansion is for. The cost structure inverts: memory (priced at 10× commodity DRAM for PIM) becomes the system, and the “accelerator” budget drops to a 19 mm² controller die per device.

Split the transformer by arithmetic frequency, not by layer. The enabling measurement: multiply-accumulates are over 99% of a transformer block’s arithmetic. So CENT provisions lavishly for MACs where bandwidth is free (beside every bank) and handles everything else — exponentials for softmax, roots for RMSNorm, SiLU — in a thin CMOS layer shared per device. This is the anti-UPMEM position: a general-purpose near-bank core would pay density and throughput for generality that 1% of operations need. The RISC-V cores are the escape hatch for model evolution: new activation functions become firmware, not silicon.

Cheap links are enough when the tensors that travel are small. Distributing a model across 32 devices sounds like it demands NVLink, but decoding’s inter-device traffic is embedding vectors — 16 KB per block-to-block hop for Llama2-70B — not weights or caches, which never move. That is why CXL’s modest bandwidth (with ~8× lower latency than RDMA and switching to thousands of nodes) suffices, and why pipeline parallelism doubles as the batching mechanism: with 80 blocks spread over 27 devices, 80 pipeline stages hold 80 in-flight queries, recovering throughput that GPU-style batching gets from GEMM fusion — without the KV-capacity squeeze, because capacity scales with device count.

One token through CENT

Decoding one Llama2-70B token on a pipeline-parallel CENT rack

PP = pipeline parallel (3 transformer blocks per device, 27 of 32 devices used). PU = near-bank processing unit (16 BF16 MAC lanes). PNM = controller-side accelerators + RISC-V cores. Shared Buffer = 64 KB PIM↔PNM interchange. Numbers from the paper's Llama2-70B configuration.

Step 1 of 7

A 16 KB vector arrives over CXL

The token's embedding vector lands in this device's Shared Buffer via a CXL send from the previous pipeline stage. The device holds transformer blocks, say, 30–32: all their weights and this conversation's KV-cache slice sit permanently in its 32 GDDR6-PIM channels — no weight ever crosses a wire.

inter-device traffic per hop: one embedding vector (16 KB)
weights + KV cache: resident, never moved

Why it works

  • Decoding’s arithmetic is one pass over resident data → moving compute to the banks converts the bottleneck resource from 8 TB/s of external bandwidth to 512 TB/s of internal bandwidth → the memory-bound stage speeds up 2.5× while the compute-bound stage (prefill, 2% of time) barely matters to the total.
  • MACs are >99% of transformer arithmetic → specializing near-bank silicon to MACs and exiling rare ops to shared CMOS sidecars minimizes the density tax per unit of useful throughput → more model fits per device than any general-purpose near-bank design, and RISC-V firmware absorbs model evolution.
  • Weights and KV caches never leave their banks; only 16 KB embedding vectors travel → interconnect bandwidth demand is tiny → cheap, switchable CXL suffices where NVLink would be overprovisioned, and capacity scales by adding 371devices,not371 devices, not 10,000 GPUs.
  • Pipeline stages hold independent queries → batch size equals pipeline depth, decoupled from any single device’s memory → CENT gets GPU-batching’s throughput benefit without the KV-cache capacity squeeze, which is precisely what collapses GPU batches at long context (128 → 8 from 4K to 32K).
  • No GPU in the bill of materials → hardware cost drops 2.8× (14,873vs14,873 vs 42,128) and power ~8× per device-vs-GPU → the throughput and efficiency gains compound into 5.2× tokens per dollar.

What it costs

  • Prefill is genuinely slower. GPUs beat CENT 2.5× on the compute-intensive prefill stage (CENT has ~49% of their TFLOPS) — CENT’s latency for the prefill portion is 1.4× worse. For workloads dominated by long-prompt understanding rather than generation, the paper itself suggests disaggregation: GPUs for prefill, CENT for decode.
  • Simulated, not fabricated. Results come from a Ramulator2-based simulator with synthesized controller RTL, GDDR6-PIM timings from Samsung/SK Hynix parts, and analytical CXL models — no rack exists. Cost claims lean on estimates (PIM at 10× DRAM price, A100 at a conservatively halved $10K, NRE amortized over a projected 3M-unit volume).
  • The density tax is paid, just distributed. 32 devices carry 512 GB where the same GDDR6 without PIM would hold more; CXL expansion hides but does not repeal the capacity loss.
  • Block granularity quantizes scaling. Throughput plateaus when transformer blocks don’t divide evenly across devices (Llama2-70B’s 80 blocks map cleanly to 40 devices but not 44) — splitting one block across devices costs more communication than it gains.
  • BF16 only, inference only. Near-bank PUs do BF16 multiply-accumulate; training, and the GEMM-heavy workloads GPUs excel at, are out of scope. Grouped-query attention — now standard — narrows CENT’s edge (1.2× on 70B vs 2.3× geomean).
  • A new software stack. Custom ISA, instruction traces per model, host-driven orchestration — none of the CUDA ecosystem applies.

The evaluation

Llama2 7B/13B/70B, each query 512 prefill + 3584 decode tokens, against 4×A100 80 GB running vLLM at its saturating batch of 128 — system sizes chosen for similar average power. Baselines beyond GPUs: Samsung’s CXL-PNM (near-memory, no in-bank compute) and the GPU-PIM hybrids AttAcc and NeuPIMs on GPT3-175B. Performance comes from a cycle-level Ramulator2 model plus functional verification; power from an activity-based model (measured GDDR6 currents, synthesized RTL); costs from a 3-year TCO model covering hardware, power, and NRE.

Serving Llama-scale LLMs: GPUs vs GPU-PIM hybrids vs CENT

Property4× A100 (vLLM)GPU-PIM hybrids (AttAcc / NeuPIMs)CENT (GPU-free)
Hardware philosophy & cost
Decoding vs prefill throughput
LatencyBaseline; batch growth trades latency away (SLA violations at large batch/long context)Not the design target
Power & energy~300 W TDP per GPU; throttles below max clock under decoding loadGPU power plus 116 W per HBM-PIM stack
EconomicsRental $5.45/hr; owned $1.76/hr (3-year)
Main comparison: Llama2 7B/13B/70B, 512 prefill + 3584 decode tokens, GPU batch 128 (vLLM saturation), CENT pipeline-parallel batches 32/40/80; systems sized for similar average power (1/2/4 GPUs vs 8/20/32 devices). GPU-PIM comparisons on GPT3-175B (AttAcc: varied in/out sizes at max batches, 12 CENT devices per GPU-PIM node for power neutrality; NeuPIMs: ShareGPT trace). All CENT numbers from a modified-Ramulator2 simulator with synthesized 28nm→7nm controller RTL, measured GDDR6 power specs, and 3-year TCO models; PIM DRAM priced at 10× commodity DRAM, A100 conservatively at $10K.Underlined values explain themselves when clicked.

Check yourself

Check your understanding

  1. 1. Batching converts matrix-vector work into matrix-matrix work and is the standard fix for low operational intensity. Predict why it fails to rescue GPU utilization for long-context LLM inference.

  2. 2. UPMEM-style PIM puts a general-purpose core beside each bank; CENT puts only BF16 MAC lanes there and pushes everything else to shared controller-side accelerators and RISC-V cores. What justifies this split?

  3. 3. GPUs beat CENT by 2.5× on the prefill stage, yet CENT ships without any GPU. Why is that trade defensible — and when does it break?

  4. 4. Distributing a 70B model across 32 devices usually calls for NVLink-class bandwidth. Why does CENT get away with CXL — and what does pipeline mapping get for free as a result?

Sources

Related papers on Machine Learning Systems

See all 212 →