Runtime Adaptation For Autonomic Heterogeneous Computing