Automated techniques for energy efficient scheduling on homogeneous and heterogeneous chip multi-processor architectures