Mitigating the Memory Bottleneck with Machine Learning-Driven and Data-Aware Microarchitectural Techniques
Abstract
Modern applications process massive data volumes that overwhelm the storage and retrieval capabilities of memory systems, making memory the primary performance and energy-efficiency bottleneck of computing systems. Although many microarchitectural techniques attempt to hide or tolerate long memory access latency, rapidly growing data footprints continue to outpace technology scaling, requiring more effective solutions. This dissertation shows that modern processors observe large amounts of application and system data during execution, yet many microarchitectural mechanisms make decisions largely independent of this information. Through four case studies, we demonstrate that such data-agnostic design leads to substantial missed opportunities for improving performance and energy efficiency. To address this limitation, this dissertation advocates shifting microarchitecture design from data-agnostic to data-informed. We propose mechanisms that (1) learn policies from observed execution behavior (data-driven design) and (2) exploit semantic characteristics of application data (data-aware design). We apply lightweight machine learning techniques and previously underexplored data characteristics across four processor components: a reinforcement learning-based hardware data prefetcher that learns memory access patterns online; a perceptron predictor that identifies memory requests likely to access off-chip memory; a reinforcement learning mechanism that coordinates data prefetching and off-chip prediction; and a mechanism that exploits repeatability in memory addresses and loaded values to eliminate predictable load instructions. Our extensive evaluation shows that the proposed techniques significantly improve performance and energy efficiency compared to prior state-of-the-art approaches.
Figures & tables
| Workload type | # traces | |
| Single-core | AI/ML applications (AIML) | 81 |
| Graph Mining Suite (GMS) | 43 | |
| Google datacenter workloads (Google) | 359 | |
| Total | 483 | |
| Feature | Control-flow | Data-flow | ||
|---|---|---|---|---|
| Info. | History | Info. | History | |
| Last 3-PCs | PC | last 3 | ✖ | ✖ |
| Last 4-deltas | ✖ | ✖ | Cacheline delta | last 4 |
| PC+Delta | PC | current | Cacheline delta | current |
| Last 4-PCs+Page no. | PC | last 4 | Page no. | current |
| Features | PC+Delta , Sequence of last-4 deltas |
| Prefetch Action List | {-6,-3,-1,0,1,3,4,5,10,11,12,16,22,23,30,32} |
| Reward Level Values | = , = , = , = , = , = , = |
| Hyperparameters | , , |
| Control-flow Components | Data-flow Components |
| 1. PC of load request 2. PC-path (XOR-ed last-3 PCs) 3. PC XOR-ed branch-PC 4. None | 1. Load cacheline address 2. Page number 3. Page offset 4. Load address delta 5. Sequence of last-4 offsets 6. Sequence of last-4 deltas 7. Offset XOR-ed with delta 8. None |
| Structure | Description | Size |
|---|---|---|
| QVStore | • # vaults = • # planes/vault = • # entries/plane = feature dimension ( ) action dimension ( ) • Entry size = Q-value width ( b) | 24 KB |
| EQ | • # entries = 256 • Entry size = state ( b) + action index ( b) + reward ( b) + filled-bit ( b) + address ( b) | 1.5 KB |
| Total | 25.5 KB |
| Core | 1-12 cores, 4-wide OoO, 256-entry ROB, 72/56-entry LQ/SQ, Perceptron-based branch predictor [ 411 ] , 20-cycle misprediction penalty |
|---|---|
| L1/L2 Caches | Private, 32KB/256KB, 64B line, 8 way, LRU, 16/32 MSHRs, 4-cycle/14-cycle round-trip latency |
| LLC | 2MB/core, 64B line, 16 way, SHiP [ 876 ] , 64 MSHRs per LLC Bank, 34-cycle round-trip latency |
| Main Memory | 1C: Single channel, 1 rank/channel; 4C: Dual channel, 2 ranks/channel; 8C: Quad channel, 2 ranks/channel; 8 banks/rank, 2400 MTPS, 64b data-bus per channel, 2KB row buffer/bank, tRCD = tRP = 15ns, tCAS = 12.5ns |
| Suite | # Workloads | # Traces | Example Workloads |
|---|---|---|---|
| SPEC06 | 16 | 28 | gcc, mcf, cactusADM, lbm, … |
| SPEC17 | 12 | 18 | gcc, mcf, pop2, fotonik3d, … |
| PARSEC | 5 | 11 | canneal, facesim, raytrace, … |
| Ligra | 13 | 40 | BFS, PageRank, Bellman-ford, … |
| Cloudsuite | 4 | 53 | cassandra, cloud9, nutch, … |
| SPP [ 465 ] | 256-entry ST, 512-entry 4-way PT, 8-entry GHR | 6.2 KB |
| Bingo [ 120 ] | 2KB region, 64/128/4K-entry FT/AT/PHT | 46 KB |
| MLOP [ 761 ] | 128-entry AMT, 500-update, 16-degree | 8 KB |
| DSPatch [ 141 ] | Same configuration as in [ 141 ] | 3.6 KB |
| PPF [ 148 ] | Same configuration as in [ 148 ] | 39.3 KB |
| Pythia’s area : mm2/core; Pythia’s power : mW/core | ||
|---|---|---|
| Overhead compared to real systems | Area | Power |
| 4-core Skylake D-2123IT, 60W TDP [ 27 ] | 1.03% | 0.37% |
| 18-core Skylake 6150, 165W TDP [ 28 ] | 1.24% | 0.60% |
| 28-core Skylake 8180M, 205W TDP [ 30 ] | 1.33% | 0.75% |
| Features without control-flow information | Features with control-flow information |
| 1. Load virtual address 2. Virtual page number 3. Cacheline offset in page 4. First access 5. Cacheline offset + first access 6. Byte offset in cacheline 7. Word offset in cacheline | 8. Load PC 9. PC load virtual address 10. PC virtual page number 11. PC cacheline offset 12. PC + first access 13. PC byte offset 14. PC word offset 15. Last- load PCs 16. Last- PCs |
| Selected features | • PC cacheline offset • PC byte offset • PC + first access • Cacheline offset + first access • Last- load PCs |
| Threshold values | , , |
| Structure | Description | Size |
| POPET | • Perceptron weight tables – PC cacheline offset: – PC byte offset: – PC + first access: – Cacheline offset + first access: – Last- load PCs: • Page buffer: | 3.2 KB |
| LQ Metadata | Hashed PC: ; Last-4 PC: ; First access: ; perceptron weight: ; prediction: | 0.8 KB |
| Total | 4.0 KB | |
| Core | 1 and 8 cores, 6-wide fetch/execute/commit, 512-entry ROB, 128/72-entry LQ/SQ, Perceptron branch predictor [ 411 ] with 17-cycle misprediction penalty |
|---|---|
| L1/L2 Caches | Private, 48KB/1.25MB, 64B line, 12/20-way, 16/48 MSHRs, LRU, 5/15-cycle round-trip latency [ 60 ] |
| LLC | 3MB/core, 64B line, 12 way, 64 MSHRs/slice, SHiP [ 876 ] , 55-cycle round-trip latency [ 56 , 60 ] , Pythia prefetcher [ 136 ] |
| Main Memory | 1C: 1 channel, 1 rank per channel; 8C: 4 channels, 2 ranks per channel; 8 banks per rank, DDR4-3200 MTPS, 64b data-bus per channel, 2KB row buffer per bank, tRCD=12.5ns, tRP=12.5ns, tCAS=12.5ns |
| Hermes | Hermes-O/P : / -cycle Hermes request issue latency |
| Suite | # Workloads | # Traces | Example Workloads |
|---|---|---|---|
| SPEC06 | 14 | 22 | gcc, mcf, cactusADM, lbm, … |
| SPEC17 | 11 | 23 | gcc, mcf, pop2, fotonik3d, … |
| PARSEC | 4 | 12 | canneal, facesim, raytrace, … |
| Ligra | 11 | 20 | BFS, PageRank, Radii, … |
| CVP | 33 | 33 | integer, floating-point, server, … |
| HMP [ 905 ] with local, gshare, and gskew predictors | 11 KB |
| TTP with a metadata budget similar to the L2 cache | 1536 KB |
| Pythia [ 136 ] with the same configuration in [ 136 ] | 25.5 KB |
| Bingo [ 120 ] with the same configuration in [ 120 ] | 46 KB |
| SPP [ 465 ] with perceptron-based prefetch filter [ 148 ] | 39.3 KB |
| MLOP [ 761 ] with the same configuration in [ 761 ] | 8 KB |
| Feature | Measurement | Rationale |
|---|---|---|
| Prefetcher accuracy | Effectiveness of prefetching | |
| OCP accuracy | Effectiveness of OCP | |
| Bandwidth usage | Memory bus pressure | |
| Cache pollution | Interference caused by prefetches | |
| Reward Component | Constituent Metric | Weight |
|---|---|---|
| # Cycles | ||
| # LLC misses | ||
| LLC miss latency | ||
| # Load instructions | ||
| Category | Final Values |
|---|---|
| Selected Features | (1) prefetcher accuracy, (2) OCP accuracy, (3) bandwidth usage, (4) prefetch-induced cache pollution |
| Reward Weights | , , , , |
| Hyperparameters | , , , , Epoch length ( ) = instructions |
| Structure | Description | Size |
| QVStore | # planes = , # rows = | 2 KB |
| # columns = , entry size = bits | ||
| Accuracy Tracker | -bit Bloom filter, hashes | 0.5 KB |
| Pollution Tracker | -bit Bloom filter, hashes | 0.5 KB |
| Core | 6-wide fetch/issue/commit, 512-entry ROB, 128-entry LQ, 72-entry SQ, perceptron branch predictor [ 411 ] , 17-cycle misprediction penalty |
|---|---|
| L1I/D | Private, 48KB, 64B line, 12-way, 16 MSHRs, LRU, 4/5-cycle round-trip latency |
| L2C | Private, 1.25MB, 64B line, 20-way, 48 MSHRs, LRU, 15-cycle round-trip latency [ 60 ] |
| LLC | Shared, 3MB/core, 64B line, 12-way, 64 MSHRs/slice, SHiP [ 876 ] , 55-cycle round-trip latency [ 56 , 60 ] |
| Main Memory | 1 rank per channel, 8 banks per rank, 64-bit data bus, 2KB row buffer, = = = 12.5ns; DDR4 with 3.2 GB/s per core |
| Suite | # Workloads | Example Workloads |
|---|---|---|
| SPEC CPU06 | 29 | astar, leslie3d, libquantum, milc, omnetpp, sphinx3, soplex … |
| SPEC CPU17 | 20 | bwaves, cactuBSSN, fotonik3d, gcc, lbm, mcf, xalancbmk … |
| Ligra | 13 | BC, BFS, BFSCC, PageRankDelta, Radii, … |
| PARSEC | 13 | canneal, facesim, fluidanimate, raytrace, streamcluster … |
| CVP | 25 | integer, floating point, … |
| Cache Design | Description | Comparison Points |
|---|---|---|
| CD1 | OCP + 1 L2C prefetcher | HPAC, MAB |
| CD2 | OCP + 1 L1D prefetcher | HPAC, MAB, TLP |
| CD3 | OCP + 2 L2C prefetchers | HPAC, MAB |
| CD4 | OCP + 1 L1D + 1 L2C prefetcher | HPAC, MAB, TLP |
| Prefetchers | L1D | IPCP [ 628 ] , as an L1D-only prefetcher | 0.7 KB |
| Berti , as configured in [ 604 ] | 2.55 KB | ||
| L2C | Pythia , as configured in [ 136 ] | 25.5 KB | |
| SPP+PPF , as configured in [ 465 , 148 ] | 39.3 KB | ||
| MLOP , as configured in [ 761 ] | 8 KB | ||
| SMS , as configured in [ 792 ] | 20 KB | ||
| OCPs | POPET [ 133 ] , with 5 features | 4 KB | |
| Structure | Description | Size |
| SLD | • # entries: ( sets ways) • Entry size: tag ( ) + addr ( ) + val ( ) + confidence level ( ) + can_eliminate flag ( ) | 7.9 KB |
| RMT | • load PCs for each stack registers (RSP and RBP) • load PCs for each remaining architectural registers in x86-64 | 0.4 KB |
| AMT | • # entries: 256 ( sets ways) • Entry size: physical address tag ( ) + # hashed load PCs ( ) | 4.0 KB |
| Basic | x86-64 core clocked at 3.2 GHz with 2-way SMT support |
|---|---|
| Fetch & Decode | 8-wide fetch, TAGE/ITTAGE branch predictors [ 757 ] , 20-cycle misprediction penalty, 32KB 8-way L1-I cache, 4K-entry 8-way micro-op cache, 6-wide decode, 144-entry IDQ, loop-stream detector [ 150 ] |
| Rename | 6-wide, 288 integer, 220 512-bit and 320 256-bit physical registers, Memory Renaming [ 844 ] , zero elimination [ 300 ] , move elimination [ 300 , 278 ] , constant folding [ 300 , 278 ] , branch folding [ 251 ] |
| Allocate | 512-entry ROB, 240-entry LB, 112-entry SB, 248-entry RS |
| Issue & Retire | 6-wide issue to 12 execution ports; 5, 3, 2, and 2 ports for ALU, load, store-address, and store-data execution. Port 0, 1, and 5 are used for vector instructions. Aggressive out-of-order load scheduling with memory dependence prediction [ 220 , 569 ] , 6-wide retire |
| Caches | L1-D : 48KB, 12-way, 5-cycle latency, LRU, PC-based stride prefetcher [ 302 ] ; L2 : 2MB, 16-way, 12-cycle round-trip latency, LRU, stride + streamer [ 201 ] + SPP [ 465 ] ; LLC : 3MB, 12-way, 50-cycle data round trip latency [ 44 , 133 ] , dead-block-aware replacement policy [ 452 ] , streamer, MESIF [ 564 ] protocol |
| Component | Port count | Read access energy (pJ) | Write access energy (pJ) | Leakage power (mW) | Area (mm2) |
|---|---|---|---|---|---|
| SLD | R/ W | ||||
| RMT | R/ W | ||||
| AMT | R/ W | ||||
| Suite | #Workloads | #Traces | Example Workloads |
| Client | 16 | 22 | DaCapo [ 12 ] , SYSmark [ 58 ] , TabletMark [ 59 ] , JetStream2 [ 34 ] |
| Enterprise | 9 | 14 | SPECjEnterprise [ 55 ] , SPECjbb [ 54 ] , LAMMPS [ 36 ] |
| FSPEC17 | 13 | 29 | All from SPECrate FP 2017 [ 53 ] |
| ISPEC17 | 10 | 11 | All from SPECrate Integer 2017 [ 53 ] |
| Mechanism | Overhead |
| EVES [ 754 ] with the same configuration as the winner of CVP-1 KB storage budget track [ 15 ] | 32 KB |
| ELAR [ 131 ] with an additional adder in decode stage and a new copy of the ESP register | Adder + 64-b register |
| RFP [ 770 ] with 2K-entry prefetch table, 64-entry page address table, and 128-entry RFP-Inflight table | 12.4 KB |
| Constable (this work) | 15.4 KB |