Approximate Computing is based on the idea that significant improvements in performance, energy and memory consumptions can be achieved when small levels of approximation can be tolerated. Indeed, domains such as Machine Learning, Search Engines, Computer Vision and Digital Signal Processing are approximate in nature and has been shown to benefit from these ideas.
The first part of this thesis proposes the following two contributions to the field of Approximate Computing:
•Approximate Loop Unrolling: a compiler optimization that exploits the approximative nature of signal and time series data to decrease execution times and energy consumption of loops processing it. This optimization preserves accuracy better than the state-of-the-art loop optimization, increasing performance to similar levels.
• Primer: the first ever lossy compression algorithm for assembler instructions, which profits from programs’ forgiving zones to obtain a compression ratio that outperforms the current state-of-the-art up to a 10%.
Approximate Computing has two frequently opposing goals: (i) to improve on resource consumption at the expenses of accuracy and (ii) do so while maintaining programs’ Quality of Service (QoS). In order to ensure the effectiveness of a given approximate technique, a great deal of effort must be put to measure both opposites sides of the string: performance and correctness.
The second part of the thesis proposes the following tools to deal with the problem of measuring performance and Quality of Service:
• AutoJMH : a tool to automatically create performance microbenchmarks in Java. Microbenchmarks provide the finest grain performance assessment. Yet, requiring a great deal of expertise, they remain a craft of a few performance engineers. Our tool lowers the bar for adoption, automating the task to a fair extent, matching the quality of payloads handwritten by performance experts and outperforming those written by professional Java developers without experience in microbenchmarking.
• DSpot: a tool that amplifies a set of unit tests to discover computational diversity. The tool proves to be effective at exploring the reliability of approximate programs beyond the initial specifications of their respective test suites.