The power consumption of CPUs and memory systems has traditionally been constrained by the need for strict correctness guarantees: processor voltage, for instance, must allow enough slack as to prevent even the rarest timing errors. However, recent work has shown that many modern applications do not require perfect correctness. An image renderer, for example, can tolerate occasional pixel errors without compromising overall quality of service. However, it is infeasible to completely abandon correctness guarantees—to do so would make development of reliable software difficult or impossible. EnerJ is an extension to Java that exposes hardware faults in a safe, principled manner. Simulation of selectively reliable hardware suggests that EnerJ programs can save large amounts of energy with only slight sacrifices to quality of service.
EnerJ: Approximate Data Types for Safe and General Low-Power Computation. Adrian Sampson, Werner Dietl, Emily Fortuna, Danushen Gnanapragasam, Luis Ceze, and Dan Grossman. PLDI 2011.
Architecture Support for Disciplined Approximate Programming. Hadi Esmaeilzadeh, Adrian Sampson, Luis Ceze, and Doug Burger. ASPLOS 2012.
Neural Acceleration for General-Purpose Approximate Programs. Hadi Esmaeilzadeh, Adrian Sampson, Luis Ceze, and Doug Burger. MICRO 2012.
Correction: The above-linked version of the PLDI paper includes a correction over the originally published version. A bug in the program that computed the energy savings for each run overemphasized the savings from SRAM structures and undercounted the contribution of instructions. The corrected energy savings range from 7% to 38%.
To use the system, follow the instructions in the source repository's README.
A technical report accompanies the PLDI paper. It contains the full formalization of EnerJ and proves the non-interference property stated in the paper.
The annotated source code for the applications used in the evaluation of EnerJ is also available. (Each benchmark's source code belongs to the respective copyright holder; the code is redistributed under the terms of each open-source license.) To compile and run these benchmarks, you need the EnerJ checker and simulation infrastructure (above).
Data Analysis Scripts
A set of Python scripts are available to analyze the JSON statistics output of the EnerJ simulator. The scripts will probably work with Python 2.6 or later.
readstats.py just summarizes the output statistics found in a JSON file.
collect.py is a monolithic script that compiles and executes benchmarks, evaluates error levels, and summarizes execution statistics.