Skip to content
  • Francisco Jerez's avatar
    intel/fs: Restrict live intervals to the subset possibly reachable from any definition. · c3c1aa5a
    Francisco Jerez authored
    
    
    Currently the liveness analysis pass would extend a live interval up
    to the top of the program when no unconditional and complete
    definition of the variable is found that dominates all of its uses.
    
    This can lead to a serious performance problem in shaders containing
    many partial writes, like scalar arithmetic, FP64 and soon FP16
    operations.  The number of oversize live intervals in such workloads
    can cause the compilation time of the shader to explode because of the
    worse than quadratic behavior of the register allocator and scheduler
    when running out of registers, and it can also cause the running time
    of the shader to explode due to the amount of spilling it leads to,
    which is orders of magnitude slower than GRF memory.
    
    This patch fixes it by computing the intersection of our current live
    intervals with the subset of the program that can possibly be reached
    from any definition of the variable.  Extending the storage allocation
    of the variable beyond that is pretty useless because its value is
    guaranteed to be undefined at a point that cannot be reached from any
    definition.
    
    According to Jason, this improves performance of the subgroup Vulkan
    CTS tests significantly (e.g. the runtime of the dvec4 broadcast test
    improves by nearly 50x).
    
    No significant change in the running time of shader-db (with 5%
    statistical significance).
    
    shader-db results on IVB:
    
      total cycles in shared programs: 61108780 -> 60932856 (-0.29%)
      cycles in affected programs: 16335482 -> 16159558 (-1.08%)
      helped: 5121
      HURT: 4347
    
      total spills in shared programs: 1309 -> 1288 (-1.60%)
      spills in affected programs: 249 -> 228 (-8.43%)
      helped: 3
      HURT: 0
    
      total fills in shared programs: 1652 -> 1597 (-3.33%)
      fills in affected programs: 262 -> 207 (-20.99%)
      helped: 4
      HURT: 0
    
      LOST:   2
      GAINED: 209
    
    shader-db results on BDW:
    
      total cycles in shared programs: 67617262 -> 67361220 (-0.38%)
      cycles in affected programs: 23397142 -> 23141100 (-1.09%)
      helped: 8045
      HURT: 6488
    
      total spills in shared programs: 1456 -> 1252 (-14.01%)
      spills in affected programs: 465 -> 261 (-43.87%)
      helped: 3
      HURT: 0
    
      total fills in shared programs: 1720 -> 1465 (-14.83%)
      fills in affected programs: 471 -> 216 (-54.14%)
      helped: 4
      HURT: 0
    
      LOST:   2
      GAINED: 162
    
    shader-db results on SKL:
    
      total cycles in shared programs: 65436248 -> 65245186 (-0.29%)
      cycles in affected programs: 22560936 -> 22369874 (-0.85%)
      helped: 8457
      HURT: 6247
    
      total spills in shared programs: 437 -> 437 (0.00%)
      spills in affected programs: 0 -> 0
      helped: 0
      HURT: 0
    
      total fills in shared programs: 870 -> 854 (-1.84%)
      fills in affected programs: 16 -> 0
      helped: 1
      HURT: 0
    
      LOST:   0
      GAINED: 107
    
    Reviewed-by: default avatarJason Ekstrand <jason@jlekstrand.net>
    c3c1aa5a