Self-Configuring Applications for Heterogeneous Systems : Automating Programming Decisions Using Cognitive Techniques