Enhancing Programmability, Portability, and Performance with Rich Cross-Layer Abstractions