From: Joost VandeVondele Date: Mon, 27 Feb 2017 00:41:58 +0000 (-0800) Subject: Simplify skipping of plies with helper threads X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=1810c4d758674dc4de288ca782851e52874f8908;hp=8f7e032b8c8c2c19e37ece09eecb589fe2342daa Simplify skipping of plies with helper threads Replaces the HalfDensity array with an equivalent, compact implementation. Includes suggestions by mcostalba & snicolet. No functional change Closes #1004 --- diff --git a/src/search.cpp b/src/search.cpp index 458f1490..1f706e63 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -132,34 +132,18 @@ namespace { Move pv[3]; }; - // Set of rows with half bits set to 1 and half to 0. It is used to allocate - // the search depths across the threads. - typedef std::vector Row; - - const Row HalfDensity[] = { - {0, 1}, - {1, 0}, - {0, 0, 1, 1}, - {0, 1, 1, 0}, - {1, 1, 0, 0}, - {1, 0, 0, 1}, - {0, 0, 0, 1, 1, 1}, - {0, 0, 1, 1, 1, 0}, - {0, 1, 1, 1, 0, 0}, - {1, 1, 1, 0, 0, 0}, - {1, 1, 0, 0, 0, 1}, - {1, 0, 0, 0, 1, 1}, - {0, 0, 0, 0, 1, 1, 1, 1}, - {0, 0, 0, 1, 1, 1, 1, 0}, - {0, 0, 1, 1, 1, 1, 0 ,0}, - {0, 1, 1, 1, 1, 0, 0 ,0}, - {1, 1, 1, 1, 0, 0, 0 ,0}, - {1, 1, 1, 0, 0, 0, 0 ,1}, - {1, 1, 0, 0, 0, 0, 1 ,1}, - {1, 0, 0, 0, 0, 1, 1 ,1}, - }; + // skip half of the plies in blocks depending on the helper thread idx. + bool skip_ply(int idx, int ply) { + + idx = (idx - 1) % 20 + 1; // cycle after 20 threads. - const size_t HalfDensitySize = std::extent::value; + // number of successive plies to skip, depending on idx. + int ones = 1; + while (ones * (ones + 1) < idx) + ones++; + + return ((ply + idx - 1) / ones - ones) % 2 == 0; + } EasyMoveManager EasyMove; Value DrawValue[COLOR_NB]; @@ -379,14 +363,9 @@ void Thread::search() { && !Signals.stop && (!Limits.depth || Threads.main()->rootDepth / ONE_PLY <= Limits.depth)) { - // Set up the new depths for the helper threads skipping on average every - // 2nd ply (using a half-density matrix). - if (!mainThread) - { - const Row& row = HalfDensity[(idx - 1) % HalfDensitySize]; - if (row[(rootDepth / ONE_PLY + rootPos.game_ply()) % row.size()]) - continue; - } + // skip plies for helper threads + if (idx && skip_ply(idx, rootDepth / ONE_PLY + rootPos.game_ply())) + continue; // Age out PV variability metric if (mainThread)