The aim of this project is to provide automatic methods for performance optimization and for ressource consuming minimization of programs. Given the ever evolving variety and complexity of hardware, it is unreasonable to expect programmers to exploit it effectively by hand. Instead, compilers must automate optimizations to exploit hardware effectively.
Nowadays, various hardware specific constraints have to be considered. In the area of scientific computing, programs have to be as fast as possible while in the area of embedded systems, they have to be small electricity and memory consumers, and have to adapt to a continuously changing environment.
We use different approaches depending on the kind of considered programs :
static analysis and optimization, i.e., analysis and transformation of the source codes : here we focus mainly on iterative program structures (nested loops), accessing array elements from affine reference functions. The considered loops are characterized by affine loop bounds expressed on the loop indices and on some parameters. This model allows to address many matrix computation algorithms in scientific computing, as well as multimedia applications for embedded systems like encoding/decoding and numerical filters. The symbolic characteristics of our techniques allow to construct adaptive optimizing program transformations for different memory architectures and problem sizes.
dynamic analysis : we mainly focus on data memory accesses of programs through pointers, since memory takes a main part in performance and ressource consuming and since pointer analysis is difficult and even impossible to handle statically in compilers. We model program memory access behavior from the analysis of traces generated from instrumented code. The built models allows to understand the program behavior and to guide efficient optimization as data prefetching or data layout transformation.
dynamic optimization : we develop software models in which analysis and optimization are entirely done during the program run. An initial learning phase is used to build the model which is then accessed for behavior predictions (next accessed memory address, branch prediction, ...).