[Mesa-dev] [PATCH 02/13] nir: Remove f2i(i2f(x)) conversions

Ian Romanick idr at freedesktop.org
Sat Aug 4 02:20:47 UTC 2018


On 08/02/2018 03:26 PM, Jason Ekstrand wrote:
> This one bothers me a bit. People don't usually expect integer
> calculations so be modified at all so to replace an expression that
> takes in an internet and sometimes returns a different one with a no-op
> seems rather unexpected. Then again, GLSL doesn't actually specify
> precision or range of anything so we'd be right to use a double instead
> of a float in which case it would be a no-op.

That is fair.  It makes me a bit nervous too, and that's why I marked
them as imprecise. :)

I looked into some of the shaders that are affected by this
transformation.  What I saw looked more like weirdness added by a
HSLS-to-GLSL translation layer than anything done intentionally by the
programmer.  For example, several compute shaders have code like:

    s.xy = vec4(textureSize(...)).xy;
    t = ivec4(s.xyxy);
    t = t + ivec4(-1);
    c = texelFetch(..., t);

Note to self: A really clever optimization would translate this to
texelFecthOffset.

There were also a bunch of vertex shaders affected (mostly in a single
application).  They also had some odd patterns that looked like
something weird done by a translation layer.

> This isn't a nak, just a statement of nervousness. It's probably ok...
> 
> --Jason
> 
> On August 2, 2018 11:19:36 "Ian Romanick" <idr at freedesktop.org> wrote:
> 
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> Broadwell and Skylake had similar results. (Skylake shown)
>> total instructions in shared programs: 14277978 -> 14277620 (<.01%)
>> instructions in affected programs: 36957 -> 36599 (-0.97%)
>> helped: 76
>> HURT: 1
>> helped stats (abs) min: 2 max: 90 x̄: 4.89 x̃: 4
>> helped stats (rel) min: 0.44% max: 5.88% x̄: 1.04% x̃: 0.87%
>> HURT stats (abs)   min: 14 max: 14 x̄: 14.00 x̃: 14
>> HURT stats (rel)   min: 0.36% max: 0.36% x̄: 0.36% x̃: 0.36%
>> 95% mean confidence interval for instructions value: -7.06 -2.24
>> 95% mean confidence interval for instructions %-change: -1.28% -0.77%
>> Instructions are helped.
>>
>> total cycles in shared programs: 532584581 -> 532580716 (<.01%)
>> cycles in affected programs: 973591 -> 969726 (-0.40%)
>> helped: 76
>> HURT: 1
>> helped stats (abs) min: 2 max: 9940 x̄: 159.80 x̃: 32
>> helped stats (rel) min: <.01% max: 8.70% x̄: 1.15% x̃: 1.19%
>> HURT stats (abs)   min: 8280 max: 8280 x̄: 8280.00 x̃: 8280
>> HURT stats (rel)   min: 2.10% max: 2.10% x̄: 2.10% x̃: 2.10%
>> 95% mean confidence interval for cycles value: -386.98 286.59
>> 95% mean confidence interval for cycles %-change: -1.41% -0.81%
>> Inconclusive result (value mean confidence interval includes 0).
>>
>> total spills in shared programs: 8127 -> 8116 (-0.14%)
>> spills in affected programs: 108 -> 97 (-10.19%)
>> helped: 1
>> HURT: 0
>>
>> total fills in shared programs: 11090 -> 11086 (-0.04%)
>> fills in affected programs: 440 -> 436 (-0.91%)
>> helped: 1
>> HURT: 1
>>
>> Haswell
>> total instructions in shared programs: 12979174 -> 12979054 (<.01%)
>> instructions in affected programs: 9040 -> 8920 (-1.33%)
>> helped: 14
>> HURT: 1
>> helped stats (abs) min: 2 max: 34 x̄: 8.79 x̃: 6
>> helped stats (rel) min: 0.41% max: 7.04% x̄: 2.66% x̃: 1.14%
>> HURT stats (abs)   min: 3 max: 3 x̄: 3.00 x̃: 3
>> HURT stats (rel)   min: 0.19% max: 0.19% x̄: 0.19% x̃: 0.19%
>> 95% mean confidence interval for instructions value: -13.58 -2.42
>> 95% mean confidence interval for instructions %-change: -3.94% -1.01%
>> Instructions are helped.
>>
>> total cycles in shared programs: 411227148 -> 411212880 (<.01%)
>> cycles in affected programs: 630506 -> 616238 (-2.26%)
>> helped: 15
>> HURT: 0
>> helped stats (abs) min: 2 max: 11192 x̄: 951.20 x̃: 38
>> helped stats (rel) min: <.01% max: 16.01% x̄: 3.92% x̃: 0.17%
>> 95% mean confidence interval for cycles value: -2544.28 641.88
>> 95% mean confidence interval for cycles %-change: -6.89% -0.94%
>> Inconclusive result (value mean confidence interval includes 0).
>>
>> total spills in shared programs: 78626 -> 78623 (<.01%)
>> spills in affected programs: 42 -> 39 (-7.14%)
>> helped: 1
>> HURT: 0
>>
>> total fills in shared programs: 80111 -> 80104 (<.01%)
>> fills in affected programs: 140 -> 133 (-5.00%)
>> helped: 1
>> HURT: 1
>>
>> Ivy Bridge
>> total instructions in shared programs: 11684101 -> 11684030 (<.01%)
>> instructions in affected programs: 3080 -> 3009 (-2.31%)
>> helped: 4
>> HURT: 1
>> helped stats (abs) min: 5 max: 59 x̄: 18.50 x̃: 5
>> helped stats (rel) min: 6.47% max: 7.04% x̄: 6.87% x̃: 6.99%
>> HURT stats (abs)   min: 3 max: 3 x̄: 3.00 x̃: 3
>> HURT stats (rel)   min: 0.15% max: 0.15% x̄: 0.15% x̃: 0.15%
>> 95% mean confidence interval for instructions value: -45.59 17.19
>> 95% mean confidence interval for instructions %-change: -9.38% -1.56%
>> Inconclusive result (value mean confidence interval includes 0).
>>
>> total cycles in shared programs: 258407697 -> 258389653 (<.01%)
>> cycles in affected programs: 328323 -> 310279 (-5.50%)
>> helped: 5
>> HURT: 0
>> helped stats (abs) min: 32 max: 14908 x̄: 3608.80 x̃: 32
>> helped stats (rel) min: 1.26% max: 17.22% x̄: 9.30% x̃: 10.60%
>> 95% mean confidence interval for cycles value: -11616.71 4399.11
>> 95% mean confidence interval for cycles %-change: -16.56% -2.03%
>> Inconclusive result (value mean confidence interval includes 0).
>>
>> total spills in shared programs: 4537 -> 4528 (-0.20%)
>> spills in affected programs: 64 -> 55 (-14.06%)
>> helped: 1
>> HURT: 0
>>
>> total fills in shared programs: 4823 -> 4815 (-0.17%)
>> fills in affected programs: 189 -> 181 (-4.23%)
>> helped: 1
>> HURT: 1
>>
>> Sandy Bridge
>> total instructions in shared programs: 10488464 -> 10488449 (<.01%)
>> instructions in affected programs: 272 -> 257 (-5.51%)
>> helped: 3
>> HURT: 0
>> helped stats (abs) min: 5 max: 5 x̄: 5.00 x̃: 5
>> helped stats (rel) min: 5.49% max: 5.56% x̄: 5.51% x̃: 5.49%
>>
>> total cycles in shared programs: 150263359 -> 150263263 (<.01%)
>> cycles in affected programs: 7978 -> 7882 (-1.20%)
>> helped: 3
>> HURT: 0
>> helped stats (abs) min: 32 max: 32 x̄: 32.00 x̃: 32
>> helped stats (rel) min: 1.15% max: 1.23% x̄: 1.20% x̃: 1.23%
>>
>> No changes on Iron Lake or GM45.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>> 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 c4f46b56d95..9aeafcb8c46 100644
>> --- a/src/compiler/nir/nir_opt_algebraic.py
>> +++ b/src/compiler/nir/nir_opt_algebraic.py
>> @@ -455,6 +455,14 @@ optimizations = [
>>    (('iabs', ('b2i', a)), ('b2i', a)),
>>    (('inot', ('f2b', a)), ('feq', a, 0.0)),
>>
>> +   # Ironically, mark these as imprecise because removing the
>> conversions may
>> +   # preserve more precision than doing the conversions (e.g.,
>> +   # uint(float(0x81818181u)) == 0x81818200).
>> +   (('~f2i32', ('i2f32', 'a at 32')), a),
>> +   (('~f2i32', ('u2f32', 'a at 32')), a),
>> +   (('~f2u32', ('i2f32', 'a at 32')), a),
>> +   (('~f2u32', ('u2f32', 'a at 32')), a),
>> +
>>    # Packing and then unpacking does nothing
>>    (('unpack_64_2x32_split_x', ('pack_64_2x32_split', a, b)), a),
>>    (('unpack_64_2x32_split_y', ('pack_64_2x32_split', a, b)), b),
>> -- 
>> 2.14.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> 
> 



More information about the mesa-dev mailing list