On 22/02/18 06:09, Ilia Mirkin wrote:
On Tue, Feb 20, 2018 at 8:35 PM, Timothy Arceri <[email protected]> wrote:
Delaying unrolling and allowing NIR to do it instead has been shown
to result in better code in drivers such as i965. shader-db results
appear to should the same is true for radeonsi.

The other advantage is that using NIR unrolling improves compile
times significantly.

Totals from affected shaders:
SGPRS: 9624 -> 10016 (4.07 %)
VGPRS: 6800 -> 6464 (-4.94 %)
Spilled SGPRs: 0 -> 2 (0.00 %)
Spilled VGPRs: 0 -> 0 (0.00 %)
Private memory VGPRs: 0 -> 0 (0.00 %)
Scratch size: 0 -> 0 (0.00 %) dwords per thread
Code Size: 359176 -> 332264 (-7.49 %) bytes

This basically means that fewer loops were unrolled.

No that is just one of the possibilities, as the commit message says unrolling with NIR has been shown in the past to result in better code.

The large drop seems to be largely a result of better loop unrolling in the dolphin uber shaders. For example shaders/dolphin/ubershaders/228.shader_test when using GLSL IR to unroll results in a final NIR representation with 39 loop (I'm actually not sure where they all come from as the raw shader seems to contain far fewer), but when unrolling in nir we end up with only 14 that could not be unrolled. The end result is a reduction in code size of 55%.

I don't know if
this is the right metric to look at when comparing loop unroll
efficacy.

IOW, you might want to look at actual perf of some of the affected
games. (For all I know it really does improve. My point is that this
isn't a good measure of that.)

If this were simply a case of less loops being unrolled one would also expect Max Waves to drop but instead they increased. There was a bunch of testing done when i965 switched to using NIR only for unrolling and once a couple of regressions were fixed doing it in NIR was shown to be much better. The fact is GLSL IR opts can end up doing more harm than good, eventually I'd still like to be able to do a a NIR packing pass like we have in GLSL IR and move various parts of the linker to NIR so that we can try disabling even more GLSL IR opts.



LDS: 0 -> 0 (0.00 %) blocks
Max Waves: 1355 -> 1432 (5.68 %)
Wait states: 0 -> 0 (0.00 %)
---
  src/gallium/drivers/radeonsi/si_get.c | 2 ++
  1 file changed, 2 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_get.c 
b/src/gallium/drivers/radeonsi/si_get.c
index ef03a962d1..18d9cec414 100644
--- a/src/gallium/drivers/radeonsi/si_get.c
+++ b/src/gallium/drivers/radeonsi/si_get.c
@@ -437,6 +437,8 @@ static int si_get_shader_param(struct pipe_screen* pscreen,
         case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
                 return SI_NUM_IMAGES;
         case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
+               if (sscreen->debug_flags & DBG(NIR))
+                       return 0;
                 return 32;
         case PIPE_SHADER_CAP_PREFERRED_IR:
                 if (sscreen->debug_flags & DBG(NIR))
--
2.14.3

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to