Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TT Loop Optimizations #19

Closed
wants to merge 2 commits into from
Closed

TT Loop Optimizations #19

wants to merge 2 commits into from

Conversation

Britvich
Copy link

@Britvich Britvich commented Jul 7, 2014

Optimizations to the loops in the TT have been shown to increase Elo by ~2 points (under heavy cache pressure):

image

Note: This patch is a boiled-down version of tt_sailfish that only includes the minimal changes necessary to perform these loop optimizations.

The loop in store that finds the best entry to replace has been optimized so the check for a better replacement candidate never takes place against the first entry of a given cluster. Since this line:

  tte = replace = first_entry(key);

...already sets replace to the first entry in a cluster, there is no need consider the first entry again as a better replacement candidate. This means the check:

  // Is the next entry a better candidate for replacement?
  if ((tte->gen() == generation || tte->bound() == BOUND_EXACT)
       - (replace->gen() == generation)
       - (tte->depth8 < replace->depth8) < 0)

...only needs to be executed a maximum of 2 times, instead of the current maximum of 3 times.

In addition, the probe loop has been unrolled, avoiding some unnecessary housekeeping instructions.

No functional change

@lucasart
Copy link

lucasart commented Jul 7, 2014

That's already a better pull request. But still not commitable as is. I ran test with only the loop unrolling of TranspositionTable::probe():

diff --git a/src/tt.cpp b/src/tt.cpp
index 46d891c..edbd77c 100644
--- a/src/tt.cpp
+++ b/src/tt.cpp
@@ -72,14 +72,11 @@ const TTEntry* TranspositionTable::probe(const Key key) const {
   TTEntry* tte = first_entry(key);
   uint16_t key16 = key >> 48;

-  for (unsigned i = 0; i < TTClusterSize; ++i, ++tte)
-      if (tte->key16 == key16)
-      {
-          tte->genBound8 = generation | tte->bound(); // Refresh
-          return tte;
-      }
+  if (tte->key16 != key16 && (++tte)->key16 != key16 && (++tte)->key16 != key16)
+    return NULL;

-  return NULL;
+  tte->genBound8 = generation | tte->bound(); // Refresh
+  return tte;
}

And the result is a slowdown on my machine. To measure it, I ran stockfish bench 4 50 times:

stat    unrolling    master    diff
average 2,477,087 2,500,060 −22,974
stdev       7,014     7,399  10,195

2.25 stdev is statistically significant (probability of slowdown is 98.8% based on these results).

@lucasart lucasart closed this Jul 9, 2014
niklasf pushed a commit to niklasf/Stockfish that referenced this pull request Mar 11, 2016
niklasf pushed a commit to niklasf/Stockfish that referenced this pull request Mar 11, 2016
Viren6 added a commit to Viren6/Stockfish that referenced this pull request Feb 7, 2024
bench 1024 1 26 default depth nnue

