Related Work
PACO introduced modifications to the hardware architecture to build an approximate processor, as well as extentions to the compiler to support approximate instructions. This section shows other work done in both fields related to our project.
Approximate Hardware
Several modifications were done to the adder and the multiplier units on the circuit level showing substantial advantages in improving delay, area and energy consumption. A comparison between different examples can be found here. The mentioned examples however, lack the possibility of scaling the error to different levels. The error introduced by the modified designs depends mainly on the value of the their inputs.
The use of Lookup Tables (LUT) to approximate arithmetic functions, a concept directly related to our work, has been around for a long time. An example of using a lookup table (LUT) approach for function evaluation can be found here.
Stochastic search algorithms, in particular evolutionary algorithms, have also shown to produce promising results in obtaining approximate circuits. This paper, for example, uses genetic programming-based improvement of non-functional properties of programs intended for low-cost microcontrollers.
These concepts nevertheless, are not used so far to design fully working approximate processors. In similar projects, we provide a short description about Approximate processors built based on the concepts of clock gating, voltage scaling and neural networks.
Automatic Logic Generation
In addition to manual design techniques, design automation like automatic logic synthesis can be used to generate approximate circuits. ABACUS introduces transformations on the Abstract Syntax Tree (AST) of the Hardware Description Language (HDL). Substitute-and-Simplify proposes the substitution of signals with similar output such that the hardware generating one of the signals can be removed. SALSA generates Approximate Don’t Cares into the input such that traditional synthesis tools can exploit these Approximate Don’t Cares to optimize the circuit using techniques of software synthesis originally not intended for approximate computing.
Programming Languages and Compiler Support
Several efforts have been put into designing programming languages and coding styles for approximate computing. EnerJ uses type qualifiers to declare data that may be subject to approximate computation. Loop perforation provides a general technique to trade accuracy for performance by transforming loops to execute a subset of their iterations, an example of using this technique for better energy performance is found here. A task-based programming model and runtime system that exploit the observation that not all parts of a program are equally significant for the accuracy of the end-result is introduced here.
In PACO we have not used any of the formerly discussed concepts rather added our own extensions to CLANG and LLVM. Check our developer guide for more details.