<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On Dec 30, 2016 9:57 PM, "Timothy Arceri" <<a href="mailto:timothy.arceri@collabora.com">timothy.arceri@collabora.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">On Fri, 2016-12-30 at 19:23 -0800, Jason Ekstrand wrote:<br>
> On Dec 30, 2016 3:50 AM, "Timothy Arceri" <timothy.arceri@collabora.c<br>
> om> wrote:<br>
> If one of the inputs to the multiplcation in ffma is the result of<br>
> an fmul there is a chance that we can reuse the result of that<br>
> fmul in other ffma calls if we do the multiplication in the right<br>
> order.<br>
><br>
> For example it is a fairly common pattern for shaders to do something<br>
> similar to this:<br>
><br>
>   const float a = 0.5;<br>
>   in vec4 b;<br>
>   in float c;<br>
><br>
>   ...<br>
><br>
>   b.x = b.x * c;<br>
>   b.y = b.y * c;<br>
><br>
>   ...<br>
><br>
>   b.x = b.x * a + a;<br>
>   b.y = b.y * a + a;<br>
><br>
> So by simply detecting that constant a is part of the multiplication<br>
> in ffma and switching it with previous fmul that updates b we end up<br>
> with:<br>
><br>
>   ...<br>
><br>
>   c = a * c;<br>
><br>
>   ...<br>
><br>
>   b.x = b.x * c + a;<br>
>   b.y = b.y * c + a;<br>
><br>
> shader-db results BDW:<br>
><br>
> total instructions in shared programs: 13065888 -> 13045434 (-0.16%)<br>
> instructions in affected programs: 2436228 -> 2415774 (-0.84%)<br>
> helped: 10261<br>
> HURT: 30<br>
><br>
> Nice!  Those are some impressive instruction count reductions.<br>
><br>
> I'm not sure what I think of the approach though.  We could probably<br>
> also do this in the ffma peephole itself.<br>
<br>
</div>Yeah most of the improvement comes from fixing the output of ffma<br>
peephole but there are still others that occur elsewhere.</blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">But it only affects things used in ffma...  Curious.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">
><br>
> total cycles in shared programs: 253619698 -> 253418728 (-0.08%)<br>
> cycles in affected programs: 141182838 -> 140981868 (-0.14%)<br>
> helped: 8853<br>
> HURT: 3162<br>
><br>
> total loops in shared programs: 2952 -> 2918 (-1.15%)<br>
> loops in affected programs: 66 -> 32 (-51.52%)<br>
> helped: 22<br>
> HURT: 0<br>
><br>
> total spills in shared programs: 15106 -> 14840 (-1.76%)<br>
> spills in affected programs: 8475 -> 8209 (-3.14%)<br>
> helped: 287<br>
> HURT: 31<br>
><br>
> total fills in shared programs: 20210 -> 19708 (-2.48%)<br>
> fills in affected programs: 12054 -> 11552 (-4.16%)<br>
> helped: 293<br>
> HURT: 28<br>
><br>
> LOST:   8<br>
> GAINED: 5<br>
><br>
> All the HURT besides an increase of a single instruction in a<br>
> yofrankie shader comes from deus-ex, however the helped<br>
> fills/spills/instructions far outways the HURT for other deus-ex<br>
> shaders.<br>
> ---<br>
>  src/compiler/nir/nir_opt_<wbr>algebraic.py | 1 +<br>
>  src/mesa/drivers/dri/i965/<wbr>brw_nir.c   | 1 +<br>
>  2 files changed, 2 insertions(+)<br>
><br>
> diff --git a/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
> b/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
> index 982f8b2..b13e484 100644<br>
> --- a/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
> +++ b/src/compiler/nir/nir_opt_<wbr>algebraic.py<br>
> @@ -111,6 +111,7 @@ optimizations = [<br>
>     (('~ffma', a, b, 0.0), ('fmul', a, b)),<br>
>     (('ffma', a, 1.0, b), ('fadd', a, b)),<br>
>     (('ffma', 1.0, a, b), ('fadd', a, b)),<br>
> +   (('ffma', ('!fmul', a, b), '#c', d), ('ffma', a, ('fmul', c, b),<br>
> d)),<br>
>     (('~flrp', a, b, 0.0), a),<br>
>     (('~flrp', a, b, 1.0), b),<br>
>     (('~flrp', a, a, b), a),<br>
> diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
> b/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
> index 6f37e97..7babc54 100644<br>
> --- a/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
> +++ b/src/mesa/drivers/dri/i965/<wbr>brw_nir.c<br>
> @@ -550,6 +550,7 @@ brw_postprocess_nir(nir_shader *nir, const struct<br>
> brw_compiler *compiler,<br>
>     if (devinfo->gen >= 6) {<br>
>        /* Try and fuse multiply-adds */<br>
>        OPT(brw_nir_opt_peephole_<wbr>ffma);<br>
> +      nir = nir_optimize(nir, compiler, is_scalar);<br>
><br>
> Why not just put this optimization in the late bucket with the other<br>
> post-ffma optimizations.<br>
<br>
</div>Well we need to at least do DCE after peephole ffma, but this is also<br>
triggering extra loop unrolling (haven't really explored why).<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Interesting.  In that case, there may be something we should be doing earlier.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I did have it in with the late calls at one point while testing but<br>
took it out as the results were not great, although that was before I<br>
had the previous patch from you.</blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Interesting...</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">
><br>
>     }<br>
><br>
>     OPT(nir_opt_algebraic_late);<br>
> --<br>
> 2.9.3<br>
><br>
> ______________________________<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>
><br>
> ______________________________<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></blockquote></div><br></div></div></div>