4.4.6 Adaptive cache management
Chen et al. coordinate warp throttling with
4.4.7 Cache prioritization: tokens
Li et al. spotted the blind spot of throttling à la CCWS: tuning warp count for L1 hit rate leaves off-chip bandwidth and L2 idle. Their split: W warps may execute, but only T ≤ W hold tokens allowing L1 allocation — the rest run as “non-polluting warps”:
step 0Observation: warp throttling (like CCWS) protects the L1 by running FEWER warps — but that leaves off-chip bandwidth and the L2 underused. Tokens split the two decisions: W warps run, only T ≤ W may fill the L1.
4.4.8–4.4.9 Placement: pages and data structures
Two placement problems, two altitudes:
- Virtual-memory page placement (Agarwal et al.): future systems mix
bandwidth-optimized and capacity-optimized DRAM, but stock OS
policies ignore bandwidth non-uniformity. With capacity to spare,
allocate pages randomly in proportion to bandwidth — near-optimal for
bandwidth-bound kernels (uniform-access assumption). When BW-memory fills
up, frequency matters: a profiling pass (modified
nvcc/ptxas) plus CUDA placement hints recovers ≈90% of an oracle. Page migration: future work. - PORPLE (Chen et al.): which memory space (global? shared? constant?
texture?) for each array — a decision that’s hard for programmers and
non-portable across GPU generations. Three pieces: a memory
specification language describing each GPU’s spaces by their
serialization conditions (bank conflicts vs. coalescing rules); the
PORPLE-C source-to-source compiler emitting placement-agnostic code
with guards; and a lightweight runtime placer (estimated transactions
- reuse-distance cache model, linear cache partitioning across arrays) — with a brief CPU-side trace run when static analysis can’t see the access pattern.
4.4.10 Multi-chip-module GPUs
With Moore’s Law slowing, Arunkumar et al. scale the package instead of
the die: the
Three techniques tame the scarce inter-module links — local caching of remote data, locality-aware CTA scheduling (adjacent CTAs touch adjacent data → keep them on one module), and first-touch page allocation (pages land where first used). Result: within 10% of an equally-sized-but-unbuildable monolithic GPU, and 45% faster than the largest monolithic GPU actually constructible in the same process.
| Protection distance | L1 policy | Lines immune for N accesses; no victim → bypass |
| Token prioritization | L1 allocation | W execute, T allocate; non-polluting warps use idle bandwidth |
| BW-proportional pages | OS/driver | Allocate pages ∝ memory bandwidth; profile hints when capacity binds |
| PORPLE | Compiler + runtime | Spec language + guarded code + model-driven placer |
| MCM-GPU | Package architecture | GPU modules + remote caching + locality CTA scheduling + first-touch |
That’s the memory system. Chapter 5 closes the book with research that cuts across cores and memory.
Check yourself
1. How does protection-distance bypassing decide when to skip the cache?
2. Predict the eviction (use the token animation): warp 2 (no token) misses in a set full of token-holders' lines. What happens?
3. In a system with bandwidth-optimized AND capacity-optimized DRAM, what page-placement policy did Agarwal et al. find near-optimal (when capacity permits)?
4. What are PORPLE's three ingredients for portable data placement?
5. MCM-GPU reaches within 10% of an unbuildable monolithic GPU using which three techniques?