<div dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 27, 2018 at 3:54 PM Ian Romanick <<a href="mailto:idr@freedesktop.org">idr@freedesktop.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><br>
<br>
Funny story... a single shader was hurt for instructions, spills, fills.<br>
That same shader was also the most helped for cycles.  #GPUsAreWeird<br>
<br>
No changes on any other Intel platform.<br>
<br>
v2: Refactor selection of atomic opcode to a separate function.<br>
Suggested by Jason.<br>
<br>
Haswell, Broadwell, and Skylake had similar results. (Skylake shown)<br>
total instructions in shared programs: 14304116 -> 14304261 (<.01%)<br>
instructions in affected programs: 12776 -> 12921 (1.13%)<br>
helped: 19<br>
HURT: 1<br>
helped stats (abs) min: 1 max: 16 x̄: 2.32 x̃: 1<br>
helped stats (rel) min: 0.05% max: 7.27% x̄: 0.92% x̃: 0.55%<br>
HURT stats (abs)   min: 189 max: 189 x̄: 189.00 x̃: 189<br>
HURT stats (rel)   min: 4.87% max: 4.87% x̄: 4.87% x̃: 4.87%<br>
95% mean confidence interval for instructions value: -12.83 27.33<br>
95% mean confidence interval for instructions %-change: -1.57% 0.31%<br>
Inconclusive result (value mean confidence interval includes 0).<br>
<br>
total cycles in shared programs: 527552861 -> 527531226 (<.01%)<br>
cycles in affected programs: 1459195 -> 1437560 (-1.48%)<br>
helped: 16<br>
HURT: 2<br>
helped stats (abs) min: 2 max: 21328 x̄: 1353.69 x̃: 6<br>
helped stats (rel) min: 0.01% max: 5.29% x̄: 0.36% x̃: 0.03%<br>
HURT stats (abs)   min: 12 max: 12 x̄: 12.00 x̃: 12<br>
HURT stats (rel)   min: 0.03% max: 0.03% x̄: 0.03% x̃: 0.03%<br>
95% mean confidence interval for cycles value: -3699.81 1295.92<br>
95% mean confidence interval for cycles %-change: -0.94% 0.30%<br>
Inconclusive result (value mean confidence interval includes 0).<br>
<br>
total spills in shared programs: 8025 -> 8033 (0.10%)<br>
spills in affected programs: 208 -> 216 (3.85%)<br>
helped: 1<br>
HURT: 1<br>
<br>
total fills in shared programs: 10989 -> 11040 (0.46%)<br>
fills in affected programs: 444 -> 495 (11.49%)<br>
helped: 1<br>
HURT: 1<br>
<br>
Ivy Bridge<br>
total instructions in shared programs: 11709181 -> 11709153 (<.01%)<br>
instructions in affected programs: 3505 -> 3477 (-0.80%)<br>
helped: 3<br>
HURT: 0<br>
helped stats (abs) min: 1 max: 23 x̄: 9.33 x̃: 4<br>
helped stats (rel) min: 0.11% max: 1.16% x̄: 0.63% x̃: 0.61%<br>
<br>
total cycles in shared programs: 254741126 -> 254738801 (<.01%)<br>
cycles in affected programs: 919067 -> 916742 (-0.25%)<br>
helped: 3<br>
HURT: 0<br>
helped stats (abs) min: 21 max: 2144 x̄: 775.00 x̃: 160<br>
helped stats (rel) min: 0.03% max: 0.90% x̄: 0.32% x̃: 0.03%<br>
<br>
total spills in shared programs: 4536 -> 4533 (-0.07%)<br>
spills in affected programs: 40 -> 37 (-7.50%)<br>
helped: 1<br>
HURT: 0<br>
<br>
total fills in shared programs: 4819 -> 4813 (-0.12%)<br>
fills in affected programs: 94 -> 88 (-6.38%)<br>
helped: 1<br>
HURT: 0<br>
<br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com" target="_blank">ian.d.romanick@intel.com</a>><br>
Reviewed-by: Caio Marcelo de Oliveira Filho <<a href="mailto:caio.oliveira@intel.com" target="_blank">caio.oliveira@intel.com</a>> [v1]<br>
---<br>
 src/intel/compiler/brw_fs_nir.cpp | 27 +++++++++++++++++++++++----<br>
 1 file changed, 23 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp<br>
