  Last-Level Cache (LLC) represents the bulk of a modern CPU processor's
transistor budget and is essential for application performance as LLC enables
fast access to data in contrast to much slower main memory. However,
applications with large working set size often exhibit streaming and/or
thrashing access patterns at LLC. As a result, a large fraction of the LLC
capacity is occupied by dead blocks that will not be referenced again, leading
to inefficient utilization of the LLC capacity. To improve cache efficiency,
the state-of-the-art cache management techniques employ prediction mechanisms
that learn from the past access patterns with an aim to accurately identify as
many dead blocks as possible. Once identified, dead blocks are evicted from LLC
to make space for potentially high reuse cache blocks.
  In this thesis, we identify variability in the reuse behavior of cache blocks
as the key limiting factor in maximizing cache efficiency for state-of-the-art
predictive techniques. Variability in reuse prediction is inevitable due to
numerous factors that are outside the control of LLC. The sources of
variability include control-flow variation, speculative execution and
contention from cores sharing the cache, among others. Variability in reuse
prediction challenges existing techniques in reliably identifying the end of a
block's useful lifetime, thus causing lower prediction accuracy, coverage, or
both. To address this challenge, this thesis aims to design robust cache
management mechanisms and policies for LLC in the face of variability in reuse
prediction to minimize cache misses, while keeping the cost and complexity of
the hardware implementation low. To that end, we propose two cache management
techniques, one domain-agnostic and one domain-specialized, to improve cache
efficiency by addressing variability in reuse prediction.
