[Mesa-dev] [PATCH 1/4] nir: Do basic constant reassociation.

Eduardo Lima Mitev elima at igalia.com
Fri Apr 8 15:21:00 UTC 2016


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.
>
> 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 <elima at 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 <kenneth at 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'),
>



More information about the mesa-dev mailing list