Adagio: Making DVS Practical for Complex HPC Applications