Programming High-Performance Clusters With Heterogeneous Computing Devices