The GPU memory wall: why memory, not compute, binds AI infrastructure
TL;DR
The "memory wall" is a thirty-year-old observation — compute speed improves faster than memory speed and capacity, so eventually memory, not the processor, sets the ceiling. In AI infrastructure that ceiling has arrived: a modern GPU can do far more math per second than its fixed on-package HBM can hold or feed, so large-model inference is usually memory-bound, not compute-bound. The practical symptom is teams buying more GPUs than their compute needs just to get memory capacity, then watching that compute sit idle. The structural response is to stop pinning every byte to one GPU or server and instead pool memory — a disaggregated pool shared across servers over a fast fabric.
On this page
What the memory wall is
The memory wall is the gap between how fast a processor can compute and how fast — and how much — memory can feed it. The term is not new: computer architects Wulf and McKee named it in 1995, pointing out that processor speed was improving faster than DRAM, and that the gap between two diverging exponentials itself grows exponentially. Their conclusion was that memory, not the processor, would eventually bound performance.
AI accelerators have walked straight into that wall. A current data-center GPU can perform an enormous number of floating-point operations per second, but it can only hold what fits in its on-package HBM and can only feed the compute as fast as that memory's bandwidth allows. On real large-model workloads the expensive part — the compute — spends much of its time waiting on memory. The bottleneck has moved from FLOPS to bytes.
Two distinct limits make up the wall, and they bind differently:
- Capacity (gigabytes of HBM) decides whether the job fits at all.
- Bandwidth (terabytes per second) decides how fast tokens come out once it fits.
What is HBM and why it matters covers both in detail; this page is about what to do when you hit either one.
Why AI inference is memory-bound, not compute-bound
The clearest way to see the wall is the roofline model: any operation is limited either by compute or by memory, depending on its arithmetic intensity — the number of math operations it does per byte moved from memory. Low intensity means the hardware finishes the math and sits waiting for the next bytes; it is memory-bound.
Large-language-model serving has two phases with opposite character:
- Prefill (processing the prompt) crunches many tokens at once — a matrix-matrix multiply with high arithmetic intensity. It genuinely uses the GPU's compute.
- Decode (generating the answer one token at a time) is a matrix-vector multiply. To produce a single token it must read the model's weights out of HBM — a fixed byte cost no matter how few tokens you process — giving an arithmetic intensity of roughly 1.
Because most production traffic is decode-dominated, the ceiling on tokens per second is set by how fast weights and cache stream out of memory, not by how many FLOPS the GPU can theoretically do. This is why "we bought more compute and throughput barely moved" is such a common story — and why a memory-upgraded part on an older architecture can beat intuition.
The tell-tale symptom: buying GPUs for memory, not compute
Here is the economic distortion the wall creates. Because a model and its working memory must fit in HBM or the job does not run, capacity — not compute — often drives the purchase. Teams add GPUs to add gigabytes, then run decode-heavy traffic that leaves those GPUs' compute units underused. The marginal GPU is a memory purchase wearing a compute price tag.
Two things make this worse:
- HBM cannot be expanded after purchase. It is soldered onto the GPU package. Need more capacity, add another whole GPU.
- HBM is supply-constrained. Memory prices rose sharply through 2025 and high-bandwidth memory has been effectively sold out into 2026, so "just add HBM" is neither cheap nor freely available.
The two ways the wall actually shows up on a cluster are covered in the spokes: KV cache too large for VRAM (the long-context, high-concurrency failure) and stranded DRAM at fleet scale (the fleet-economics failure).
Software levers stretch the budget; they do not add capacity
The first responses to the wall are software, and they are real:
- Quantization — store weights and KV cache in fewer bits (FP8, INT4, and KV-specific schemes). Halves or quarters a footprint.
- KV-cache offload and tiering — spill the KV cache out of HBM to CPU DRAM, SSD, or a remote pool.
- Prefill/decode disaggregation and prefix caching — reuse and relocate cached state instead of recomputing it.
Every one of these is worth doing. But note what they are: ways to stretch a fixed HBM budget, not ways to add capacity. Past a point, the offloaded and tiered bytes need somewhere real to land — which is where the hardware response comes in.
The hardware response: pool the memory
The structural fix is to stop treating memory as something permanently welded to one GPU or one server, and instead build a memory pool many servers can draw from. This is memory disaggregation: capacity lives in a shared appliance and is served over a fast network fabric, so a job that needs more memory borrows it from the pool instead of forcing the purchase of another whole GPU or server.
There are two fabrics in play, and it is worth being precise about their status — this is the honest framing, not a strawman: CXL is the low-latency endgame for rack-scale memory semantics; RDMA/RoCEv2 is what you can pool across servers today without waiting for a new fabric generation. For a team hitting the wall now, the Ethernet-based pool is the deployable answer, and the two are complementary rather than rivals.
| Approach | What it is | Status in 2026 |
|---|---|---|
| CXL memory pooling | Load/store, memory-semantic access to pooled DRAM over the CXL link; very low latency | Real and promising, but most shipping silicon is CXL 2.0 — expansion within a single server. True multi-host pooling needs CXL 3.x switches, fabric, and OS/policy support that are still maturing; key switch silicon is only sampling. Not yet a fleet-scale deployment. |
| RDMA / RoCEv2 disaggregation | A pool of DDR5 shared to many servers over standard lossless Ethernet using RDMA (RoCEv2) | Shipping today. Production KV-cache-offload stacks already move memory over RDMA at cluster scale. Higher latency than CXL, but rides Ethernet you already run — no new coherence fabric or CPU generation required. |
What a memory appliance changes
Pooling memory instead of over-buying GPUs changes the shape of a buildout:
- Capacity decouples from compute. Add memory without adding GPUs; stop paying for FLOPS you only bought to get gigabytes.
- Utilization rises. Memory that would sit stranded on one server becomes available to whichever job needs it — the fleet-economics case in stranded DRAM at fleet scale.
- Long context and high concurrency get somewhere to put the KV cache other than "another GPU" — the case in KV cache too large for VRAM.
The concrete instance of this pattern is a disaggregated-memory appliance: a rack-scale box of high-capacity DDR5 that shares one pool to multiple servers over RDMA/RoCEv2 Ethernet. The TORmem M1000 is exactly that — powered by AMD EPYC and high-capacity DDR5, serving a shared memory pool to many servers over RDMA over RoCEv2 so remote memory behaves close to local, letting AI and in-memory workloads expand memory capacity and utilization without over-provisioning DRAM per server. It rides a low-latency Ethernet fabric — the same class of network built from parts like the TORswitch and pluggable optics.
If you are sizing against a memory ceiling rather than a compute one, tell us the workload, the context and concurrency targets, and the fabric you run — we can help plan a memory-centric configuration and source the appliance to match. Browse the hardware overview for what is available.
Frequently asked questions
Is the memory wall about capacity or bandwidth?
Both — they are separate limits. Capacity (how many GB of HBM) decides whether the model and its KV cache fit at all; bandwidth (TB/s) decides how fast tokens come out once they fit. Large-model inference commonly hits both, capacity first because it is a hard pass/fail.
Why is LLM inference memory-bound and not compute-bound?
Because token-by-token decode re-reads the model's weights from memory to produce each single token — a fixed byte cost with almost no reuse, giving an arithmetic intensity near 1. The GPU finishes the math and waits on memory, so throughput is set by memory bandwidth, not FLOPS.
Why do teams buy more GPUs than they need for compute?
Because a model and its working memory must fit in HBM or the job will not run, and HBM cannot be expanded after purchase. Adding capacity means adding whole GPUs — so the count is driven by memory footprint, and the extra compute those GPUs bring often sits idle on decode-heavy traffic.
Is CXL memory pooling production-ready?
For single-server memory expansion, largely yes (CXL 2.0). For multi-host pooling across servers, not yet at fleet scale — the switches, fabric, OS support and policy layer are still maturing and key switch silicon is only sampling. RDMA/RoCEv2 disaggregation over standard Ethernet is the approach you can deploy across servers today.
What is a disaggregated-memory appliance?
A rack-scale box of high-capacity DRAM (DDR5) that shares one memory pool to multiple servers over a fast network fabric — RDMA over RoCEv2 Ethernet in the case of the TORmem M1000 — so servers borrow memory from the pool instead of each over-provisioning its own.
Related
Why is my KV cache too large for VRAM?
The KV cache is the per-request attention state a transformer keeps so it does not recompute the whole prompt for every new token. It grows linearly with context length and linearly with the number of concurrent requests, and it lives in the same HBM as the model weights. At short context it is a rounding error; at long context and real concurrency it becomes the dominant consumer and is usually what triggers the out-of-memory error. Quantization and offload stretch the budget, but past a point the cache needs somewhere real to land — CPU DRAM, or a disaggregated memory pool the whole cluster can share.
Read →What is stranded DRAM, and why is half my memory idle?
Every server is bought with enough DRAM for its worst-case moment, so on average a large fraction of that memory is idle — "stranded" on a CPU that is not using it while a neighbor a rack away is memory-starved. Hyperscale measurements put the waste around a quarter to a half of all DRAM. Because memory is one of the biggest and now fastest-rising lines in a server's cost, stranded DRAM is real capital sitting dark. The fix is the same as for the GPU memory wall: stop welding memory to individual servers and pool it, so idle capacity in one place serves demand in another.
Read →What is HBM and Why Does It Matter for AI?
HBM is high-bandwidth memory — DRAM stacked vertically and mounted next to the GPU die on the same package, giving far more bandwidth than the GDDR used on graphics cards. It matters because large-model inference is usually memory-bound, not compute-bound: capacity decides whether a model and its KV cache fit at all, and bandwidth decides how fast tokens come out. For most buyers, "how many GPUs do I need" is really "how much HBM do I need, and how fast".
Read →How to Size a GPU Cluster
Size a cluster in one direction: workload first, then memory footprint, then GPU count, then node count, then the fabric, and only then power, cooling and floor space. The step most people miss is the last one — nameplate GPU TDP is not facility load. Host platforms, networking, storage and cooling overhead typically push the number at the meter to roughly two-and-a-half to three times the sum of the GPU TDPs. That is why AI buildouts turn into power procurement projects.
Read →Last updated