Optimization techniques for parallel applications on clusters