intel/fs: Take into account amount of data read in spilling cost heuristic.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 20 Apr 2017 18:42:27 +0000 (11:42 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 24 Apr 2017 18:01:40 +0000 (11:01 -0700)
Until now the spilling cost calculation was neglecting the amount of
data read from the register during the spilling cost calculation.
This caused it to make suboptimal decisions in some cases leading to
higher memory bandwidth usage than necessary.

Improves Unigine Heaven performance by ~4% on BDW, reversing an
unintended FPS regression from my previous commit
147e71242ce539ff28e282f009c332818c35f5ac with n=12 and statistical
significance 5%.  In addition SynMark2 OglCSDof performance is
improved by an additional ~5% on SKL, and a Kerbal Space Program
apitrace around the Moho planet I can provide on request improves by
~20%.

Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Plamena Manolova <plamena.manolova@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/compiler/brw_fs_reg_allocate.cpp

index 2d4d46ef3348290561618e0b82ac560fb61eb8b6..ec8e116cb384d6c4756b2cb4a9dabc1a27871c2e 100644 (file)
@@ -822,7 +822,7 @@ fs_visitor::choose_spill_reg(struct ra_graph *g)
    foreach_block_and_inst(block, fs_inst, inst, cfg) {
       for (unsigned int i = 0; i < inst->sources; i++) {
         if (inst->src[i].file == VGRF)
-            spill_costs[inst->src[i].nr] += block_scale;
+            spill_costs[inst->src[i].nr] += regs_read(inst, i) * block_scale;
       }
 
       if (inst->dst.file == VGRF)