On Fri, Apr 8, 2016 at 8:21 AM, Eduardo Lima Mitev <el...@igalia.com> wrote:
> On 04/08/2016 01:35 AM, Kenneth Graunke wrote: > >> Many shaders contain expression trees of the form: >> >> const_1 * (value * const_2) >> >> Reorganizing these to >> >> (const_1 * const_2) * value >> >> will allow constant folding to combine the constants. Sometimes, these >> constants are 2 and 0.5, so we can remove a multiply altogether. Other >> times, it can create more immediate constants, which can actually hurt. >> > Further justification would be that the original was 4 NIR instructions: 2 load_const and 2 multiplies. Once constant folding takes over, we are again left with 4 NIR instructions: 2 load_const and 2 multiplies. The difference is that we now have (value * const_2) and (value * (const_1 * const_2)). So we have no more instructions in the end and, hopefully, the (value * const_2) goes away. Obviously, the emperical evidence says this actually hurts sometimes, but that's not surprising. > Finding a good balance here is tricky. While much more could be done, >> this simple patch seems to have a lot of positive benefit while having >> a low downside. >> >> > Makes sense. > > Reviewed-by: Eduardo Lima Mitev <el...@igalia.com> > > shader-db results on Broadwell: >> >> total instructions in shared programs: 8963768 -> 8961369 (-0.03%) >> instructions in affected programs: 438318 -> 435919 (-0.55%) >> helped: 1502 >> HURT: 245 >> >> total cycles in shared programs: 71527354 -> 71421516 (-0.15%) >> cycles in affected programs: 11541788 -> 11435950 (-0.92%) >> helped: 3445 >> HURT: 1224 >> >> > FWIW, these are my results on HSW: > > total instructions in shared programs: 6223995 -> 6222470 (-0.02%) > instructions in affected programs: 300945 -> 299420 (-0.51%) > helped: 1231 > HURT: 240 > > total cycles in shared programs: 56809432 -> 56615552 (-0.34%) > cycles in affected programs: 7980160 -> 7786280 (-2.43%) > helped: 2087 > HURT: 634 > > Eduardo > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> >> --- >> src/compiler/nir/nir_opt_algebraic.py | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/src/compiler/nir/nir_opt_algebraic.py >> b/src/compiler/nir/nir_opt_algebraic.py >> index e72b4a7..420d9d9 100644 >> --- a/src/compiler/nir/nir_opt_algebraic.py >> +++ b/src/compiler/nir/nir_opt_algebraic.py >> @@ -274,6 +274,14 @@ optimizations = [ >> (('fmul', ('fneg', a), b), ('fneg', ('fmul', a, b))), >> (('imul', ('ineg', a), b), ('ineg', ('imul', a, b))), >> >> + # Reassociate constants in add/mul chains so they can be folded >> together. >> + # For now, we only handle cases where the constants are separated by >> + # a single non-constant. We could do better eventually. >> + (('~fmul', '#a', ('fmul', b, '#c')), ('fmul', ('fmul', a, c), b)), >> + (('imul', '#a', ('imul', b, '#c')), ('imul', ('imul', a, c), b)), >> + (('~fadd', '#a', ('fadd', b, '#c')), ('fadd', ('fadd', a, c), b)), >> + (('iadd', '#a', ('iadd', b, '#c')), ('iadd', ('iadd', a, c), b)), >> + >> # Misc. lowering >> (('fmod', a, b), ('fsub', a, ('fmul', b, ('ffloor', ('fdiv', a, >> b)))), 'options->lower_fmod'), >> (('uadd_carry', a, b), ('b2i', ('ult', ('iadd', a, b), a)), >> 'options->lower_uadd_carry'), >> >> > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev