Shared Virtual Memory: Its Design and Performance Implications for Diverse Applications
<|reference_start|>Shared Virtual Memory: Its Design and Performance Implications for Diverse Applications: Discrete GPU accelerators, while providing massive computing power for supercomputers and data centers, have their separate memory domain. Explicit memory management across device and host domains in programming is tedious and error-prone. To improve programming portability and productivity, Unified Memory (UM) integrates GPU memory into the host virtual memory systems, and provides transparent data migration between them and GPU memory oversubscription. Nevertheless, current UM technologies cause significant performance loss for applications. With AMD GPUs increasingly being integrated into the world's leading supercomputers, it is necessary to understand their Shared Virtual Memory (SVM) and mitigate the performance impacts. In this work, we delve into the SVM design, examine its interactions with applications' data accesses at fine granularity, and quantitatively analyze its performance effects on various applications and identify the performance bottlenecks. Our research reveals that SVM employs an aggressive prefetching strategy for demand paging. This prefetching is efficient when GPU memory is not oversubscribed. However, in tandem with the eviction policy, it causes excessive thrashing and performance degradation for certain applications under oversubscription. We discuss SVM-aware algorithms and SVM design changes to mitigate the performance impacts. To the best of our knowledge, this work is the first in-depth and comprehensive study for SVM technologies.<|reference_end|>
@article{cooper2024shared,
    title={Shared Virtual Memory: Its Design and Performance Implications for
  Diverse Applications},
    author={Bennett Cooper, Thomas R. W. Scogland, Rong Ge},
    journal={arXiv preprint arXiv:2405.06811},
    year={2024},
    doi={10.1145/3650200.3656608},
    archivePrefix={arXiv},
    eprint={2405.06811},
    primaryClass={cs.DC}
}