Feedback Driven Restructuring of Multi-Threaded Applications for NUCA Cache Performance in CMPs