An adaptive clock scheme exploiting instruction-based dynamic timing slack for a GPGPU architecture