| <!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). 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> |