Taming Heterogeneity in HPC