forked from OSchip/llvm-project
144 lines
6.1 KiB
HTML
144 lines
6.1 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
|
"http://www.w3.org/TR/html4/strict.dtd">
|
|
<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
|
|
<html>
|
|
<head>
|
|
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
<title>Polly - Load Polly into clang</title>
|
|
<link type="text/css" rel="stylesheet" href="menu.css">
|
|
<link type="text/css" rel="stylesheet" href="content.css">
|
|
</head>
|
|
<body>
|
|
<div id="box">
|
|
<!--#include virtual="menu.html.incl"-->
|
|
<div id="content">
|
|
<!--=====================================================================-->
|
|
<h1>Load Polly into clang and automatically run it at -O3</h1>
|
|
<!--=====================================================================-->
|
|
|
|
<p><b>Warning:</b> Even though this example makes it very easy to use Polly,
|
|
you should be aware that Polly is a young research project. It is expected
|
|
to crash, produce invalid code or to hang in complex calculations even for
|
|
simple examples. In case you see such a problem, please check the <a
|
|
href="bugs.html">Bug database</a> and consider reporting a bug.
|
|
<p>
|
|
<b>Warning II:</b> clang/LLVM/Polly need to be in sync. This means
|
|
you need to compile them yourself from a recent svn/git checkout</b>
|
|
<h2>Load Polly into clang</h2>
|
|
|
|
By default Polly is configured as a shared library plugin that is loaded in
|
|
tools like clang, opt, and bugpoint when they start their execution.
|
|
|
|
By loading Polly into clang (or opt) the Polly options become automatically
|
|
available. You can load Polly either by adding the relevant commands to
|
|
the CPPFLAGS or by creating an alias.
|
|
|
|
<pre class="code">
|
|
$ export CPPFLAGS="-Xclang -load -Xclang ${POLLY_BUILD_DIR}/lib/LLVMPolly.so"
|
|
</pre>
|
|
|
|
or
|
|
<pre class="code">
|
|
$ alias pollycc clang -Xclang -load -Xclang ${POLLY_BUILD_DIR}/lib/LLVMPolly.so
|
|
</pre>
|
|
|
|
To avoid having to load Polly in the tools, Polly can optionally be configured
|
|
with cmake to be statically linked in the tools:
|
|
|
|
<pre class="code">
|
|
$ cmake -D LINK_POLLY_INTO_TOOLS:Bool=ON
|
|
</pre>
|
|
|
|
<h2>Optimizing with Polly</h2>
|
|
|
|
Optimizing with Polly is as easy as adding <b>-O3 -mllvm -polly</b> to your
|
|
compiler flags (Polly is only available at -O3).
|
|
|
|
<pre class="code">pollycc -O3 -mllvm -polly file.c</pre>
|
|
|
|
<h2>Automatic OpenMP code generation</h2>
|
|
|
|
To automatically detect parallel loops and generate OpenMP code for them you
|
|
also need to add <b>-mllvm -enable-polly-openmp -lgomp</b> to your CFLAGS.
|
|
|
|
<pre class="code">pollycc -O3 -mllvm -polly -mllvm -enable-polly-openmp -lgomp file.c</pre>
|
|
|
|
<h2>Automatic Vector code generation</h2>
|
|
|
|
Automatic vector code generation can be enabled by adding <b>-mllvm
|
|
-polly-vectorizer=polly</b> to your CFLAGS.
|
|
|
|
<pre class="code">pollycc -O3 -mllvm -polly -mllvm -polly-vectorizer=polly file.c</pre>
|
|
|
|
<h2>Extract a preoptimized LLVM-IR file</h2>
|
|
|
|
Often it is useful to derive from a C-file the LLVM-IR code that is actually
|
|
optimized by Polly. Normally the LLVM-IR is automatically generated from
|
|
the C code by first lowering C to LLVM-IR (clang) and by subsequently applying a
|
|
set of preparing transformations on the LLVM-IR. To get the LLVM-IR after the
|
|
preparing transformations have been applied run Polly with '-O0'.
|
|
|
|
<pre class="code">pollycc -O0 -mllvm -polly -S -emit-llvm file.c</pre>
|
|
|
|
<h2>Further options</h2>
|
|
|
|
Polly supports further options that are mainly useful for the development or
|
|
the
|
|
analysis of Polly. The relevant options can be added to clang by appending
|
|
<b>-mllvm -option-name</b> to the CFLAGS or the clang
|
|
command line.
|
|
|
|
<h3>Limit Polly to a single function</h3>
|
|
To limit the execution of Polly to a single function, use the option
|
|
<b>-polly-detect-only=functionname</b>.
|
|
|
|
<h3>Disable LLVM-IR generation</h3>
|
|
Polly normally regenerates LLVM-IR from the Polyhedral representation. To only
|
|
see the effects of the preparing transformation, but to disable Polly code
|
|
generation add the option <b>polly-no-codegen</b>.
|
|
|
|
<h3>Graphical view of the SCoPs</h3>
|
|
|
|
Polly can use graphviz to show the SCoPs it detects in a program. The relevant
|
|
options are <b>-polly-show</b>, <b>-polly-show-only</b>, <b>-polly-dot</b> and
|
|
<b>-polly-dot-only</b>. The 'show' options automatically run dotty or another
|
|
graphviz viewer to show the scops graphically. The 'dot' options store for each
|
|
function a dot file that highlights the detected SCoPs. If 'only' is appended at
|
|
the end of the option, the basic blocks are shown without the statements the
|
|
contain.
|
|
|
|
<h3>Change/Disable the Optimizer</h3>
|
|
Polly uses by default the isl scheduling optimizer. The isl optimizer optimizes
|
|
for data-locality and parallelism using the <a
|
|
href="http://pluto-compiler.sf.net">Pluto</a> algorithm. For research it is also
|
|
possible to run <a
|
|
href="http://www-rocq.inria.fr/~pouchet/software/pocc/">PoCC</a> as external
|
|
optimizer. PoCC provides access to the original Pluto implementation. To use
|
|
PoCC add <b>-polly-optimizer=pocc</b> to the command line (only available if
|
|
Polly was compiled with scoplib support) [removed after <a href="http://llvm.org/releases/download.html#3.4.2">LLVM 3.4.2</a>].
|
|
To disable the optimizer entirely use the option <b>-polly-optimizer=none</b>.
|
|
|
|
<h3>Disable tiling in the optimizer</h3>
|
|
By default both optimizers perform tiling, if possible. In case this is not
|
|
wanted the option <b>-polly-no-tiling</b> can be used to disable it. (This
|
|
option disables tiling for both optimizers).
|
|
|
|
<h3>Ignore possible aliasing</h3>
|
|
By default we only detect scops, if we can prove that the different array bases
|
|
can not alias. This is correct do if we optimize automatically. However,
|
|
without special user annotations like 'restrict' we can often not prove that
|
|
no aliasing is possible. In case the user knows no aliasing can happen in the
|
|
code the <b>-polly-ignore-aliasing</b> can be used to disable the check for
|
|
possible aliasing.
|
|
|
|
<h3>Import / Export</h3>
|
|
The flags <b>-polly-import</b> and <b>-polly-export</b> allow the export and
|
|
reimport of the polyhedral representation. By exporting, modifying and
|
|
reimporting the polyhedral representation externally calculated transformations
|
|
can be applied. This enables external optimizers or the manual optimization of
|
|
specific SCoPs.
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|