Scientific Programming for Heterogeneous Systems - Bridging the Gap between Algorithms and Applications