Hit #5: Total 670979 Hits 290935 Hit Rate (%) 43.3598
Hit #6: Total 526362 Hits 200666 Hit Rate (%) 38.1232
Hit #7: Total 409913 Hits 155327 Hit Rate (%) 37.8927
Hit official-stockfish#8: Total 307992 Hits 107444 Hit Rate (%) 34.8853
Hit official-stockfish#9: Total 238620 Hits 82639 Hit Rate (%) 34.6321
Hit official-stockfish#10: Total 159371 Hits 52820 Hit Rate (%) 33.1428
Hit official-stockfish#11: Total 109867 Hits 35774 Hit Rate (%) 32.5612
Hit official-stockfish#12: Total 79281 Hits 24117 Hit Rate (%) 30.4196
Hit official-stockfish#13: Total 60737 Hits 18658 Hit Rate (%) 30.7193
Hit official-stockfish#14: Total 44693 Hits 13464 Hit Rate (%) 30.1255
Hit official-stockfish#15: Total 35225 Hits 11088 Hit Rate (%) 31.4776
Hit official-stockfish#16: Total 50823 Hits 16387 Hit Rate (%) 32.2433
Hit official-stockfish#17: Total 19747 Hits 6494 Hit Rate (%) 32.886
Hit official-stockfish#18: Total 15972 Hits 5266 Hit Rate (%) 32.9702
Hit official-stockfish#19: Total 12658 Hits 4173 Hit Rate (%) 32.9673
Hit official-stockfish#20: Total 8633 Hits 2871 Hit Rate (%) 33.2561
Hit official-stockfish#21: Total 6368 Hits 2236 Hit Rate (%) 35.1131
Hit official-stockfish#22: Total 4569 Hits 1670 Hit Rate (%) 36.5507
Hit official-stockfish#23: Total 3136 Hits 1302 Hit Rate (%) 41.5179
Hit official-stockfish#24: Total 1992 Hits 910 Hit Rate (%) 45.6827
Hit official-stockfish#25: Total 1398 Hits 680 Hit Rate (%) 48.6409
Hit official-stockfish#26: Total 883 Hits 514 Hit Rate (%) 58.2106
Hit official-stockfish#27: Total 569 Hits 348 Hit Rate (%) 61.1599
Hit official-stockfish#28: Total 331 Hits 223 Hit Rate (%) 67.3716
Hit official-stockfish#29: Total 205 Hits 141 Hit Rate (%) 68.7805
Hit official-stockfish#30: Total 103 Hits 71 Hit Rate (%) 68.932
Hit official-stockfish#31: Total 57 Hits 34 Hit Rate (%) 59.6491
Viren6 added a commit to Viren6/Stockfish that referenced this pull request Feb 7, 2024
bench 1024 1 26 default depth nnue

Hit #5: Total 673841 Hits 286569 Hit Rate (%) 42.5277
Hit #6: Total 563135 Hits 213101 Hit Rate (%) 37.8419
Hit #7: Total 454918 Hits 175263 Hit Rate (%) 38.5263
Hit official-stockfish#8: Total 349255 Hits 123193 Hit Rate (%) 35.2731
Hit official-stockfish#9: Total 271301 Hits 96581 Hit Rate (%) 35.5992
Hit official-stockfish#10: Total 184972 Hits 64415 Hit Rate (%) 34.8242
Hit official-stockfish#11: Total 127732 Hits 43448 Hit Rate (%) 34.015
Hit official-stockfish#12: Total 93881 Hits 30636 Hit Rate (%) 32.6328
Hit official-stockfish#13: Total 73504 Hits 24436 Hit Rate (%) 33.2444
Hit official-stockfish#14: Total 54409 Hits 17552 Hit Rate (%) 32.2594
Hit official-stockfish#15: Total 43262 Hits 13924 Hit Rate (%) 32.1853
Hit official-stockfish#16: Total 63010 Hits 20206 Hit Rate (%) 32.0679
Hit official-stockfish#17: Total 23513 Hits 7507 Hit Rate (%) 31.927
Hit official-stockfish#18: Total 19250 Hits 6361 Hit Rate (%) 33.0442
Hit official-stockfish#19: Total 15187 Hits 4775 Hit Rate (%) 31.4414
Hit official-stockfish#20: Total 10790 Hits 3435 Hit Rate (%) 31.835
Hit official-stockfish#21: Total 7924 Hits 2486 Hit Rate (%) 31.373
Hit official-stockfish#22: Total 5587 Hits 1941 Hit Rate (%) 34.7414
Hit official-stockfish#23: Total 3822 Hits 1314 Hit Rate (%) 34.3799
Hit official-stockfish#24: Total 2559 Hits 987 Hit Rate (%) 38.5698
Hit official-stockfish#25: Total 1568 Hits 623 Hit Rate (%) 39.7321
Hit official-stockfish#26: Total 1042 Hits 491 Hit Rate (%) 47.1209
Hit official-stockfish#27: Total 651 Hits 370 Hit Rate (%) 56.8356
Hit official-stockfish#28: Total 455 Hits 257 Hit Rate (%) 56.4835
Hit official-stockfish#29: Total 235 Hits 135 Hit Rate (%) 57.4468
Hit official-stockfish#30: Total 131 Hits 86 Hit Rate (%) 65.6489
Hit official-stockfish#31: Total 41 Hits 35 Hit Rate (%) 85.3659
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants