Content area
Simulations are crucial in science, enabling the modeling of complex phenomena that are difficult to study experimentally. As they scale, they demand greater performance and efficiency. To meet this need, computing has shifted toward heterogeneous architectures that combine CPUs and GPUs. While effective, this shift introduces software engineering challenges, making abstraction an increasingly important tool for improving programmability. Abstractions hide low-level implementation details behind clean interfaces, improving clarity and reducing complexity.
This thesis reviews existing abstractions for heterogeneous architectures, analyzing their integration effort, performance trade-offs, and limitations. It uses the insights from that review to present the design and implementation of DeviceVector, a lightweight abstraction that unifies host and device memory management in Graphitti, a high-performance graph-based simulation platform. DeviceVector enhances programmability by reducing code duplication, introducing a clear CPU–GPU data relationship, and abstracting CUDA boilerplate through an interface that closely mirrors a standard C++ container. It also discusses design approaches for extending support in the future to object hierarchies and general function-level abstractions, further minimizing logic duplication between host and device code. Overall, this work highlights how thoughtful abstraction design can bridge the usability-performance gap in heterogeneous computing systems.