Self-optimization of MPI Applications Within an Autonomic Framework