****************************************************************
GCC-ICI v1.0 (Interactive Compilation Interface)
June 15, 2008
http://gcc-ici.sourceforge.net
Maintained by UNIDAPT Group
http://unidapt.org
****************************************************************
Developers:
Grigori Fursin, INRIA Saclay, France
http://fursin.net/research
Mircea Namolaru, IBM Haifa, Israel
Cupertino Miranda, INRIA Saclay, France
cupertino.miranda@inria.fr
****************************************************************
Brief Information:
The main aim of the Interactive Compilation Interface (ICI)
is to transform GCC (production quality non-research compiler
that supports many languages and architectures) into research
compiler with minimal changes.
It can be used to enable research on iterative fine-grain program
optimizations for different constraints (performance, code size,
power consumption, DSE, different ISAs, etc),
to unify optimization knowledge reuse among different programs
and architectures using statistical and machine learning techniques,
and to improve default compiler optimization heuristic.
We hope that it will eventually make compilers truly modular
with automatically tuned rapidly evolving optimization heuristics.
In a new version we re-designed the ICI completely based on the
valuable feedback from the users after the SMART'07 workshop and
GCC HiPEAC'07 tutorial (many thanks to Cupertino Miranda
who implemented most of it). The communication with the new ICI
is now performed through a dynamically linked GCC plugin written
in C (however any high-level or scripting language can be used
with a wrapper). Current implementation includes the ability
to reorder or add GCC passes dynamically on a function level.
We currently work to implement all remaining functions
of the specified interface, add passes to extract program
features and split analysis and optimization code to enable
access to compiler transformations at a fine-grain level.
****************************************************************
Directories:
docs - GCC-ICI documentation
|
+-- papers - Our related papers
+-- posters - Our related posters
+-- ici-headers
|
+-- ic-interface.h - ICI specification
+-- ic-controller.h - ICI controller header file
examples - Sample benchmarks to demonstrate ICI and plugins
(currently dynamic pass manipulation and optimization)
src - GCC and PLUGINS sources
|
+-- gcc - GCC source directory (not included)
| Current work version is 4.3.0 20070711
| (experimental)
+-- gmp-4.2.1 - Third-party package for GCC
+-- gmp-4.2.2 - Third-party package for GCC
+-- mpfr-2.3.1 - Third-party package for GCC
+-- ici-plugins - Directory with plugins
|
+-- save_executed_passes
+-- save_pass_order
+-- use_pass_order
...
tools - Auxilary tools
install - Directory with installed binaries
****************************************************************
Usage:
First, get GCC sources and place them to the src/gcc directory
http://gcc.gnu.org
Patch the GCC code with GCC-ICI using
patch--apply
Compile third-party tools, GCC source and Dynamic Controller using
build-all
All the binaries and libraries will be installed in the following directories
install/bin #GCC BINS
install/lib #GCC LIBS
install/gcc-ici-plugins #PLUGINS
...
Set environment variables:
export GCC-ICI-HOME = [GCC-ICI home directory (full path)]
export PATH = $GCC-ICI-HOME/install/bin:$PATH
export LD_LIBRARY_PATH = $GCC-ICI-HOME/install/lib:$LD_LIBRARY_PATH
To compile programs using GCC-ICI and Dynamic Controller
with plugin to save current pass order, use:
export ICI_PLUGIN=$GCC-ICI-HOME/install/gcc-ici-plugins/save-executed-passes.so
gcc -fici <files to compile>
or
export ICI_USE=1
gcc <files to compile>
Auxilary environment variables:
ICI_VERBOSE != NULL - turn on diagnostic messages
****************************************************************
History:
1.0 - 20080615 - New version with bug fixes for MILEPOST GCC. ICI Plugins are separated
from this distribution since they can be independent of GCC.
Machine learning routines will be included in the MILEPOST GCC release.
More info is available at http://unidapt.org/software.html#milepostgcc
0.9.6 - 20080312 - Updated version for the MILEPOST GCC
(was not officially released).
0.9.5 - 20080211 - Updated design for correct pass selection and reordering
avoiding pass-gate ... + some bug fixes.
0.9.1 - 20070916 - Bug fix release.
0.9 - 20070915 - New design using dynamically linked plugins
and pass manipulations routines.
0.1 - 20070126 - Prototyping
0.0.1 - 20061103 - First prototype based on PathScale/Open64 ICI
developed by Grigori Fursin in 2004.
****************************************************************
Motivation:
Current compilers fail to deliver satisfactory levels of performance on
modern processors, due to rapidly evolving hardware, fixed and black-box
optimization heuristics, simplistic hardware models, inability to fine-tune
the application of transformations, and highly dynamic behavior of the
system. This analysis suggests to revisit the structure and interactions of
optimizing compilers. Building on the empirical knowledge accumulated from
previous iterative optimization prototypes, we propose to open the compiler,
exposing its control and decision mechanisms to external optimization
heuristics. We suggest a simple, practical, and non-intrusive way to modify
current compilers, allowing an external tool to access and modify all
compiler optimization decisions.
To avoid the pitfall of revealing all the compiler intermediate
representation and libraries to a point where it would rigidify the whole
internals and stiffen further evolution, we choose to control the decision
process itself, granting access to the only high-level features needed to
effectively take a decision. This restriction is compatible with our
fine-tuning and fine-grained interaction, and allows to tune programs for
best performance, code size, power consumption; we also believe it allows
for joint architecture-compiler design-space exploration.By exposing only
the decisions that arise from the opportunities suggested by the program
syntax and semantics and only when the associated legality checks are
satisfied, we dramatically reduce the transformation search space.
We are developing an Interactive Compilation Interface (ICI) with different
external optimization drivers for GCC to enable optimization of large
applications (rather than just kernels) through the iterative, fine-grain
customization of compilation strategies at the loop or instruction-level.We
expect that iterative interactive compilers will replace the current
multiplicity of non-portable, rigid transformation frameworks with
unnecessary duplications of compiler internals. Furthermore, unifying the
interface with compiler passes simplifies future compiler developments,
where the best optimization strategy is learned automatically and
continuously for a given platform, objective function, program or
application domain, using statistical or machine learning techniques. It
enables life-long, whole-program compilation research, without the overhead
of breaking-up the compiler into a set of well-defined compilation
components (communicating through persistent intermediate languages), even
if such an evolution could be desirable at some point (but much more
intrusive). It also opens optimization heuristics to a wide area of
iterative search, decision and adaptation schemes and allows optimization
knowledge reuse among different programs and architectures for collective
optimizations.
****************************************************************
Acknowledgments:
Francois Bodin, IRISA, France
Albert Cohen, INRIA Futurs, France
Hugh Lather, University of Edinburgh, UK
Mircea Namolaru, IBM, Israel
Michael O'Boyle, University of Edinburgh, UK
Sebastian Pop, AMD, USA
Olivier Temam, INRIA Futurs, France
HiPEAC network of excellence (http://www.hipeac.net)
Milepost project (http://www.milepost.eu)
SARC project (http://www.sarc-ip.org)
GGCC (http://www.ggcc.info)
Other colleagues from IBM, NXP, STMicro, ARC, CAPS Enterprise ...
****************************************************************
Future work:
We need to decide on how to enumerate specific loops (in the loop nests)
and specific statements - could be in lexicographical order or using numbering
similar to ones used at INRIA for polyhedral transformation framework.
Then we need to finish GCC-ICI implementation based on the available specification.
Further, we plan to do research on automatically generating dependencies
between passes, learning best order of optimization passes, improving
our component model for passes to enable dynamic linking of external
optimization plugins and eventually making compiler fully modular with
automatically tuned rapidly evolving compiler optimization heuristic.
The ICI for g++ is currently failing - we have to solve this problem
and will appreciate any help.
****************************************************************