blob: 1ac2b5c40907dfb94f06686f844d69982279724c [file] [log] [blame]
<!--#include virtual="../../header.incl" -->
<div class="www_sectiontitle">2016 European LLVM Developers' Meeting</div>
<h2><b>SPONSORED BY:
<br />
<br />
&nbsp; &nbsp; &nbsp;
<a href="http://www.arm.com">ARM</a>,
<a href="http://www.hsafoundation.com">HSA Foundation</a>,
<a href="http://www.google.com">Google</a>,
<a href="http://www.intel.com">Intel</a>,
<a href="http://www.codeplay.com/">Codeplay</a>,
<a href="http://www.microsoft.com/en-us/">Microsoft</a>,
<a href="http://research.microsoft.com/en-us/">Microsoft Research</a>
<br />
</b>
</h2>
<p>The hacker's lab &amp; networking session is sponsored by
<a href="http://www.solidsands.nl/"><b>Solid Sands</b></a>
</p>
<table>
<tr><td valign="top">
<ol>
<li><a href="#about">About</a></li>
<li><a href="#schedule">Schedule</a></li>
<li><a href="#SlidesAndVideos">Slides &amp; Videos</a></li>
<li><a href="#PresentationsAbstracts">Presentations abstracts</a></li>
<li><a href="#TutorialsAbstracts">Tutorials abstracts</a></li>
<li><a href="#LightningTalksAbstracts">Lightning talks abstracts</a></li>
<li><a href="#PostersAbstracts">Posters abstracts</a></li>
<li><a href="#BoFsAbstracts">BoFs abstracts</a></li>
</ol>
</td><td>
<ul>
<li><b>What</b>: The sixth European LLVM meeting</li>
<li><b>When</b>: March 17-18, 2016</li>
<li><b>Where</b>: <a href="http://www.princesasofia.com/en">Hotel Princesa Sofia</a>, Barcelona, Spain</li>
</ul>
</td></tr></table>
<div class="www_sectiontitle" id="about">About</div>
<p>
The LLVM Foundation announces the sixth annual European LLVM Developers' Meeting
will be held March 17th and 18th in Barcelona, Spain.
</p>
<p>
This year, the conference will be collocated with <a href="http://cgo.org/cgo2016/">CGO</a>
and <a href="http://cc2016.eew.technion.ac.il/">CC</a>, enabling collaboration and
exchange of ideas with the research community.
</p>
<p>
The conference will be 2 full days that include technical talks, BoFs, hacker’s lab,
tutorials, and a poster session.
</p>
<p>
The meeting serves as a forum for <a href="http://llvm.org">LLVM</a>,
<a href="http://clang.llvm.org">Clang</a>, <a href="http://lldb.llvm.org">LLDB</a> and
other LLVM project developers and users to get acquainted, learn how LLVM is used, and
exchange ideas about LLVM and its (potential) applications. More broadly, we
believe the event will be of particular interest to the following people:
</p>
<ul>
<li>Active developers of projects in the LLVM Umbrella
(LLVM core, Clang, LLDB, libc++, compiler_rt, klee, dragonegg, lld, etc).</li>
<li>Anyone interested in using these as part of another project.</li>
<li>Compiler, programming language, and runtime enthusiasts.</li>
<li>Those interested in using compiler and toolchain technology in novel
and interesting ways.</li>
</ul>
<p>
Please sign up for the
<a href="http://lists.llvm.org/mailman/listinfo/llvm-devmeeting">LLVM Developers' Meeting list</a>
for future announcements and to ask questions.
</p>
<p>
You may also contact the organizer: <a href="mailto:vladimir.subotic@bsc.es">Vladimir Subotic</a>
</p>
<!--
<div class="www_sectiontitle" id="CFP">Call for Paper</div>
<p>
We invite academic, industrial and hobbyist speakers to present their work on
developing or using LLVM, Clang, etc. Proposals for technical presentations,
posters, workshops, demonstrations and BoFs are welcome. Material will be chosen
to cover a broad spectrum of themes and topics at various depths, some technical
deep-diving, some more community focused.
</p>
<p>
We are looking for:
</p>
<ul>
<li>Keynote speakers.</li>
<li>Technical presentations (30 minutes plus questions and discussion) related to the
development of LLVM, Clang, LLD, LLDB, Polly, ...</li>
<li>Presentations relating to academic or commercial use of LLVM, Clang etc.</li>
<li>Lightning talks (5 minutes, no questions, no discussion).</li>
<li>Workshops and in-depth tutorials (1-2 hours - please specify in your submission).</li>
<li>Poster presentations.</li>
<li>Birds of a Feather sessions (BoFs).</li>
</ul>
<p>
The deadline for receiving submissions is <del>January 25, 2016</del> <ins>January 29, 2016</ins>.
</p>
<p>
Submissions should be done using the <a href="https://easychair.org/conferences/?conf=eurollvm2016"> Easychair</a> platform.
</p>
<p>
Please note that presentation materials and videos for the technical sessions
will be posted on llvm.org after the conference. We have reserved additional
spots for speakers, such that they can attend the conference even though we
have reached our registration limit.
</p>
<p>
In terms of submission style, we are looking for:
</p>
<ul>
<li>A title and an extended abstract,</li>
</ul>
<p>
OR
</p>
<ul>
<li>A title, abstract and slides.</li>
</ul>
<p>
Please make clear the status of the slides (are they a skeleton of your
presentation with the detail missing ?), or, perhaps a section of detail that
lacks introduction and conclusions? Also make sure to give enough information
in the extended abstract: the more you can give us and tell us the easier it
will be for us to be positive about your submission.
</p>
<p>
Proposals that are not sufficiently detailed (talks lacking a comprehensive
abstract for example) are likely to be rejected. Slides and posters must be
in PDF format.
</p>
<p>
The call for paper is over since January 29, 2016.
</p>
<p>
The program committee is now working hard at reviewing all submissions.
</p>
<p>
The program committee attempts to reflects the diversity of our community.
It consists of David Chisnall, Sanjoy Das, Tobias Edler von Koch,
Arnaud de Grandmaison, Hal Finkel, Renato Golin, Tobias Grosser,
Tanya Lattner, David Majnemer, James Molloy, Adam Nemet.
</p>
<p>
Speakers will be notified of acceptance or rejection by February 15th, 2016.
</p>
-->
<div class="www_sectiontitle" id="schedule">Schedule</div>
<p>
The schedule may be found here: <a href="https://2016europeanllvmdevelopersmeetin.sched.org">https://2016europeanllvmdevelopersmeetin.sched.org</a>
</p>
<div class="www_sectiontitle" id="SlidesAndVideos">Slides &amp; Videos</div>
<table id="devmtg">
<tr><th>Media</th><th>Talk / Presenter(s)</th></tr>
<tr><td>
<a href="Presentations/Clang-LibCPlusPlus-CPlusPlusStandard.pdf"><b>Slides</b></a></br>
<a href="https://youtu.be/zQ9tT8fbtSo"><b>Video</b></a>
</td><td>
<b><a href="#presentation1">Clang, libc++ and the C++ standard</a></b><br>
<i>Marshall Clow - Qualcomm</i><br>
<i>Richard Smith - Google</i>
</td></tr>
<tr><td>
<a href="Presentations/CodeletExtractorAndREplayer.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/7sVnjJlZTW4"><b>Video</b></a>
</td><td>
<b><a href="#presentation2">Codelet Extractor and REplayer</a></b><br>
<i>Chadi Akel - Exascale Computing Research</i>
</td></tr>
<tr><td>
<a href="Presentations/EuroLLVM 2016- New LLD linker for ELF.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/CYCRqjVa6l4"><b>Video</b></a>
</td><td>
<b><a href="#presentation3">New LLD linker for ELF</a></b><br>
<i>Rui Ueyama - Google</i>
</td></tr>
<tr><td>
<a href="Presentations/X86CodeSizePDF.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/yHexQSFud3w"><b>Video</b></a>
</td><td>
<b><a href="#presentation4">Improving LLVM Generated Code Size for X86 Processors</a></b><br>
<i>David Kreitzer - Intel</i><br>
<i>Zia Ansari - Intel</i>
</td></tr>
<tr><td>
<a href="Presentations/Beyls2016_AmelioratingMeasurmentBias.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/COmfRpnujF8"><b>Video</b></a>
</td><td>
<b><a href="#presentation5">Towards ameliorating measurement bias in evaluating performance of generated code</a></b><br>
<i>Kristof Beyls - ARM</i>
</td></tr>
<tr><td>
<a href="Presentations/AnastasiaStulova_OpenCL20_EuroLLVM2016.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/3yzL2loPtgM"><b>Video</b></a>
</td><td>
<b><a href="#presentation6">A journey of OpenCL 2.0 development in Clang</a></b><br>
<i>Anastasia Stulova - ARM</i>
</td></tr>
<tr><td>
<a href="Presentations/BOLT_EuroLLVM_2016.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/gw3iDO3By5Y"><b>Video</b></a>
</td><td>
<b><a href="#presentation7">Building a binary optimizer with LLVM</a></b><br>
<i>Maksim Panchenko - Facebook</i>
</td></tr>
<tr><td>
<a href="Presentations/SVF_EUROLLVM2016.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/nD-i-enA8rc"><b>Video</b></a>
</td><td>
<b><a href="#presentation8">SVF: Static Value-Flow Analysis in LLVM</a></b><br>
<i>Yulei Sui - University of New South Wales</i>
</td></tr>
<tr><td>
<a href="Presentations/EuroLLVM_ChrisDiamand.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/duoA1eWwE0E"><b>Video</b></a>
</td><td>
<b><a href="#presentation9">Run-time type checking with clang, using libcrunch</a></b><br>
<i>Chris Diamand - University of Cambridge</i>
</td></tr>
<tr><td>
<a href="Presentations/Molly.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/fKW3yjhcrh0"><b>Video</b></a>
</td><td>
<b><a href="#presentation10">Molly: Parallelizing for Distributed Memory using LLVM</a></b><br>
<i>Michael Kruse - INRIA/ENS</i>
</td></tr>
<tr><td>
<a href="Presentations/polly-gpu-eurollvm.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/MOX4TxRIijg"><b>Video</b></a>
</td><td>
<b><a href="#presentation11">How Polyhedral Modeling enables compilation to Heterogeneous Hardware</a></b><br>
<i>Tobias Grosser - ETH</i>
</td></tr>
<tr><td>
<a href="Presentations/EuroLLVM2016-E.Crawford_and_L.Drummond-Bringing_RenderScript_to_LLDB.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/BBC61L0QKCM"><b>Video</b></a>
</td><td>
<b><a href="#presentation12">Bringing RenderScript to LLDB</a></b><br>
<i>Luke Drummond - Codeplay</i><br>
<i>Ewan Crawford - Codeplay</i>
</td></tr>
<tr><td>
<a href="Presentations/Offload-EuroLLVM2016.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/YKX6EMEib4g"><b>Video</b></a>
</td><td>
<b><a href="#presentation13">C++ on Accelerators: Supporting Single-Source SYCL and HSA Programming Models Using Clang</a></b><br>
<i>Victor Lomuller - Codeplay</i>
</td></tr>
<tr><td>
<a href="Presentations/eurollvm-2016-arm-code-size.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/cFgwEEBw7U0"><b>Video</b></a>
</td><td>
<b><a href="#presentation14">A closer look at ARM code size</a></b><br>
<i>Tilmann Scheller - Samsung Electronics</i>
</td></tr>
<tr><td>
<a href="Presentations/Barcelona2016report.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/2YSzLyBO4yM"><b>Video</b></a>
</td><td>
<b><a href="#presentation15">Scalarization across threads</a></b><br>
<i>Alexander Timofeev - Luxoft</i>
</td></tr>
<tr><td>
<a href="Tutorials/LLDB-tutorial.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/9hhDZeV0fYU"><b>Video</b></a>
</td><td>
<b><a href="#tuto1">LLDB Tutorial: Adding debugger support for your target</a></b><br>
<i>Deepak Panickal - Codeplay</i><br>
<i>Andrzej Warzynski - Codeplay</i>
</td></tr>
<tr><td>
<a href="Tutorials/applied-polyhedral-compilation.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/mXve_W4XU2g"><b>Video</b></a>
</td><td>
<b><a href="#tuto2">Analyzing and Optimizing your Loops with Polly</a></b><br>
<i>Tobias Grosser - ETH</i><br>
<i>Johannes Doerfert - Saarland University</i>
</td></tr>
<tr><td>
<a href="Tutorials/Tutorial.pdf"><b>Slides</b></a><br>
<a href="https://youtu.be/Z5KcwVaak3s"><b>Video</b></a>
</td><td>
<b><a href="#tuto3">Building, Testing and Debugging a Simple out-of-tree LLVM Pass</a></b><br>
<i>Serge Guelton - Quarkslab</i><br>
<i>Adrien Guinet - Quarkslab</i>
</td></tr>
<tr><td>
<a href="https://youtu.be/TkanbGAG_Fo"><b>Video</b></a>
</td><td>
<b><a href="#LightningTalksAbstracts">Lightning talks</a></b>
</td></tr>
</table>
<div class="www_sectiontitle" id="PresentationsAbstracts">Presentations abstracts</div>
<p>
<b><a id="presentation1">Clang, libc++ and the C++ standard</a></b><br>
<i>Marshall Clow - Qualcomm</i><br>
<i>Richard Smith - Google</i><br>
<a href="Presentations/Clang-LibCPlusPlus-CPlusPlusStandard.pdf"><b>Slides</b></a>
<a href="https://youtu.be/zQ9tT8fbtSo"><b>Video</b></a><br>
The C++ standard is evolving at a fairly rapid pace. After almost 15 years of
little change (1998-2010), we've had major changes in 2011, 2014, and soon
(probably) 2017. There are many parallel efforts to add new functionality to
the language and the standard library.
</p><p>
In this talk, we will discuss upcoming changes to the language and the standard
library, how they will affect existing code, and their implementation status in
LLVM.
</p>
<p>
<b><a id="presentation2">Codelet Extractor and REplayer</a></b><br>
<i>Chadi Akel - Exascale Computing Research</i><br>
<i>Pablo De Oliveira Castro - University of Versailles</i><br>
<i>Michel Popov - University of Versailles</i><br>
<i>Eric Petit - University of Versailles</i><br>
<i>William Jalby - University of Versailles</i><br>
<a href="Presentations/CodeletExtractorAndREplayer.pdf"><b>Slides</b></a>
<a href="https://youtu.be/7sVnjJlZTW4"><b>Video</b></a><br>
Codelet Extractor and REplayer (CERE) is an LLVM-based framework that finds and
extracts hotspots from an application as isolated fragments of code. Codelets
can be modified, compiled, run, and measured independently from the original
application. Through performance signature clustering, CERE extracts a minimal
but representative codelet set from applications, which can significantly
reduce the cost of benchmarking and iterative optimization. Codelets have
proved successful in auto-tuning target architecture, compiler optimization or
amount of parallelism. To do so, CERE goes trough multiple llvm passes. It
first outlines at IR level the loop to capture into a function using
CodeExtractor pass. Then, depending on the mode, CERE inserts the necessary
instructions to either capture or replay the loop. Probes can also be inserted
at IR level around loops to enable instrumentation through externals libraries.
Finally CERE also provides a python interface to easily use the tool.
</p>
<p>
<b><a id="presentation3">New LLD linker for ELF</a></b><br>
<i>Rui Ueyama - Google</i><br>
<a href="Presentations/EuroLLVM 2016- New LLD linker for ELF.pdf"><b>Slides</b></a>
<a href="https://youtu.be/CYCRqjVa6l4"><b>Video</b></a><br>
Since last year, we have been working to rewrite the ELF support in LLD, the
LLVM linker, to create a high-performance linker that works as a drop-in
replacement for the GNU linker. It is now able to bootstrap LLVM, Clang, and
itself and pass all tests on x86-64 Linux and FreeBSD. The new ELF linker is
small and fast; it is currently fewer than 10k lines of code and about 2x
faster than GNU gold linker.
</p><p>
In order to achieve this performance, we made a few important decisions in the
design. This talk will present the design and the performance of the new ELF LLD.
</p>
<p>
<b><a id="presentation4">Improving LLVM Generated Code Size for X86 Processors</a></b>
<i>David Kreitzer - Intel</i><br>
<i>Zia Ansari - Intel</i><br>
<i>Andrey Turetskiy - Intel</i><br>
<i>Anton Nadolsky - Intel</i><br>
<a href="Presentations/X86CodeSizePDF.pdf"><b>Slides</b></a>
<a href="https://youtu.be/yHexQSFud3w"><b>Video</b></a><br>
Minimizing the size of compiler generated code often takes a back seat to other
optimization objectives such as maximizing the runtime performance. For some
applications, however, code size is of paramount importance, and this is an
area where LLVM has lagged gcc when targeting x86 processors. Code size is of
particular concern in the microcontroller segment where programs are often
constrained by a relatively small and fixed amount of memory. In this
presentation, we will detail the work we did to improve the generated code size
for the SPEC CPU2000 C/C++ benchmarks by 10%, bringing clang/LLVM to within 2%
of gcc. While the quoted numbers were measured targeting Intel&reg; Quark&trade;
microcontroller D2000, most of the individual improvements apply to all X86
targets. The code size improvement was achieved via new optimizations, tuning
of existing optimizations, and fixing existing inefficiencies. We will describe
our analysis methodology, explain the impact and LLVM compiler fix for each
improvement opportunity, and describe some opportunities for future code size
improvements with an eye toward pushing LLVM ahead of gcc on code size.
</p>
<p>
<b><a id="presentation5">Towards ameliorating measurement bias in evaluating performance of generated code</a></b><br>
<i>Kristof Beyls - ARM</i><br>
<a href="Presentations/Beyls2016_AmelioratingMeasurmentBias.pdf"><b>Slides</b></a>
<a href="https://youtu.be/COmfRpnujF8"><b>Video</b></a><br>
To make sure LLVM continues to optimize code well, we use both post-commit
performance tracking and pre-commit evaluation of new optimization patches. As
compiler writers, we wish that the performance of code generated could be
characterized by a single number, making it straightforward to decide from an
experiment whether code generation is better or worse. Unfortunately,
performance of generated code needs to be characterized as a distribution,
since effects not completely under control of the compiler, such as heap, stack
and code layout or initial state in the processors prediction tables, have a
potentially large influence on performance. For example, it's not uncommon when
benchmarking a new optimization pass that clearly makes code better, the
performance results do show some regressions. But are these regressions due to
a problem with the patch, or due to noise effects not under the control of the
compiler? Often, the noise levels in performance results are much larger than
the expected improvement a patch will make. How can we properly conclude what
the true effect of a patch is when the noise is larger than the signal we're
looking for?
</p><p>
When we see an experiment that shows a regression while we know that on
theoretical grounds the generated code is better, we see a symptom of only
measuring a single sample out of the theoretical space of all
not-under-the-compiler's-control factors, e.g. code and data layout variation.
</p><p>
In this presentation I'll explain this problem in a bit more detail; I'll
summarize suggestions for solving this problem from academic literature; I'll
indicate what features in LNT we already have to try and tackle this problem;
and I'll show the results of my own experiments on randomizing code layout to
try and avoid measurement bias.
</p>
<p>
<b><a id="presentation6">A journey of OpenCL 2.0 development in Clang</a></b><br>
<i>Anastasia Stulova - ARM</i><br>
<a href="Presentations/AnastasiaStulova_OpenCL20_EuroLLVM2016.pdf"><b>Slides</b></a>
<a href="https://youtu.be/3yzL2loPtgM"><b>Video</b></a><br>
In this talk we would like to highlight some of the recent collaborative work
among several institutions (namely ARM, Intel, Tampere University of
Technology, and others) for supporting OpenCL 2.0 compilation in Clang. This
work is represented by several patches to Clang upstream that enable
compilation of the new standard. While the majority of this work is already
committed, some parts are still a work in progress that should be finished in
the upcoming months.
</p><p>
OpenCL is a C99 based language, standardized and developed by the Khronos Group
(<a href="http://www.khronos.org">www.khronos.org</a>), intended to describe
data-parallel general purpose computations. OpenCL 2.0 provides several new
features that require compiler support, i.e. generic address space, atomics,
program scope variables, pipes, and device side enqueue. In this talk we will
give a quick overview of each of these features and the compiler support that
had/has to be added. We will focus on the benefits of reusing existing C/OpenCL
compiler features as well as difficulties not foreseen with the previous
design. At the end of this session we would like to invite people to
participate in discussions on improvements and future work, and get an opinion
of what they think could be useful for them.
</p>
<p>
<b><a id="presentation7">Building a binary optimizer with LLVM</a></b><br>
<i>Maksim Panchenko - Facebook</i><br>
<a href="Presentations/BOLT_EuroLLVM_2016.pdf"><b>Slides</b></a>
<a href="https://youtu.be/gw3iDO3By5Y"><b>Video</b></a><br>
Large-scale applications in data centers are built with the highest level of
compiler optimizations and typically use a carefully tuned set of compiler
options as every single percent of performance could result in vast savings of
power and CPU time. However, code and code-layout optimizations don't stop at
compiler level, as further improvements are possible at link-time and beyond
that.
</p><p>
At Facebook we use a linker script for an optimal placement of functions in
HHVM binary to eliminate instruction-cache misses. Recently, we've developed a
binary optimization technology that allows us to further cut instruction cache
misses and branch mis-predictions resulting in even greater performance wins.
</p><p>
In this talk we would like to share technical details of how we've used LLVM's
MC infrastructure and ORC layered approach to code generation to build in a
short time a system that is being deployed to one of the world's biggest data
centers. The static binary optimization technology we've developed, uses
profile data generated in multi-threaded production environment, and is
applicable to any binary compiled from well-formed C/C++ and even assembly. At
the moment we use it on a 140MB of X86 binary code compiled from C/C++. The
input binary has to be un-stripped and does not have any special requirements
for compiler or compiler options. In our current implementation we were able
to improve I-cache misses by 7% on top of a linker script for HHVM binary.
Branch mis-predictions were improved by 5%.
</p><p>
As with many projects at Facebook, our plan is to open source our binary
optimizer.
</p>
<p>
<b><a id="presentation8">SVF: Static Value-Flow Analysis in LLVM</a></b><br>
<i>Yulei Sui - University of New South Wales</i><br>
<i>Peng Di - University of New South Wales</i><br>
<i>Ding Ye - University of New South Wales</i><br>
<i>Hua Yan - University of New South Wales</i><br>
<i>Jingling Xue - University of New South Wales</i><br>
<a href="Presentations/SVF_EUROLLVM2016.pdf"><b>Slides</b></a>
<a href="https://youtu.be/nD-i-enA8rc"><b>Video</b></a><br>
This talk presents SVF, a research tool that enables scalable and precise
interprocedural Static Value-Flow analysis for sequential and multithreaded C
programs by leveraging recent advances in sparse analysis. SVF, which is fully
implemented in LLVM (version 3.7.0) with over 50 KLOC core C++ code, allows
value-flow construction and pointer analysis to be performed in an iterative
manner, thereby providing increasingly improved precision for both. SVF accepts
points-to information generated by any pointer analysis (e.g., Andersen's
analysis) and constructs an interprocedural memory SSA form, in which the
def-use chains of both top-level and address-taken variables are captured. Such
value-flows can be subsequently exploited to support various forms of program
analysis or enable more precise pointer analysis (e.g., flow-sensitive
analysis) to be performed sparsely. SVF provides an extensible interface for
users to write their own analysis easily. SVF is publicly available at
<a href="http://unsw-corg.github.io/SVF">http://unsw-corg.github.io/SVF</a>.
</p><p>
We first describe the design and internal workings of SVF, based on a
years-long effort in developing the state-of-the-art algorithms of precise
pointer analysis, memory SSA construction and value-flow analysis for C
programs. Then, we describe the implementation details with code examples in
the form of LLVM IR. Next, we discuss some usage scenarios and our previous
experiences in using SVF in several client applications including detecting
software bugs (e.g., memory leaks, data races), and accelerating dynamic
program analyses (e.g., MSAN, TSAN). Finally, our future work and some open
discussions.
</p><p>
Note: this presentation will be shared with CC.
</p>
<p>
<b><a id="presentation9">Run-time type checking with clang, using libcrunch</a></b><br>
<i>Chris Diamand - University of Cambridge</i><br>
<i>Stephen Kell - Computer Laboratory, University of Cambridge</i><br>
<i>David Chisnall - Computer Laboratory, University of Cambridge</i><br>
<a href="Presentations/EuroLLVM_ChrisDiamand.pdf"><b>Slides</b></a>
<a href="https://youtu.be/duoA1eWwE0E"><b>Video</b></a><br>
Existing sanitizers ASan and MSan add run-time checking for memory
errors, both spatial and temporal. However, currently there is no
analogous way to check for type errors. This talk describes a system for
adding run-time type checks, largely checking pointer casts, at the
Clang AST level.
</p><p>
Run-time type checking is important for three reasons. Firstly, type
bugs such as bad pointer casts can lead to type-incorrect accesses that
are spatially valid (in bounds) and temporally valid (accessing live
memory), so are missed by MSan or ASan. Secondly, type-incorrect
accesses which do trigger memory errors often do so only many
instructions later, meaning that spatial or temporal violation warnings
fail to pinpoint the root problem, making debugging difficult. Finally,
given an awareness of type, it becomes possible to perform more precise
spatial and temporal checking -- for example, recalculating pointer
bounds after a cast, or perhaps even mark-and-sweep garbage collection.
</p><p>
Although still a research prototype, libcrunch can cope well with real C
codebases, and supports a good complement of awkward language features.
Experience shows that libcrunch reliably finds questionable pointer use,
and often uncovers minor other bugs. It also naturally detects certain
format string exploits. However, its main value is in debugging fresh,
not-yet-committed code ("why is this segfaulting?"). Beside the warnings
generated by failing checks, the runtime API is also available from the
debugger, so can interactively answer questions like "what type is this really
pointing to?".
</p>
<p>
<b><a id="presentation10">Molly: Parallelizing for Distributed Memory using LLVM</a></b><br>
<i>Michael Kruse - INRIA/ENS</i><br>
<a href="Presentations/Molly.pdf"><b>Slides</b></a>
<a href="https://youtu.be/fKW3yjhcrh0"><b>Video</b></a><br>
Motivated by modern day physics which in addition to experiments also tries to
verify and deduce laws of nature by simulating the state-of-the-art physical
models using large computers, we explore means of accelerating such simulations
by improving the simulation programs they run. The primary focus is Lattice
Quantum Chromodynamics (QCD), a branch of quantum field theory, running on IBM
newest supercomputer, the Blue Gene/Q.
</p><p>
Molly is an LLVM compiler extension, complementary to Polly, which optimizes
the distribution of data and work between the nodes of a cluster machine such
as Blue Gene/Q. Molly represents arrays using integer polyhedra and uses
another already existing compiler extension Polly which represents statements
and loops using polyhedra. When Molly knows how data is distributed among the
nodes and where statements are executed, it adds code that manages the data
flow between the nodes. Molly can also permute the order of data in memory.
</p><p>
Molly's main task is to cluster data into sets that are sent to the same target
into the same buffer because single transfers involve a massive overhead. We
present an algorithm that minimizes the number of transfers for unparametrized
loops using anti-chains of data flows. In addition, we implement a heuristic
that takes into account how the programmer wrote the code. Asynchronous
communication primitives are inserted right after the data is available
respectively just before it is used. A runtime library implements these
primitives using MPI. Molly manages to distribute any code that is
representable in the polyhedral model, but does so best for stencils codes such
as Lattice QCD. Compiled using Molly, the Lattice QCD stencil reaches 2.5% of
the theoretical peak performance. The performance gap is mostly because all the
other optimizations are missing, such as vectorization. Future versions of
Molly may also effectively handle non-stencil codes and use make use of all the
optimizations that make the manually optimized Lattice QCD stencil fast.
</p>
<p>
<b><a id="presentation11">How Polyhedral Modeling enables compilation to Heterogeneous Hardware</a></b><br>
<i>Tobias Grosser - ETH</i><br>
<a href="Presentations/polly-gpu-eurollvm.pdf"><b>Slides</b></a>
<a href="https://youtu.be/MOX4TxRIijg"><b>Video</b></a><br>
Polly, as a polyhedral loop optimizer for LLVM, is not only a sophisticated
tool for data locality optimizations, but also has precise information about
loop behavior that can be used to automatically generate accelerator code.
</p><p>
In this presentation we present a set of new Polly features that have been
introduced throughout the last two years (and as part of two GSoC projects)
that enable the use of Polly in the context of compilation for heterogeneous
systems. As part of this presentation we discuss how we use Polly to derive the
precise memory footprints of compute regions for both flat arrays as well as
multi-dimensional arrays of parametric size. We then present a new, high-level
interface that allows for the automatic remapping of memory access functions to
new locations or data-layouts and show how this functionality can be used to
target software managed caches. Finally, we present our latest results in terms
of automatic PTX/CUDA code generation using Polly as a core component.
</p>
<p>
<b><a id="presentation12">Bringing RenderScript to LLDB</a></b><br>
<i>Luke Drummond - Codeplay</i><br>
<i>Ewan Crawford - Codeplay</i><br>
<a href="Presentations/EuroLLVM2016-E.Crawford_and_L.Drummond-Bringing_RenderScript_to_LLDB.pdf"><b>Slides</b></a>
<a href="https://youtu.be/BBC61L0QKCM"><b>Video</b></a><br>
RenderScript is Android's compute framework for parallel computation via
heterogeneous acceleration. It supports multiple target architectures and uses
a two-stage compilation process, with both off-line and on-line stages, using
LLVM bitcode as its intermediate representation. This split allows code to be
written and compiled once, before execution on multiple architectures
transparently from the perspective of the programmer.
</p><p>
In this talk, we give a technical tour of our upstream RenderScript LLDB
plugin, and how it interacts with Android applications executing RenderScript
code. We provide a brief overview of RenderScript, before delving into the LLDB
specifics. We will discuss some of the challenges that we encountered in
connecting to the runtime, and present some of the specific implementation
techniques we used to hook into it and inspect its state. In addition, we will
describe how we tweaked LLDB's JIT compiler for expression evaluation, and how
we added commands specific to RenderScript data objects. This talk will cover
topics such as the plug-in architecture of LLDB, the debugger's powerful hook
mechanism, remote debugging, and generating debug information with LLVM.
</p>
<p>
<b><a id="presentation13">C++ on Accelerators: Supporting Single-Source SYCL and HSA Programming Models Using Clang</a></b><br>
<i>Victor Lomuller - Codeplay</i><br>
<i>Ralph Potter - Codeplay</i><br>
<i>Uwe Dolinsky - Codeplay</i><br>
<a href="Presentations/Offload-EuroLLVM2016.pdf"><b>Slides</b></a>
<a href="https://youtu.be/YKX6EMEib4g"><b>Video</b></a><br>
Heterogeneous systems have been massively adopted across a wide range of
devices. Multiple initiatives, such as OpenCL and HSA, have appeared to
efficiently program these types of devices.
</p><p>
Recent initiatives attempt to bring modern C++ applications to heterogeneous
devices. The Khronos Group published SYCL in mid-2015. SYCL offers a
single-source C++ programming environment built on top of OpenCL. Codeplay and
the University of Bath are currently collaborating on a C++ front-end for HSAIL
(HSA Intermediate Language) from the HSA Foundation. Both models use a similar
single-source C++ approach, in which the host and device kernel C++ code is
interleaved. A kernel always starts using specific function calls, which take a
functor object. To support the compilation of these two high-level programming
models, Codeplay's compilers rely on a common engine based on Clang and LLVM to
extract and manipulate those kernels.
</p><p>
In this presentation we will briefly present both programming models and then
focus on Codeplay's usage of Clang to manage both models.
</p>
<p>
<b><a id="presentation14">A closer look at ARM code size</a></b><br>
<i>Tilmann Scheller - Samsung Electronics</i><br>
<a href="Presentations/eurollvm-2016-arm-code-size.pdf"><b>Slides</b></a>
<a href="https://youtu.be/cFgwEEBw7U0"><b>Video</b></a><br>
The ARM LLVM backend has been around for many years and generates high quality
code which executes very efficiently. However, LLVM is also increasingly used
for resource-constrained embedded systems where code size is more of an issue.
Historically, very few code size optimizations have been implemented in LLVM.
When optimizing for code size, GCC typically outperforms LLVM significantly.
</p><p>
The goal of this talk is to get a better understanding of why the GCC-generated
code is more compact and also about finding out what we need to do on the LLVM
side to address those code size deficiencies. As a case study we will have a
detailed look at the generated code of an application running on a
resource-constrained microcontroller.
</p>
<p>
<b><a id="presentation15">Scalarization across threads</a></b><br>
<i>Alexander Timofeev - Luxoft</i><br>
<i>Boris Ivanovsky - Luxoft</i><br>
<a href="Presentations/Barcelona2016report.pdf"><b>Slides</b></a>
<a href="https://youtu.be/2YSzLyBO4yM"><b>Video</b></a><br>
Some of the modern highly parallel architectures include separate vector
arithmetic units to achieve better performance on parallel algorithms. On the
other hand, real world applications never operate on vector data only. In most
cases whole data flow is intended to be processed by vector units. In fact,
vector operations on some platforms (for instance, with massive data
parallelism) may be expensive, especially for parallel memory operations.
Sometimes instructions operating on vectors of identical values could be
transformed into corresponding scalar form.
</p><p>
The goal of this presentation is to outline a technique which allows to split
program data flow to separate vector and scalar parts so that they can be
executed on vector and scalar arithmetic units separately.
</p><p>
The analysis has been implemented in the HSA compiler as an iterative solver
over SSA form. The result of the analysis is a set of memory operations
legitimate to be transformed into a scalar form. The subsequent transformations
resulted in a small performance increase across the board, and gain up to 10%
increase in a few benchmarks, one of them being HEVC decoder.
</p>
<div class="www_sectiontitle" id="TutorialsAbstracts">Tutorials abstracts</div>
<p>
<b><a id="tuto1">LLDB Tutorial: Adding debugger support for your target</a></b><br>
<i>Deepak Panickal - Codeplay</i><br>
<i>Andrzej Warzynski - Codeplay</i><br>
<a href="Tutorials/LLDB-tutorial.pdf"><b>Slides</b></a>
<a href="https://youtu.be/9hhDZeV0fYU"><b>Video</b></a><br>
This tutorial explains how to get started with adding a new architecture to
LLDB. It walks through all the major steps required and how LLDB's various
plugins work together in making this a maintainable and easily approachable
task. It will cover: basic definition of the architecture, implementing
register read/write through adding a RegisterContext, manipulating breakpoints,
single-stepping, adding an ABI for stack walking, adding support for
disassembly of the architecture, memory read/write through modifying Process
plugins, and everything else that is needed in order to provide a usable
debugging experience. The required steps will be demonstrated for a RISC
architecture not yet supported in LLDB, but simple enough so that no expert
knowledge of the underlying target is required. Practical debugging tips, as
well as solutions to common issues, will be given.
</p>
<p>
<b><a id="tuto2">Analyzing and Optimizing your Loops with Polly</a></b><br>
<i>Tobias Grosser - ETH</i><br>
<i>Johannes Doerfert - Saarland University</i><br>
<i>Zino Benaissa - Quic Inc.</i><br>
<a href="Tutorials/applied-polyhedral-compilation.pdf"><b>Slides</b></a>
<a href="https://youtu.be/mXve_W4XU2g"><b>Video</b></a><br>
The Polly Loop Optimizer is a framework for the analysis and optimization of
(possibly imperfectly) nested loops. It provides various transformations such
as loop fusion, loop distribution, loop tiling as well as outer loop
vectorization. In this tutorial we introduce the audience to the Polly loop
optimizer and show how Polly can be used to analyze and improve the performance
of their code. We start off with basic questions such as "Did Polly understand
my loops?", "What information did Polly gather?", "How does the optimized loop
nest look like?", "Can I provide more information to enable better
optimizations?", and "How can I utilize Polly's analysis for other purposes?".
Starting from these foundations we continue with a deeper look in more advanced
uses of Polly: This includes the analysis and optimization of some larger
benchmarks, the programming interfaces to Polly as well as the connection
between Polly and other LLVM-IR passes. At the end of this tutorial we expect
the audience to not only be able to optimize their codes with Polly, but also
to have a first understanding of how to use it as a framework to implement
their own loop transformations.
</p>
<p>
<b><a id="tuto3">Building, Testing and Debugging a Simple out-of-tree LLVM Pass</a></b><br>
<i>Serge Guelton - Quarkslab</i><br>
<i>Adrien Guinet - Quarkslab</i><br>
<a href="Tutorials/Tutorial.pdf"><b>Slides</b></a>
<a href="https://youtu.be/Z5KcwVaak3s"><b>Video</b></a><br>
This tutorial aims at providing solid ground to develop out-of-tree LLVM passes.
It presents all the required building blocks, starting from scratch: cmake
integration, llvm pass management, opt / clang integration. It presents the core
IR concepts through two simple obfuscating passes: the SSA form, the CFG, PHI
nodes, IRBuilder etc. We also take a quick tour on analysis integration through
dominators. Finally, it showcases how to use cl and lit to parametrize and test
the toy passes developed in the tutorial.
</p><p>
Note from the program committee: this was a succesful tutorial at the 2015 US
LLVM dev meeting, and we thought it made sense to have it again for a EuroLLVM
audience, especially when considering we are collocated with CGO and CC.
</p>
<div class="www_sectiontitle" id="LightningTalksAbstracts">Lightning talks abstracts</div>
<p>
<a href="https://youtu.be/TkanbGAG_Fo"><b>Video</b></a> for all lightning talks.<br>
<p>
<b><a id="lightning1">Random Testing of the LLVM Code Generator</a></b><br>
<i>Bevin Hansson - SICS Swedish ICT</i><br>
<a href="Lightning-Talks/RandomTestingOfTheLLVMCodeGenerator.pdf"><b>Slides</b></a><br>
LLVM is a large, complex piece of software with many interlocking components.
Testing a system of this magnitude is an arduous task. Random testing is an
increasingly popular technique used to test complex systems. A successful
example of this is Csmith, a tool which generates random, semantically valid C
programs.
</p><p>
We present a generic method to generate random but structured intermediate
representation code. Our method is implemented in LLVM to generate random
Machine IR code for testing the post-instruction selection stages of code
generation.
</p>
<p>
<b><a id="lightning2">ARCHER: Effectively Spotting Data Races in Large OpenMP Applications</a></b><br>
<i>Simone Atzeni - University of Utah</i><br>
<i>Ganesh Gopalakrishnan - University of Utah</i><br>
<i>Zvonimir Rakamaric - University of Utah</i><br>
<i>Dong H. Ahn - Lawrence Livermore National Laboratory</i><br>
<i>Ignacio Laguna - Lawrence Livermore National Laboratory</i><br>
<i>Martin Schulz - Lawrence Livermore National Laboratory</i><br>
<i>Gregory L. Lee - Lawrence Livermore National Laboratory</i><br>
<a href="Lightning-Talks/Archer_talk-EuroLLVM-2016.pdf"><b>Slides</b></a><br>
Although the importance OpenMP as a parallel programming model and its adoption
in Clang/LLVM is increasing (OpenMP 3.1 is now fully supported by Clang/LLVM
3.7), existing data-race checkers for OpenMP have high overheads and generate
many false positives. In this work, we propose the first OpenMP data race
checker, ARCHER, that achieves high accuracy and low overheads on large OpenMP
applications. Built on top of LLVM/Clang and the ThreadSanitizer (TSan) dynamic
race checker, ARCHER incorporates scalable happens-before tracking, and
exploits structured parallelism via combined static and dynamic analysis, and
modularly interfaces with OpenMP runtimes. ARCHER significantly outperforms
TSan and Intel Inspector XE, while providing the same or better precision. It
has helped detect critical data races in the Hypre library that is central to
many projects at the Lawrence Livermore National Laboratory (LLNL) and
elsewhere.
</p><p>
Note: this lightning has an associated <a href="#poster1">poster</a>
</p>
<p>
<b><a id="lightning3">Hierarchical Graph Coloring Register Allocation in LLVM</a></b><br>
<i>Aaron Smith - Microsoft Research</i><br>
<a href="Lightning-Talks/HierarchicalGraphColoringRegAlloc-asmith.pdf"><b>Slides</b></a><br>
This talk will present a new register allocator for LLVM based on a
hierarchical graph coloring approach. In this allocator a program's control
structure is represented as a tree of tiles and a two phase algorithm colors
the tiles based on both local and global information. This talk will describe
our implementation in LLVM along with an initial comparison to LLVM's existing
greedy allocator.
</p>
<p>
<b><a id="lightning4">Retargeting LLVM to an Explicit Data Graph Execution (EDGE) Architecture</a></b><br>
<i>Aaron Smith - Microsoft Research</i><br>
<a href="Lightning-Talks/RetargetingLLVMToEDGEArchitecture-asmith.pdf"><b>Slides</b></a><br>
This talk will describe recent work to retarget LLVM to an Explicit Data Graph
Execution (EDGE) architecture. EDGE architectures utilize a hybrid von
Neumann/dataflow execution model which provides out of order execution with
near in-order power efficiency. We will describe the challenges with targeting
an EDGE ISA with LLVM and compare our LLVM based EDGE compiler with a mature
production quality Visual Studio based EDGE toolchain.
</p>
<p>
<b><a id="lightning5">Optimal Register Allocation and Instruction Scheduling for LLVM</a></b><br>
<i>Roberto Casta&ntilde;eda Lozano - SICS &amp; Royal Institute of Technology (KTH)</i><br>
<i>Gabriel Hjort Blindell - Royal Institute of Technology (KTH)</i><br>
<i>Mats Carlsson - SICS</i><br>
<i>Christian Schulte - SICS &amp; Royal Institute of Technology (KTH)</i><br>
<a href="Lightning-Talks/unison.pdf"><b>Slides</b></a><br>
This talk presents Unison - a simple, flexible and potentially optimal tool
that solves register allocation and instruction scheduling simultaneously.
Experiments using MediaBench and Hexagon show that Unison can speed up the code
code generated by LLVM by up to 30%.
</p><p>
Unison is fully integrated with LLVM's code generator and hence can be used as
a complement to the existing heuristic algorithms. From a LLVM developer's
perspective, the ability to deliver optimal code makes Unison a powerful tool
to design and evaluate heuristics. From a user's perspective, Unison allows
compilation time to be traded for code quality beyond the usual -O{0,1,2,3,..}
optimization levels.
</p>
<p>
<b><a id="lightning6">Towards fully open source GPU accelerated molecular dynamics simulation</a></b><br>
<i>Vedran Mileti&cacute; - Heidelberg Institute for Theoretical Studies</i><br>
<i>Szil&aacute;rd P&aacute;ll - Royal Institute of Technology (KTH)</i><br>
<i>Frauke Gr&auml;ter - Heidelberg Institute for Theoretical Studies</i><br>
<a href="Lightning-Talks/miletic-gromacs-amdgpu.pdf"><b>Slides</b></a><br>
Molecular dynamics is a simulation method for studying movements of atoms and
molecules, usually applied in the study of biomolecules and materials. GROMACS
open source molecular dynamics simulator supports GPU acceleration using both
CUDA and OpenCL. While using CUDA is limited to NVIDIA GPUs and NVIDIA
proprietary drivers, compilers and libraries, OpenCL in GROMACS targets both
NVIDIA and AMD GPUs. Until this point, OpenCL in GROMACS was only tested on
proprietary drivers from NVIDIA and AMD.
</p><p>
Advances in AMDGPU LLVM backend and radeonsi Gallium compute stack for Radeon
Graphics Core Next (GCN) GPUs are steadily closing the feature gap between the
open source and proprietary drivers. Recent announcement from AMD regarding the
plan to support the existing open source OpenCL driver and open source their
(currently proprietary) OpenCL driver makes it feasible to run GPU accelerated
molecular dynamics on fully open source OpenCL stack.
</p><p>
Under the guidance and with help from AMD's developers working on LLVM, we are
working on improving AMDGPU LLVM backend, radeonsi Gallium compute stack, and
libclc to support the OpenCL features GROMACS requires to run. The lightning
talk will present the challenges we encountered in the process.
</p>
<p>
<b><a id="lightning7">CSiBE in the LLVM ecosystem</a></b><br>
<i>Gabor Ballabas - Department of Software Engineering, University of Szeged</i><br>
<i>Gabor Loki - Department of Software Engineering, University of Szeged</i><br>
<a href="Lightning-Talks/EuroLLVM_2016_paper_22.pdf"><b>Slides</b></a><br>
More than a decade ago, we have started to set up a code size benchmarking
environment for compilers - called CSiBE - which became the official code size
benchmark of GNU GCC. Since then, lots of open source and industrial compilers
and testing frameworks have integrated it in their system for benchmarking and
testing purpose. Nowadays CSiBE is getting increasing attention on the field of
IoT again. Since the benchmark environment of CSiBE feels old and complex for
the current modularized world, we have started to update its core. We are
extending CSiBE with a user friendly interface, modularized testbeds, support
for embedders and support for LLVM-based compilers (e.g., Clang and Rust). We
will share our experiences and the possibilities about CSiBE for the community.
</p>
<div class="www_sectiontitle" id="PostersAbstracts">Posters abstracts</div>
<p>
<b><a id="poster1">ARCHER: Effectively Spotting Data Races in Large OpenMP Applications</a></b><br>
<i>Simone Atzeni - University of Utah</i><br>
<i>Ganesh Gopalakrishnan - University of Utah</i><br>
<i>Zvonimir Rakamaric - University of Utah</i><br>
<i>Dong H. Ahn - Lawrence Livermore National Laboratory</i><br>
<i>Ignacio Laguna - Lawrence Livermore National Laboratory</i><br>
<i>Martin Schulz - Lawrence Livermore National Laboratory</i><br>
<i>Gregory L. Lee - Lawrence Livermore National Laboratory</i><br>
Although the importance OpenMP as a parallel programming model and its adoption
in Clang/LLVM is increasing (OpenMP 3.1 is now fully supported by Clang/LLVM
3.7), existing data-race checkers for OpenMP have high overheads and generate
many false positives. In this work, we propose the first OpenMP data race
checker, ARCHER, that achieves high accuracy and low overheads on large OpenMP
applications. Built on top of LLVM/Clang and the ThreadSanitizer (TSan) dynamic
race checker, ARCHER incorporates scalable happens-before tracking, and
exploits structured parallelism via combined static and dynamic analysis, and
modularly interfaces with OpenMP runtimes. ARCHER significantly outperforms
TSan and Intel Inspector XE, while providing the same or better precision. It
has helped detect critical data races in the Hypre library that is central to
many projects at the Lawrence Livermore National Laboratory (LLNL) and
elsewhere.
</p><p>
Note: this poster has an associated <a href="#lightning2">lightning talk</a>
</p>
<p>
<b><a id="poster2">Design-space exploration of LLVM pass order with simulated annealing</a></b><br>
<i>Nicholas Timmons - Cambridge University</i><br>
<i>David Chisnall - Cambridge University</i><br>
We undertook an automated design space exploration of the optimisation pass
order and inliner thresholds in Clang using simulated annealing. It was
performed separately on multiple input programs so that the results could be
validated against each other. Superior configurations to the preset
optimisation levels were found, such as those which produce similar run times
to the presets whilst reducing build times, and those which offer improved
run-time performance than the '-O3' optimisation level. Contrary to our
expectation, we also found that the preset optimisation levels did not provide
a uniform distribution in the tradeoff space between run and build-time
performance.
</p>
<p>
<b><a id="poster3">ConSerner: Compiler Driven Context Switches between Accelerators and CPUs</a></b><br>
<i>Ramy Gad - Johannes Gutenberg University</i><br>
<i>Tim Suess - University of Mainz</i><br>
<i>Andre Brinkmann - Johannes Gutenberg-Universit&auml;t Mainz</i><br>
Computer systems provide different heterogeneous resources (e.g., GPUs, DSPs
and FPGAs) that accelerate applications and that can reduce the energy
consumption by using them. Usually, these resources have an isolated memory and
a require target specific code to be written. There exist tools that can
automatically generate target specific codes for program parts, so-called
kernels. The data objects required for a target kernel execution need to be
moved to the target resource memory. It is the programmers' responsibility to
serialize these data objects used in the kernel and to copy them to or from the
resource's memory. Typically, the programmer writes his own serializing
function or uses existing serialization libraries. Unfortunately, both
approaches require code modifications, and the programmer needs knowledge of
the used data structure format. There is a need for a tool that is able to
automatically extract the original kernel data objects, serialize them, and
migrate them to a target resource without requiring intervention from the
programmer.
</p><p>
In this work, we present a tool collection ConSerner that automatically
identifies, gathers, and serializes the context of a kernel and migrates it to
a target resource's memory where a target specific kernel is executed with this
data. This is all done transparently to the programmer. Complex data structures
can be used without making a modification of the program code by a programmer
necessary. Predefined data structures in external libraries (e.g., the STL's
vector) can also be used as long as the source code of these libraries is
available.
</p>
<p>
<b><a id="poster4">Evaluation of State-of-the-art Static Checkers for Detecting Objective-C Bugs in iOS Applications</a></b><br>
<i>Thai San Phan - University of New South Wales</i><br>
<i>Yulei Sui - University of New South Wales</i><br>
The pervasive usage of mobile phone applications is now changing the way
people use traditional software. Smartphone apps generated an impressive USD
35 billion in full-year 2014, and in total 138 billion apps were
downloaded in the year. The last few years have seen an unprecedented number
of people rushing to develop mobile apps. Apple iOS has always played a major
role in the smart-devices industry ever since the evolution of it. On average,
around 45,000 newly developed apps are submitted for release to the iTunes
App Store in 2014. Similar as desktop software, any mobile applications are
prone to bugs and it is difficult to completely make them bug-free. As a
fundamental tool to help programmers effectively locate program defects during
compile time, static analysis approximates the runtime behaviour of a program
without actually executing it. It is extremely helpful to catch bugs earlier during
software development cycle before the produced is shipped in order to avoid
high maintenance cost. This poster is hence to evaluate the state-of-the-art static
checkers for detecting Objective-C bugs to systematically investigate the
advantages and disadvantages of using different checkers on a wide variety bug
patterns in iOS applications.
</p><p>
Objective-C, as the primary language for iOS application, is an object-oriented
superset of C such that it inherits syntax, primitive types and flow control
statements of C. Though it has many new features that distinguish it from C
such as message passing (equivalent to C or Java's method calling), interface
and implementation for objects (equivalent to "class" in C++), garbage collector
or now ARC (C does not have this feature), and most importantly, it is a
runtime-driven language where decisions such as memory allocations, object
creation, reflection API are decided at runtime as oppose to be determined
during compilation. All these features significantly complicated scalable and
precise static analysis.
</p>
<p>
<b><a id="poster5">Stack Size Estimation on Machine-Independent Intermediate Code for OpenCL Kernels</a></b><br>
<i>Stefano Cherubin - Politecnico di Milano</i><br>
<i>Michele Scandale - Politecnico di Milano</i><br>
<i>Giovanni Agosta - Politecnico di Milano</i><br>
Stack size is an important factor in the mapping decision when dealing with
embedded heterogeneous architectures, where fast memory is a scarce resource.
Trying to map a kernel onto a device with insufficient memory may lead to
reduced performance or even failure to run the kernel. OpenCL kernels are
often compiled just-in-time, starting from the source code or an intermediate
machine-independent representation. Precise stack size information, however,
is only available in machine-dependent code. We provide a method for computing
the stack size with sufficient accuracy on machine-independent code, given
knowledge of the target ABI and register file architecture. This method can be
applied to make mapping decisions early, thus avoiding to compile multiple
times the code for each possible accelerator in a complex embedded
heterogeneous system.
</p>
<p>
<b><a id="poster6">AAP: The Compiler Writer's Architecture from hell</a></b><br>
<i>Simon Cook - Embecosm</i><br>
<i>Edward Jones - Embecosm</i><br>
<i>Jeremy Bennett - Embecosm</i><br>
Contending with the blistering pace of LLVM advancement is a challenge for out
of tree targets. Many out of tree targets, often for widely used embedded
processors, have hardware features which are not well represented by the
mainstream LLVM project.
</p><p>
We introduced An Altruistic Processor (AAP) at EuroLLVM 2015. AAP's
architecture encapsulates as many of these features as possible. AAP is a
RISC, Harvard architecture with up to 64kB of byte addressed data, up to 16MW of
word addressed code, and a configurable register bank of between 4 and 64
registers.
</p><p>
In this poster we will present an update on the AAP architecture. We'll look
at some of the most challenging features, and how we have extended LLVM to
support them. This includes :
</p>
<ul>
<li>different sizes of code and address pointers,</li>
<li>how to handle code pointers that do not fit in the default address space,</li>
<li>operations where stack access is cheaper than register access,</li>
<li>how to relax call/return when you have multiple return address sizes.</li>
</ul>
<p>
<b><a id="poster7">Automatic Identification of Accelerators for Hybrid HW-SW Execution</a></b><br>
<i>Georgios Zacharopoulos - University of Lugano</i><br>
<i>Giovanni Ansaloni - University of Lugano</i><br>
<i>Laura Pozzi - University of Lugano</i><br>
While the number of transistors that can be put on a chip significantly
increases, as suggested by Moore's law, the dark silicon problem rises. This is
due to the power consumption not dropping at a corresponding rate, which
generates overheating issues. Accelerator-enhanced architectures can provide an
efficient solution to this and lead us to a hybrid HW-SW execution, where
computationally intensive parts can be performed by custom hardware. An
automation of this process is needed, so that applications in high-level
languages can be mapped to hardware and software directly. The process needs,
first, an automatic technique for identifying the parts of the computation that
should be accelerated, and secondly, an automated way of synthesising these
parts onto hardware. Under the scope of this paper, we are focusing on the
first part of this process, and we present the automatic identification of the
most computationally demanding parts, also known as custom instructions. The
state-of-the-art identification approaches have certain limitations, as custom
instruction selection is mostly performed within the scope of single Basic
Blocks. We introduce a novel selection strategy, implemented within the LLVM
framework, that carries out identification beyond the scope of a single Basic
Block and identifies Regions within the Control Flow Graph, as subgraphs of it.
Specific I/O constraints and area occupation metrics are taken into
consideration, in order to obtain Regions that would provide maximum speedup,
under architectural constraints, when transferred to hardware. For our final
experimentation and evaluation phase, kernels from the signal and image
processing domain are evaluated, and promising initial results show that the
identification technique proposed is often capable of mimicking manual designer
decisions.
</p>
<p>
<b><a id="poster8">Static Analysis for Automated Partitioning of Single-GPU Kernels</a></b><br>
<i>Alexander Matz - Ruprecht-Karls University of Heidelberg</i><br>
<i>Christoph Klein - Ruprecht-Karls University of Heidelberg</i><br>
<i>Holger Fr&ouml;ning - Ruprecht-Karls University of Heidelberg</i><br>
GPUs have established themselves in the computing landscape, convincing users
and designers by their excellent performance and energy efficiency. They differ
in many aspects from general-purpose CPUs, for instance their highly parallel
architecture, their thread-collective bulk-synchronous execution model, and
their programming model. Their use has been pushed by the introduction of
data-parallel languages like CUDA or OpenCL.
</p><p>
The inherent domain decomposition principle for these languages ensures a fine
granularity when partitioning the code, typically resulting in a mapping of one
single output element to one thread and reducing the need for work
agglomeration.
</p><p>
The BSP programming paradigm and its associated slackness regarding the ratio
of virtual to physical processors allows effective latency hiding techniques
that make large caching structures obsolete. At the same time, a typical BSP
code exhibits substantial amounts of locality, as the rather flat memory
hierarchy of thread-parallel processors has to rely on large amounts of data
reuse to keep their vast amount of processing units busy.
</p><p>
While these languages are rather easy to learn and use for single GPUs,
programming multiple GPUs has to be done in an explicit and manual fashion that
dramatically increases the complexity. The user has to manually orchestrate
data movements and kernel launches on the different processors. Even though
there exist concepts that span up global addresses like shared-virtual memory,
the significant bandwidth disparity between on-device (GDDR) and off-device
(PCIe) accesses usually results in no performance gains.
</p><p>
We leverage these observations for deriving a methodology to scale out
single-device programs to an execution on multiple devices, aggregating compute
and memory resources. Our approach comprises three steps: 1. collect
information about data dependency and memory access patterns using static code
analysis 2. merge information in order to choose an appropriate partitioning
strategy 3. apply code transformations to implement the chosen partitioning and
insert calls to a dynamic runtime library.
</p>
<div class="www_sectiontitle" id="BoFsAbstracts">BoFs abstracts</div>
<p>
<b><a id="bof1">LLVM Foundation</a></b><br>
<i>LLVM Foundation board of directors</i><br>
<a href="BoF-Minutes/LLVMFoundation.pdf"><b>BoF notes</b></a><br>
This BoF will give the EuroLLVM attendees a chance to talk with some of the
board members of the LLVM Foundation. We will discuss the Code of Conduct and
Apache2 license proposal and answer any questions about the LLVM Foundation.
</p>
<p>
<b><a id="bof2">Compilers in Education</a></b><br>
<i>Roel Jordans - Eindhoven University of Technology</i><br>
<i>Henk Corporaal - Eindhoven University of Technology</i><br>
<a href="BoF-Minutes/CompilersInEducation.pdf"><b>BoF notes</b></a><br>
While computer architecture and hardware optimization is generally well covered
in education, compilers are still often a poorly represented subject. Classical
compiler lecture series seem to mostly cover the front-end parts of the
compiler but usually lack an in-depth discussion of newer optimization and code
generation techniques. Important aspects such as auto-vectorization, complex
instruction support for DSP architectures, and instruction scheduling for
highly parallel for VLIW architectures are often touched only lightly. However,
creating new processor designs requires a properly optimizing compiler in order
for it to be usable by your customers. As such, there is a good market for
well-trained compiler engineers which does not match with the classical style
of teaching compilers in education.
</p><p>
At Eindhoven University of Technology, we are currently starting a new compiler
course that should provide such an improved lecture series to our
students and we plan to make this available to the wider community. The
focus of this lecture series is on tool-flow organization of modern
parallelizing compilers, their internal techniques, and the advantages
and limitations of these techniques. We try to train the students so that
they can understand how the compiler works internally, but also apply
this new knowledge in writing C program code that allows the compiler to
utilize its advanced optimizations to generate better and portable code.
As a result, we hope to provide better qualified compiler engineers, but
also train them to write better high-performance code at a high-level by
applying their compiler knowledge in guiding the compiler to an efficient
implementation of the program.
</p><p>
As part this process we would like to get in contact with institutes and
companies that will be taking advantage of our newly educated students
and discuss with them the contents of our lecture series. What do you
guys think are important topics that new engineers should know about to
be useful in your organization and what would make this course
interesting for yourself?
</p>
<p>
<b><a id="bof3">Surviving Downstream</a></b><br>
<i>Paul Robinson - Sony Computer Entertainment America</i><br>
<a href="BoF-Minutes/SurvivingDowntream.pdf"><b>BoF notes</b></a><br>
We presented "Living Downstream Without Drowning" as a tutorial/BOF
session at the US LLVM meeting in October. After the session, Paul
had people coming to talk to him for most of the evening social event
and half of the next day (and so missed several other talks!).
Clearly a lot of people are in this situation and there are many
good ideas to share.
</p><p>
Come to this follow-up BOF and share your practices, problems and
solutions for surviving the "flood" of changes from the upstream
LLVM projects.
</p>
<p>
<b><a id="bof4">Polly - Loop Optimization Infrastructure</a></b><br>
<i>Tobias Grosser - ETH</i><br>
<i>Johannes Doerfert - Saarland University</i><br>
<i>Zino Benaissa - Quic Inc.</i><br>
<a href="BoF-Minutes/PollyLoopOptimizationInfrastructure.pdf"><b>BoF notes</b></a><br>
The Polly Loop Optimization infrastructure has seen active development
throughout 2015 with contributions from a larger group of developers located at
various places around the globe. With three successful Polly sessions at the US
developers meeting and larger interest at the recent HiPEAC conference in Prag,
we expect various Polly developers to be able to attend EuroLLVM. To facilitate
in-persona collaboration between the core developers and to reach out to the
wider loop optimization community, we propose a BoF session on Polly and the
LLVM loop optimization infrastructure. Current hot topics are the
usability of Polly in an '-O3' compiler pass sequence, profile driven
optimizations as well as the definition of future development milestones.
The Polly developers community will present ideas on these topics, but
very much invites input from interested attendees.
</p>
<p>
<b><a id="bof5">LLVM on PowerPC and SystemZ</a></b><br>
<i>Ulrich Weigand - IBM</i><br>
<a href="BoF-Minutes/PowerPCAndSystemZ.pdf"><b>BoF notes</b></a><br>
This Birds of a Feather session is intended to bring together
developers and users interested in LLVM on the two IBM platforms
PowerPC and SystemZ.
</p><p>
Topics for discussion include:
</p>
<ul>
<li> Status of platform support in the two LLVM back ends: feature
completeness, architecture support, performance, ...</li>
<li> Platform support in other parts of the overall LLVM portfolio: LLD, LLDB, sanitizers, ...</li>
<li> Support for new languages and other emerging use cases: Swift, Rust, Impala, ...</li>
<li> Any other features currently in development for the platform(s)</li>
<li> User experiences on the platform(s), additional requirements</li>
</ul>
<p>
<b><a id="bof6">How to make LLVM more friendly to out-of-tree consumers ?</a></b><br>
<i>David Chisnall - Computer Laboratory, University of Cambridge</i><br>
<a href="BoF-Minutes/HowToMakeLLVMMoreFriendly.pdf"><b>BoF notes</b></a><br>
LLVM has always had the goal of a library-oriented design. This implicitly
assumes that the libraries that are parts of LLVM can be used by consumers that
are not part of the LLVM umbrella. In this BoF, we will discuss how well LLVM
has achieved this objective and what it could do better. Do you use LLVM in an
external project? Do you track trunk, or move between releases? What has
worked well for you, what has caused problems? Come along and share your
experiences.
</p>
<!-- *********************************************************************** -->
<hr>
<!--#include virtual="../../footer.incl" -->