Portable Programming Models for Heterogeneous Platforms