  Reducing energy consumption is one of the key challenges in computing
technology. One factor that contributes to high energy consumption is that all
parts of the program are considered equally significant for the accuracy of the
end-result. However, in many cases, parts of computations can be performed in
an approximate way, or even dropped, without affecting the quality of the final
output to a significant degree.
  In this paper, we introduce a task-based programming model and runtime system
that exploit this observation to trade off the quality of program outputs for
increased energy-efficiency. This is done in a structured and flexible way,
allowing for easy exploitation of different execution points in the
quality/energy space, without code modifications and without adversely
affecting application performance. The programmer specifies the significance of
tasks, and optionally provides approximations for them. Moreover, she provides
hints to the runtime on the percentage of tasks that should be executed
accurately in order to reach the target quality of results. The runtime system
can apply a number of different policies to decide whether it will execute each
individual less-significant task in its accurate form, or in its approximate
version. Policies differ in terms of their runtime overhead but also the degree
to which they manage to execute tasks according to the programmer's
specification.
  The results from experiments performed on top of an Intel-based
multicore/multiprocessor platform show that, depending on the runtime policy
used, our system can achieve an energy reduction of up to 83% compared with a
fully accurate execution and up to 35% compared with an approximate version
employing loop perforation. At the same time, our approach always results in
graceful quality degradation.
