radeonsi: enable compiling one variant per shader
authorMarek Olšák <marek.olsak@amd.com>
Thu, 28 Jan 2016 00:29:59 +0000 (01:29 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Sun, 21 Feb 2016 20:08:58 +0000 (21:08 +0100)
Shader stats from VERDE:

Default scheduler:

Totals:
SGPRS: 491272 -> 488672 (-0.53 %)
VGPRS: 289980 -> 311093 (7.28 %)
Code Size: 11091656 -> 11219948 (1.16 %) bytes
LDS: 97 -> 97 (0.00 %) blocks
Scratch: 1732608 -> 2246656 (29.67 %) bytes per wave
Max Waves: 78063 -> 77352 (-0.91 %)
Wait states: 0 -> 0 (0.00 %)

Looking at some of the worst regressions, I get:
- The VGPR increase seems to be caused by the fact that if PS has used less
  than 16 VGPRs, now it will always use 16 VGPRs and sometimes even 20.
  However, the wave count remains at 10 if VGPRs <= 24, so no harm there.
- The scratch increase seems to be caused by SGPR spilling.
  The unnecessary SGPR spilling has been an ongoing issue with the compiler
  and it's completely fixable by rematerializing s_loads or reordering
  instructions.

SI scheduler:

Totals:
SGPRS: 374848 -> 374576 (-0.07 %)
VGPRS: 284456 -> 307515 (8.11 %)
Code Size: 11433068 -> 11535452 (0.90 %) bytes
LDS: 97 -> 97 (0.00 %) blocks
Scratch: 509952 -> 522240 (2.41 %) bytes per wave
Max Waves: 79456 -> 78217 (-1.56 %)
Wait states: 0 -> 0 (0.00 %)

VGPRs - same story as before. The SI scheduler doesn't spill SGPRs so much
and generally spills way less than the default scheduler.
(522240 spills vs 2246656 spills)

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/r600_pipe_common.c
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeonsi/si_pipe.c

index 324d2719f443511fa1c1e6d0e145ad9a29b609cb..ea028272ccdaa9e4b9750d1506e50d5aa0446ee5 100644 (file)
@@ -411,6 +411,7 @@ static const struct debug_named_value common_debug_options[] = {
        { "nodccclear", DBG_NO_DCC_CLEAR, "Disable DCC fast clear." },
        { "norbplus", DBG_NO_RB_PLUS, "Disable RB+ on Stoney." },
        { "sisched", DBG_SI_SCHED, "Enable LLVM SI Machine Instruction Scheduler." },
+       { "mono", DBG_MONOLITHIC_SHADERS, "Use old-style monolithic shaders compiled on demand" },
 
        DEBUG_NAMED_VALUE_END /* must be last */
 };
index e92df876c228649f7220f873346015105e9801ea..ee173d35880cce4bb3afa56106881c5699992ef0 100644 (file)
@@ -89,6 +89,7 @@
 #define DBG_NO_DCC_CLEAR       (1llu << 44)
 #define DBG_NO_RB_PLUS         (1llu << 45)
 #define DBG_SI_SCHED           (1llu << 46)
+#define DBG_MONOLITHIC_SHADERS (1llu << 47)
 
 #define R600_MAP_BUFFER_ALIGNMENT 64
 
index 8bfaf85df5bf02cb5b4de0212561cc582b57f4e1..30f3ec0753a985db33c4e33724f9f189d3601f2d 100644 (file)
@@ -623,7 +623,9 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
        sscreen->b.has_cp_dma = true;
        sscreen->b.has_streamout = true;
        pipe_mutex_init(sscreen->shader_parts_mutex);
-       sscreen->use_monolithic_shaders = true;
+       sscreen->use_monolithic_shaders =
+               HAVE_LLVM < 0x0308 ||
+               (sscreen->b.debug_flags & DBG_MONOLITHIC_SHADERS) != 0;
 
        if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
                sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS;