intel/fs: Teach instruction scheduler about GRF bank conflict cycles.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 6 Dec 2017 19:42:54 +0000 (11:42 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Thu, 7 Dec 2017 23:56:49 +0000 (15:56 -0800)
This should allow the post-RA scheduler to do a slightly better job at
hiding latency in presence of instructions incurring bank conflicts.
The main purpuse of this patch is not to improve performance though,
but to get conflict cycles to show up in shader-db statistics in order
to make sure that regressions in the bank conflict mitigation pass
don't go unnoticed.

Acked-by: Matt Turner <mattst88@gmail.com>
src/intel/compiler/brw_fs.h
src/intel/compiler/brw_fs_bank_conflicts.cpp
src/intel/compiler/brw_schedule_instructions.cpp

index 0cec6fdcbad7a0e348f22fd54072350bea31de08..9c160068a7e5a31cb29d4d7acf239f9f8fe73064 100644 (file)
@@ -146,6 +146,7 @@ public:
    bool opt_drop_redundant_mov_to_flags();
    bool opt_register_renaming();
    bool opt_bank_conflicts();
+   unsigned bank_conflict_cycles(const fs_inst *inst) const;
    bool register_coalesce();
    bool compute_to_mrf();
    bool eliminate_find_live_channel();
index b64a3d4a8a8da58f4d5d74b076338d1f373f55e5..42cdc6ef7dcce4bd0d439c1869756c6ed33ad36a 100644 (file)
@@ -891,3 +891,22 @@ fs_visitor::opt_bank_conflicts()
    delete[] constrained;
    return true;
 }
+
+/**
+ * Estimate the number of GRF bank conflict cycles incurred by an instruction.
+ *
+ * Note that this neglects conflict cycles prior to register allocation
+ * because we don't know which bank each VGRF is going to end up aligned to.
+ */
+unsigned
+fs_visitor::bank_conflict_cycles(const fs_inst *inst) const
+{
+   if (grf_used && inst->is_3src(devinfo) &&
+       is_grf(inst->src[1]) && is_grf(inst->src[2]) &&
+       bank_of(reg_of(inst->src[1])) == bank_of(reg_of(inst->src[2])) &&
+       !is_conflict_optimized_out(devinfo, inst)) {
+      return DIV_ROUND_UP(inst->dst.component_size(inst->exec_size), REG_SIZE);
+   } else {
+      return 0;
+   }
+}
index a1e825c661c34cb87cc29b6b4e436a5469c803ef..692f7125323050e5fc57630f744939180eb51363 100644 (file)
@@ -1543,10 +1543,11 @@ vec4_instruction_scheduler::choose_instruction_to_schedule()
 int
 fs_instruction_scheduler::issue_time(backend_instruction *inst)
 {
+   const unsigned overhead = v->bank_conflict_cycles((fs_inst *)inst);
    if (is_compressed((fs_inst *)inst))
-      return 4;
+      return 4 + overhead;
    else
-      return 2;
+      return 2 + overhead;
 }
 
 int