<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 8, 2017 at 2:34 PM, Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><div><div class="h5">
<p><br>
</p>
<div class="m_-4467660861384652085moz-cite-prefix">On 12/08/2017 03:55 PM, Jeff Hammond
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Fri, Dec 8, 2017 at 1:13 PM, Hal
Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF"><span class="m_-4467660861384652085gmail-">
<p><br>
</p>
<div class="m_-4467660861384652085gmail-m_-2288114881520531127moz-cite-prefix">On
12/07/2017 11:35 AM, Jeff Hammond wrote:<br>
</div>
<blockquote type="cite">
<div><br>
<div class="gmail_quote">
<div dir="auto">On Wed, Dec 6, 2017 at 8:57 PM
Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
<p><br>
</p>
<div class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852moz-cite-prefix">On
12/06/2017 10:23 PM, Jeff Hammond wrote:<br>
</div>
<blockquote type="cite">
<div><br>
<div class="gmail_quote">
<div dir="auto">On Wed, Dec 6, 2017 at
4:23 PM Hal Finkel <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
<p><br>
</p>
<div class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852m_2065056468622040889moz-cite-prefix">On
12/04/2017 10:48 PM, Serge Preis
via cfe-dev wrote:<br>
</div>
<blockquote type="cite">
<div>I agree that guarantees
provided by ICC may be
stronger than with other
compilers, so yes, under
OpenMP terms vectorization is
permitted and cannot be
assumed. However OpenMP
clearly defines semantics of
variables used within OpenMP
region some being
shared(scalar), some
private(vector) and some being
inductions. This goes far
beyond typical compiler
specific pragmas about
dependencies and cost
modelling and makes
vectorization much simpler
task with more predictable and
robust results if properly
implemented (admittedly, even
ICC implementation is far from
perfect). I hope Intel's
efforts to standardize
someting like this in core C++
will evntually come to
fruition. Until then I as a
regular application developer
would appreciate OpenMP-simd
based execution policy (hoping
for good support for OpenMP
SIMD in clang), but it
shouldn't necessary be part of
libc++. Since 'unordered'
execution policy is currently
not part of C++ standard </div>
</blockquote>
<br>
</div>
<div bgcolor="#FFFFFF">
std::execution::par_unseq is part
of C++17, and that essentially
maps to '#pragma omp parallel for
simd'.</div>
<div bgcolor="#FFFFFF"><br>
</div>
</blockquote>
<div dir="auto"><br>
</div>
<div dir="auto">Do you expect
par/par_unseq to nest?</div>
</div>
</div>
</blockquote>
<br>
</div>
<div bgcolor="#FFFFFF"> Yes.</div>
<div bgcolor="#FFFFFF"><br>
<br>
<blockquote type="cite">
<div>
<div class="gmail_quote">
<div dir="auto"> Nesting omp-parallel
is generally regarded as a Bad Idea.</div>
</div>
</div>
</blockquote>
<br>
</div>
<div bgcolor="#FFFFFF"> Agreed. I suspect
we'll want the mapping to be more like
'#pragma omp taskloop simd'.</div>
<div bgcolor="#FFFFFF"><br>
</div>
</blockquote>
<div dir="auto"><br>
</div>
<div dir="auto">That won’t run in parallel
unless in an omp-parallel-master region. </div>
</div>
</div>
</blockquote>
<br>
</span> Yes.<span class="m_-4467660861384652085gmail-"><br>
<br>
<blockquote type="cite">
<div>
<div class="gmail_quote">
<div dir="auto">That means OpenMP-based PSTL
won’t be parallel unless the user knows to add
back-end specific code about the PSTL.</div>
</div>
</div>
</blockquote>
<br>
</span> That obviously wouldn't be acceptable.<span class="m_-4467660861384652085gmail-"><br>
<br>
<blockquote type="cite">
<div>
<div class="gmail_quote">
<div dir="auto"><br>
</div>
<div dir="auto">What I’m trying to say is that
OpenMP is a poor target for PSTL in its
current form. Nested parallel regions is the
only thing that works and it is likely to work
poorly.</div>
</div>
</div>
</blockquote>
<br>
</span> I'm not sure that's true, but the technique may
not be trivial. I believe that it is possible, however.
For example, the mapping might be to something like:<br>
<br>
if (omp_in_parallel()) {<br>
#pragma omp taskloop simd<br>
for (size_t i = 0; i < N; ++i)<br>
F(X[i]);<br>
} else {<br>
#pragma omp parallel<br>
{<br>
#pragma omp taskloop simd<br>
for (size_t i = 0; i < N; ++i)<br>
F(X[i]);<br>
}<br>
}<br>
<br>
The fact that we'd need to use this kind of pattern is a
bit unfortunate, but it can be easily abstracted into a
template function, so it just becomes some
implementation detail of the library.<br>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>You are right and that is probably the best way to do
it with OpenMP. I am concerned about the absolute
performance, based upon my observations of omp-taskloop vs
omp-for and tbb::parallel_for</div>
</div>
</div>
</div>
</blockquote>
<br></div></div>
Have you tried this recently? There was a recursive task-stealing
strategy added to our OpenMP library in July of this year (r308338)
which should have made the performance of taskloop better.<span class=""><br>
<br></span></div></blockquote><div><br></div><div>I ran those benchmarks this summer with Intel 18 beta. Tom from LLNL mentioned that a stealing-based implementation of OpenMP taskloop was feasible but I didn't investigate whether it was used. Obviously, I know some people who can help me answer questions about the LLVM OpenMP runtime ;-)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><span class="">
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div> in the PRK project, but at least it is sane from a
semantic perspective. Having motivating use cases like
PSTL should lead to improvements in OpenMP runtime
performance w.r.t. taskloop.</div>
</div>
</div>
</div>
</blockquote>
<br></span>
Indeed :-)<span class=""><br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<div><a href="https://i.stack.imgur.com/MVd5j.png" target="_blank">https://i.stack.imgur.com/<wbr>MVd5j.png</a>
is a snapshot of the performance of PRK stencil (<a href="https://github.com/ParRes/Kernels/tree/master/Cxx11" target="_blank">https://github.com/ParRes/<wbr>Kernels/tree/master/Cxx11</a>),
which shows taskloop loses to TBB-based PSTL, OpenMP for,
and tbb::parallel_for (pure TBB beats TBB-based PSTL
because I use tbb::blocked_range2d, which improves cache
utilization). I think those results tuned taskloop
grainsize as well, so they may be an optimistic
representation of taskloop in a general usage.<br>
</div>
</div>
</div>
</div>
</blockquote>
<br></span>
Interesting.<span class=""><br></span></div></blockquote><div> </div><div>I should try to figure out how to recreate what TBB does with PSTL since it's clearly beneficial, at least on KNL. Obviously, I can block loops manually as I do with raw OpenMP code, but I'm sure there's a nicer way.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><span class="">
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<div>I'll see if I can prototype this in RAJA or Intel
PSTL. It's not hard to get results directly from the PRK
tests, if the former attempts fail.</div>
</div>
</div>
</div>
</blockquote>
</span></div></blockquote><div>Correct: I'll see if I can prototype for_each. The rest will be left as an exercise for the reader :-D</div><div><br>Jeff</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><span class=""></span>
Thanks!<span class="HOEnZb"><font color="#888888"><br>
<br>
-Hal</font></span><div><div class="h5"><br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<div>Best,</div>
<div><br>
</div>
<div>Jeff</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF"> Thanks again,<br>
Hal
<div>
<div class="m_-4467660861384652085gmail-h5"><br>
<br>
<blockquote type="cite">
<div>
<div class="gmail_quote">
<div dir="auto"><br>
</div>
<div dir="auto">Jeff</div>
<div dir="auto"><br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF"><br>
-Hal</div>
<div bgcolor="#FFFFFF"><br>
<br>
<blockquote type="cite">
<div>
<div class="gmail_quote">
<div dir="auto"><br>
</div>
<div dir="auto">Jeff</div>
<div dir="auto"><br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF"><br>
<blockquote type="cite">
<div>I don't care much on how
it will be implemneted in
libc++ if it is. I just
would like to ask Intel guys
and community here to make
implementation extensible in
a sense that custom
OpenMP-SIMD-based execution
policy along with algorithms
implementations (as
specializations for the
policy) can be used with the
libc++ library. And I
additionally would like to
ask Intel guys to provide
complete and compatible
extension on github for
developers like me to use.</div>
</blockquote>
<br>
</div>
<div bgcolor="#FFFFFF"> In the
end, I think we want the
following:<br>
<br>
1. A design for libc++ that
allows the thread-level
parallelism to be implemented in
terms of different underlying
providers (i.e., OpenMP, GCD,
Work Queues on Windows, whatever
else).<br>
2. To follow the same
philosophy with respect to
standards as we do everywhere
else: Use standards where
possible with
compiler/system-specific
extensions as necessary.<br>
<br>
-Hal</div>
<div bgcolor="#FFFFFF"><br>
<br>
<blockquote type="cite">
<div> </div>
<div>Regards,</div>
<div>Serge.</div>
<div> </div>
<div> </div>
<div> </div>
<div>04.12.2017, 12:07, "Jeff
Hammond" <a class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852m_2065056468622040889moz-txt-link-rfc2396E" href="mailto:jeff.science@gmail.com" target="_blank"><jeff.science@gmail.com></a>:</div>
<blockquote type="cite">
<div>
<div>ICC implements a very
aggressive
interpretation of the
OpenMP standard, and
this interpretation is
not shared by everyone
in the OpenMP
community. ICC is
correct but other
implementations may be
far less aggressive, so
_Pragma("omp simd")
doesn't guarentee
vectorization unless the
compiler documentation
says that is how it is
implemented. All the
standard says that it
means is that
vectorization is
_permitted_.</div>
<div> </div>
<div>Given that the
practical meaning of
_Pragma("omp simd")
isn't guaranteed to be
consistent across
different
implementations, I don't
really know how to
compare it to
compiler-specific
pragmas unless we define
everything explicitly.</div>
<div> </div>
<div>In any case, my
fundamental point
remains: do not use
OpenMP pragmas here, but
instead use whatever the
appropriate
compiler-specific pragma
is, or create a new one
that meets the need.</div>
<div> </div>
<div>Best,</div>
<div> </div>
<div>Jeff</div>
<div title="Page 81">
<div>
<div> </div>
</div>
</div>
<div>
<div>On Sun, Dec 3, 2017
at 8:09 PM, Serge
Preis <span><<a href="mailto:spreis@yandex-team.ru" target="_blank">spreis@yandex-team.ru</a>></span>
wrote:
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>Hello,</div>
<div> </div>
<div>_Pragma("omp
simd") is
semantically quite
different from
_Pragma("clang
loop
vectorize(assume_safety)"),
_Pragma("GCC
ivdep") and
_Pragma("vector
always"), so I am
not sure all
latter will work
as expected in all
cases. They
definitely won't
provide any
vectorization
guarantees which
slightly defeat
the purpose of
using
corresponding
execution policy.</div>
<div> </div>
<div>I support the
idea of having
OpenMP orthogonal
and definitely
having -fopenmp
enabled by default
is not an option.
Intel compiler has
separate
-qopenmp-simd
option which
doesn't affect
performance
outside explicitly
marked loops, but
even this is not
enabled by
default. I would
say that there
might exist
multiple
implementations of
unordered policy,
originally OpenMP
SIMD based
implementation may
be more powerful
and one based on
other pragmas
being default, but
hinting about
existence of
faster option.
Later on one may
be brave enough to
add some SIMD
template library
and implement
default unordered
policy using it
(such
implementation is
possible even now
using vector
types, but it will
be extremely
complex if attempt
to target all base
data types, vector
widths and target
SIMD architectures
clang supports.
Even with the
library this may
be quite tedious).</div>
<div> </div>
<div>Without any
standard way of
expressing SIMD
perallelism in
pure C++ any
implementer of
SIMD execution
policy is to rely
on means avaialble
for
plaform/compiler
and so it is not
totaly unnatural
to ask user to
enable OpenMP SIMD
for efficient
support of
corresponding
execution policy.</div>
<div> </div>
<div>Reagrds,</div>
<div>Serge Preis</div>
<div> </div>
<div>(Who once was
part of Intel
Compiler
Vectorizer team
and driven OpenMP
SIMD efforts
within icc and
beyond, if anyone
is keeping track
of
conflicts-of-interest)</div>
<div> </div>
<div> </div>
<div>04.12.2017,
08:46, "Jeff
Hammond via
cfe-dev" <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>>:</div>
<blockquote type="cite">
<div>
<div>
<div>It would
be nice to
keep PSTL and
OpenMP
orthogonal,
even if
_Pragma("omp
simd") does
not require
runtime
support. It
should be
trivial to use
_Pragma("clang
loop
vectorize(assume_safety)")
instead, by
wrapping all
of the
different
compiler
vectorization
pragmas in
preprocessor
logic. I
similarly
recommend
_Pragma("GCC
ivdep") for
GCC and
_Pragma("vector
always") for
ICC. While
this requires
O(n_compilers)
effort instead
of O(1), but
orthogonality
is worth it.
<div> </div>
<div>While
OpenMP is
vendor/compiler-agnostic,
users should
not be
required to
use -fopenmp
or similar to
enable
vectorization
from PSTL, nor
should the
compiler
enable any
OpenMP pragma
by default. I
know of cases
where merely
using the
-fopenmp flag
alters code
generation in
a
performance-visible
manner, and
enabling the
OpenMP "simd"
pragma by
default may
surprise some
users,
particularly
if no other
OpenMP pragmas
are enabled by
default.
<div><br>
Best,</div>
<div> </div>
<div>Jeff</div>
<div>(who
works for
Intel but not
on any
software
products and
has been a
heavy user of
Intel PSTL
since it was
released, if
anyone is
keeping track
of
conflicts-of-interest)<br>
<br>
On Wed, Nov
29, 2017 at
4:21 AM,
Kukanov,
Alexey via
cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>>
wrote:<br>
><br>
> Hello
all,<br>
><br>
> At Intel,
we have
developed an
implementation
of C++17
execution
policies<br>
> for
algorithms
(often
referred to as
Parallel STL).
We hope to
contribute it<br>
> to
libc++/LLVM,
so would like
to ask the
community for
comments on
this.<br>
><br>
> The code
is already
published at
GitHub (<a href="https://github.com/intel/parallelstl" target="_blank">https://github.com/intel/para<wbr>llelstl</a>).<br>
> It
supports the
C++17 standard
execution
policies (seq,
par,
par_unseq) as
well as<br>
> the
experimental
unsequenced
policy (unseq)
for SIMD
execution. At
the moment,<br>
> about
half of the
C++17 standard
algorithms
that must
support
execution
policies<br>
> are
implemented; a
few more will
be ready soon,
and the work
continues.<br>
> The tests
that we use
are also
available at
GitHub;
needless to
say we will<br>
>
contribute
those as well.<br>
><br>
> The
implementation
is not
specific to
Intel’s
hardware. For
thread-level
parallelism<br>
> it uses
TBB* (<a href="https://www.threadingbuildingblocks.org/" target="_blank">https://www.threadingbuilding<wbr>blocks.org/</a>)
but abstracts
it with<br>
> an
internal API
which can be
implemented on
top of other
threading/parallel
solutions –<br>
> so it is
for the
community to
decide which
ones to use.
For SIMD
parallelism<br>
> (unseq,
par_unseq) we
use #pragma
omp simd
directives; it
is
vendor-neutral
and<br>
> does not
require any
OpenMP runtime
support.<br>
><br>
> The
current
implementation
meets the
spirit but not
always the
letter of<br>
> the
standard,
because it has
to be separate
from but also
coexist with<br>
>
implementations
of standard
C++ libraries.
While
preparing the
contribution,<br>
> we will
address
inconsistencies,
adjust the
code to meet
community
standards,<br>
> and
better
integrate it
into the
standard
library code.<br>
><br>
> We are
also proposing
that our
implementation
is included
into
libstdc++/GCC.<br>
>
Compatibility
between the
implementations
seems useful
as it can
potentially<br>
> reduce
the amount of
work for
everyone. We
hope to keep
the code
mostly
identical,<br>
> and would
like to know
if you think
it’s too
optimistic to
expect.<br>
><br>
> Obviously
we plan to use
appropriate
open source
licenses to
meet the
different<br>
> projects’
requirements.<br>
><br>
> We expect
to keep
developing the
code and will
take the
responsibility
for<br>
>
maintaining it
(with
community
contributions,
of course). If
there are
other<br>
> community
efforts to
implement
parallel
algorithms, we
are willing to
collaborate.<br>
><br>
> We look
forward to
your feedback,
both for the
overall idea
and – if
supported –<br>
> for the
next steps we
should take.<br>
><br>
> Regards,<br>
> - Alexey
Kukanov<br>
><br>
> * Note
that TBB
itself is
highly
portable (and
ported by
community to
Power and ARM<br>
>
architectures)
and
permissively
licensed, so
could be the
base for the
threading<br>
>
infrastructure.
But the
Parallel STL
implementation
itself does
not require
TBB.<br>
><br>
>
______________________________<wbr>_________________<br>
> cfe-dev
mailing list<br>
> <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
<br>
<br>
<br>
<br>
--<br>
Jeff Hammond<br>
<a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a><br>
<a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a>
<div> </div>
</div>
</div>
</div>
</div>
</div>
,
<p><span>______________________________<wbr>_________________<br>
cfe-dev
mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a></span></p>
</blockquote>
</blockquote>
</div>
<div> </div>
--
<div>Jeff Hammond<br>
<a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a><br>
<a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a></div>
</div>
</div>
</blockquote>
<br>
<fieldset class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852m_2065056468622040889mimeAttachmentHeader"></fieldset>
<br>
<pre>______________________________<wbr>_________________
cfe-dev mailing list
<a class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852m_2065056468622040889moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>
<a class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852m_2065056468622040889moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a>
</pre>
</blockquote>
</div>
<div bgcolor="#FFFFFF">
<pre class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852m_2065056468622040889moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</div>
</blockquote>
</div>
</div>
<div>--
</div>
<div class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852gmail_signature">Jeff Hammond
<a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a>
<a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a></div>
</blockquote>
<pre class="m_-4467660861384652085gmail-m_-2288114881520531127m_8513274869410520852moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</div>
</blockquote>
</div>
</div>
<div dir="ltr">--
</div>
<div class="m_-4467660861384652085gmail-m_-2288114881520531127gmail_signature">Jeff
Hammond
<a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a>
<a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a></div>
</blockquote>
<pre class="m_-4467660861384652085gmail-m_-2288114881520531127moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
</div></div></div>
</blockquote></div>
<div>
</div>--
<div class="m_-4467660861384652085gmail_signature">Jeff Hammond
<a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a>
<a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a></div>
</div></div>
</blockquote>
<pre class="m_-4467660861384652085moz-signature" cols="72">--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Jeff Hammond<br><a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a><br><a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a></div>
</div></div>