Hi,
it has been quiet around Graphite for a while and I think it is more
than time to give an update on Graphite.
== The Status of Graphite ==
Graphite has been around for a while in GCC. During this time a lot of
people tested Graphite and Sebastian fixed many bugs. As of today the
Graphite infrastructure is pretty stable and hosts already specific
optimizations such as loop-interchange, blocking and loop-flattening.
However, during the development of Graphite we also found areas where
we are still way behind our possibilities.
First of all we realized that the use of a rational polyhedral library,
even though it provides some functionality for integer polyhedra, is
blocking us. Rational rational polyhedra worked OK for some time, but we
have now come to a point where the absence of real integer polyhedra is
causing problems. We have bugs that cannot be solved, just because
rational polyhedra do not represent correctly the set of integer points
in the loop iterations.
Another deficit in Graphite is the absence of a generic optimizer. Even
though classical loop transformations work well for certain problems,
one of the major selling points of polyhedral techniques is the
possibility to go beyond classical loop transformations and to forget
about the corresponding pass ordering issues. Instead it is possible to
define a generic cost function for which to optimize. We currently do
not take advantage of this possibility and therefore miss possible
performance gains.
And as a last point, Graphite still does not apply to as much code as it
could. We cannot transform a lot of code, not only because of the
missing support for casts (for which we need integer polyhedra), but
also because of an ad hoc SCoP detection and because some passes in the
GCC pass order complicate Graphite's job. Moving these road blocks out
of the way should increase the amount of code we can optimize significantly.
== The pipeline of upcoming graphite changes ==
As just pointed out there is still a lot of work to be done. We have
been aware of this and we actually have several ongoing projects to get
this work done.
0. Moving to recent version of CLooG.
Graphite was relying for a long time on CLooG-PPL, a CLooG version
Sebastian forked and ported to PPL, because of copyright issues at that
time. The fork was never officially maintained by cloog.org, but always
by Sebastian himself. This was a significant maintenance burden and
meant that we where cut of from improvements in the official CLooG
library. With Andreas Simbuerger we had 2011 a summer of code student,
that added support to use the official cloog.org. The cloog.org version
proved to be very stable, but we could not yet switch entirely over,
as this version uses isl as polyhedral library, which would introduce
another library dependence to GCC (ppl, CLooG and now isl). One solution
to get this patch in and to not increase the number of library
dependences is to follow CLooG and to replace PPL with isl. As this was
desirable for several other reasons Sebastian went ahead:
1. The integer set library
Back in September Sebastian started the work to move Graphite to an
actual integer set library. We have chosen isl [1], which is nowadays
probably the most advanced open source integer set library*. The patch
set as posted in September was incomplete and in parts incorrect. I
finished the patch set. With the new patch set the core graphite
transformations work entirely with isl. The only exceptions are the
interchange cost function, the openscop export/import and the
loop-flattening pass. Due to the native support for integer maps and
especially due to how we can combine sets and maps with isl, the isl
implementation of graphite functions is often a lot simpler and easier
to understand. But, more importantly, it finally allows us to gather
modulo wrapping and undefined overflow characteristics and solves
several other issues we had due to the use of rational polyhedra.
2. A real polyhedral optimizer
To get a real, generic polyhedral optimizer for Graphite we have chosen
the Pluto algorithm. The original implementation of Pluto is available
here [2], the relevant publications are [3] and [4]. Pluto is an
polyhedral optimizer that uses a single cost function to optimize
simultaneously for data locality, parallelism and tileability. It has
shown good results on various kernels [5] (or see the papers) and Uday,
the original author was employed to reimplement it in IBM XL. We added
an implementation of this algorithm to isl. My recent patch set enables
Graphite to use this new optimizer. Even though the patch is an early
draft and definitely needs tuning to match the results of the original
implementation, it is a great starting point for a real polyhedral
optimizer in Graphite.
3. A new SCoP detection
Valdimir Kargov has implemented a new, structured SCoP detection within
his 2010 Google Summer of Code project. The structured SCoP detection
allows us to remove several limitations on the kind of SCoPs we can
detect. The work was done during his summer of code project and his
patches are already part of the Graphite branch and pass all the
internal tests. For the moment we did not commit them to mainline, as we
did not want to risk new bugs before the next gcc release. We plan to
commit these patches as soon as stage one is open again.
The existing patches are:
* Patches for point 0/1/2
There is a git repository that branches from trunk and has patches for
the points 0, 1 and 2.
https://github.com/tobig/gcc
* The new scop detection
This code is already committed into the graphite branch. Currently
Vladimir is evaluating intensively the stability of his code.
== Who will do all the work? ==
After reading all the open projects you may wander who will do all the
work? Unfortunately Sebastian switched jobs at the end of 2011, such
that we lost one full time contributor. Furthermore, I am myself also
not full time working on Graphite, but work on my PhD where I am founded
to work on the LLVM Polly project. This means developer resources are
currently rare.
To solve this issue, I believe the best approach is to share as much
infrastructure as possible between different projects. After the above
patches have been integrated, graphite does not only have a very neat
polyhedral infrastructure, but also can optimizations be applied at a
nice, abstract level. This means for optimization we can (mostly) rely
on high level polyhedral transformations. This is part of my PhD and I
expect to contribute here significantly. Furthermore, I expect that we
can directly take advantage of polyhedral optimizations developed
outside of GCC e.g. in source to source tools. Overall, I am pretty
confident in terms of developer resources on the polyhedral side.
For the less polyhedral, more GCC internals related part of this work
the situation is different. Here significantly more GCC knowledge is
required and many high-level people will not be able to contribute. I
will definitely be around and will review patches. However, to ensure
fast resolution of bug reports we definitely need further help from
within the GCC community. Additional support is highly welcome. In case
someone is interested in a full time position working on GCC/Graphite,
please get in touch with me. We have funding for a full-time developer
position in Paris and we would love to use this money to support further
Graphite/GCC development.
That's all so far. I would be very glad to hear your opinion on this and
am especially interested in people expressing their doubts and pointing
out possible problems with these ideas.
Thanks a lot
Tobi
[1] http://repo.or.cz/w/isl.git
[2] http://pluto-compiler.sourceforge.net/
[3] http://www.csa.iisc.ernet.in/~uday/publications/uday-cc08.pdf
[4] http://www.csa.iisc.ernet.in/~uday/publications/uday-pldi08.pdf
[5] http://pluto-compiler.sourceforge.net/intel.png
[6] http://polly.grosser.es
* Sven, the developer of isl, is affiliated with me. I have and am still
working intensively with him. So this opinion is definitely biased.
Please point me to any better alternatives, if you are aware of them.