Parallel Programming Approaches to Optimize Performance and Energy Consumption on Heterogeneous Computing Systems