Portable, predictable and partitionable: a domain specific approach to heterogeneous computing