Thread Progress Equalization: Dynamically Adaptive Power and Performance Optimization of Multi-threaded Applications