<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jan 13, 2017 at 2:18 PM, Timothy Arceri <span dir="ltr"><<a href="mailto:timothy.arceri@collabora.com" target="_blank">timothy.arceri@collabora.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, 2017-01-13 at 13:59 -0800, Jason Ekstrand wrote:<br>
> On Fri, Jan 13, 2017 at 11:22 AM, Vladislav Egorov <vegorov180@gmail.<br>
> com> wrote:<br>
> > 13.01.2017 19:51, Emil Velikov пишет:<br>
> > > From: Emil Velikov <<a href="mailto:emil.velikov@collabora.com">emil.velikov@collabora.com</a>><br>
> > ><br>
> > > At the moment we support 5+ different implementations each with<br>
> > > varying<br>
> > > amount of bugs - from thread safely problems [1], to outright<br>
> > > broken<br>
> > > implementation(s) [2]<br>
> > ><br>
> > > In order to accommodate these we have 150+ lines of configure<br>
> > > script and<br>
> > > extra two configure toggles. Whist an actual implementation being<br>
> > > ~200loc and our current compat wrapping ~250.<br>
><br>
> Yes, this is a problem.  Especially given that at least one of those<br>
> implementations (openssl?) is something that a certain major game<br>
> distributor likes to hard-link into things causing interesting and<br>
> hard-to-debug problems.  I am all for getting rid of the "piles of<br>
> different dependencies" approach.<br>
><br>
> Also, something I would like to see (maybe a follow-on patch?) would<br>
> a change to the mesa internal API to be able to put the SHA context<br>
> on the stack and not need to malloc it.  It's not really a memory or<br>
> cycle-saving thing so much as it leaves one fewer cleanup paths you<br>
> have to worry about.<br>
>  <br>
> > > Let's not forget that different people use different code paths,<br>
> > > thus<br>
> > > effectively makes it harder to test and debug since the default<br>
> > > implementation is automatically detected.<br>
> > ><br>
> > > To minimise all these lovely experiences, import the "100% Public<br>
> > > Domain" OpenBSD sha1 implementation. Clearly document any changes<br>
> > > needed<br>
> > > to get building correctly, since many/most of those can be<br>
> > > upstreamed<br>
> > > making future syncs easier.<br>
> > ><br>
> >  <br>
> > It can hurt performance. OpenSSL implementation is optimized for<br>
> > all thinkable architectures and it will use hardware SHA-1<br>
> > instructions on newer CPUs. From <a href="https://github.com/openssl/openssl" rel="noreferrer" target="_blank">https://github.com/openssl/<wbr>openssl</a><br>
> > /blob/master/crypto/sha/asm/<a href="http://sha1-x86_64.pl" rel="noreferrer" target="_blank">sh<wbr>a1-x86_64.pl</a> :<br>
> ><br>
> > > Current performance is summarized in following table. Numbers are<br>
> > > CPU clock cycles spent to process single byte (less is better).<br>
> > ><br>
> > >        x86_64        SSSE3        AVX[2]<br>
> > > P4        9.05        -<br>
> > > Opteron    6.26        -<br>
> > > Core2        6.55        6.05/+8%    -<br>
> > > Westmere    6.73        5.30/+27%    -<br>
> > > Sandy Bridge    7.70        6.10/+26%    4.99/+54%<br>
> > > Ivy Bridge    6.06        4.67/+30%    4.60/+32%<br>
> > > Haswell    5.45        4.15/+31%    3.57/+53%<br>
> > > Skylake    5.18        4.06/+28%    3.54/+46%<br>
> > > Bulldozer    9.11        5.95/+53%<br>
> > > VIA Nano    9.32        7.15/+30%<br>
> > > Atom        10.3        9.17/+12%<br>
> > > Silvermont    13.1(*)        9.37/+40%<br>
> > > Goldmont    8.13        6.42/+27%    1.70/+380%(**)<br>
> ><br>
> > Quick benchmark on my Haswell of the OpenBSD implementation<br>
> > compiled with GCC5 -O2: ~8 cycles per byte on 32-bit, ~7 cycles per<br>
> > byte on 64-bit. But Haswell is a very powerful CPU, on weaker CPUs<br>
> > the difference would be probably larger, especially on new CPUs<br>
> > that have SHA instruction set.<br>
><br>
> Thanks for the numbers.  It sounds like, on Haswell, the openSSL<br>
> implementation is about 2x as fast which is very useful to know. <br>
> However, this isn't on a super perf-critical path.  We never use SHA1<br>
> on any draw-time paths; we always use a simpler hash function in<br>
> those cases and reserve SHA1 for when we really don't want<br>
> collisions.<br>
<br>
</div></div>Actually the OpenGL shader cache uses it a draw time to find cached<br>
variants. I looked at pulling an implementation into Mesa a while ago<br>
but found the perf drop wasn't worth it.<br></blockquote><div><br></div><div>Why doesn't the usual in-memory cache stand as a front-line defense?  Could you please be more specific about the perf implications you've seen?  Also, which implementation were you linking to that was so much faster?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I really like the idea of having an internal implementation but I don't<br>
think we should dismiss performance so quickly it would be nice if we<br>
could hold this off until more testing can be done.<br>
<span class="im HOEnZb"><br>
>   That said, it's a bit more critical than Emil makes it sound.  A<br>
> typical Vulkan application may easily create 10k pipelines and each<br>
> of those will involve hashing at least about 100B of data (not<br>
> include the SPIR-V source).  I doubt, however, that this is enough to<br>
> really cause a problem given how much other work goes into building a<br>
> pipeline.<br>
><br>
> Unfortunately, the OpenSSL implementation, while fast, is one of the<br>
> ones that is causing problems.  One of our favorite game distributors<br>
> likes to hard-link against openssl in some of their games and/or<br>
> libraries (not sure which).  This means that, if mesa tries to<br>
> dynamically open libssl, you get mysterious crashes due to slight<br>
> differences between the system-installed version and the one that has<br>
> been linked into the game.  This makes trying to use the OpenSSL<br>
> implementation a non-starter without being able to wholesale import<br>
> the implementation.<br>
><br>
> Emil, I'm fine with this change.  I haven't reviewed the details, but<br>
> my gut tells me we can eat the perf difference for now.  Consider<br>
> that an Acked-by if you'd like but it would be good to have someone<br>
> review at least the build system stuff.<br>
</span><div class="HOEnZb"><div class="h5">> ______________________________<wbr>_________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</div></div></blockquote></div><br></div></div>