Characterizing Optimizations to Memory Access Patterns using Architecture-Independent Program Features