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%.
The type checker and simulation framework used in the evaluation of EnerJ are available for download. The system is very much a work in progress and is available under the terms of Matt Might's CRAPL.
To use the system, first download and install the Checker Framework, which adds JSR 308 type annotations to Java. Be sure to get version 1.3.1. Set the
JSR308 environment variable to point to the directory containing the CF's
checkers directory; the EnerJ build files will look for this variable.
Then download these source archives:
(You can also clone the source as Mercurial repositories from BitBucket. Look for the "enerj" and "checker-runtime" repositories on my page.)
Expand both packages into a common directory. First, build the checker-runtime library against the Checker Framework by typing
ant in its directory. Then build EnerJ the same way. The
enerj tools can be used to compile and run EnerJ programs in place of
Please let us know if you have trouble getting these tools running. More polished releases, including a more reusable checker-framework library, are forthcoming.
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.