index 9c9df5ac09f..67c39a661ec 100644<br>
--- a/src/intel/compiler/brw_fs_nir.cpp<br>
+++ b/src/intel/compiler/brw_fs_nir.cpp<br>
@@ -3604,6 +3604,21 @@ fs_visitor::nir_emit_fs_intrinsic(const fs_builder &bld,<br>
    }<br>
 }<br>
<br>
+static int<br>
+get_op_for_atomic_add(nir_intrinsic_instr *instr, unsigned src)<br>
+{<br>
+   const nir_const_value *const val = nir_src_as_const_value(instr->src[src]);<br>
+<br>
+   if (val != NULL) {<br>
+      if (val->i32[0] == 1)<br>
+         return BRW_AOP_INC;<br>
+      else if (val->i32[0] == -1)<br>
+         return BRW_AOP_DEC;<br>
+   }<br>
+<br>
+   return BRW_AOP_ADD;<br>
+}<br>
+<br>
 void<br>
 fs_visitor::nir_emit_cs_intrinsic(const fs_builder &bld,<br>
                                   nir_intrinsic_instr *instr)<br>
@@ -3660,7 +3675,7 @@ fs_visitor::nir_emit_cs_intrinsic(const fs_builder &bld,<br>
    }<br>
<br>
    case nir_intrinsic_shared_atomic_add:<br>
-      nir_emit_shared_atomic(bld, BRW_AOP_ADD, instr);<br>
+      nir_emit_shared_atomic(bld, get_op_for_atomic_add(instr, 1), instr);<br>
       break;<br>
    case nir_intrinsic_shared_atomic_imin:<br>
       nir_emit_shared_atomic(bld, BRW_AOP_IMIN, instr);<br>
@@ -4378,7 +4393,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr<br>
    }<br>
<br>
    case nir_intrinsic_ssbo_atomic_add:<br>
-      nir_emit_ssbo_atomic(bld, BRW_AOP_ADD, instr);<br>
+      nir_emit_ssbo_atomic(bld, get_op_for_atomic_add(instr, 2), instr);<br>
       break;<br>
    case nir_intrinsic_ssbo_atomic_imin:<br>
       nir_emit_ssbo_atomic(bld, BRW_AOP_IMIN, instr);<br>
@@ -4888,7 +4903,9 @@ fs_visitor::nir_emit_ssbo_atomic(const fs_builder &bld,<br>
    }<br>
<br>
    fs_reg offset = get_nir_src(instr->src[1]);<br>
-   fs_reg data1 = get_nir_src(instr->src[2]);<br>
+   fs_reg data1;<br>
+   if (op != BRW_AOP_INC && op != BRW_AOP_DEC && op != BRW_AOP_PREDEC)<br>
+      data1 = get_nir_src(instr->src[2]);<br>
    fs_reg data2;<br>
    if (op == BRW_AOP_CMPWR)<br>
       data2 = get_nir_src(instr->src[3]);<br>
@@ -4962,7 +4979,9 @@ fs_visitor::nir_emit_shared_atomic(const fs_builder &bld,<br>
<br>
    fs_reg surface = brw_imm_ud(GEN7_BTI_SLM);<br>
    fs_reg offset;<br>
-   fs_reg data1 = get_nir_src(instr->src[1]);<br>
+   fs_reg data1;<br>
+   if (op != BRW_AOP_INC && op != BRW_AOP_DEC && op != BRW_AOP_PREDEC)<br>
+      data1 = get_nir_src(instr->src[1]);<br>
    fs_reg data2;<br>
    if (op == BRW_AOP_CMPWR)<br>
       data2 = get_nir_src(instr->src[2]);<br>
-- <br>
2.14.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>