summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
83c828f)
It seems to be a waste of time to loop through all remaining root moves
after finishing each PV line. This patch skips this until we have reached
the last PV line (this is the way it was done in Glaurung and very early
versions of Stockfish).
No functional change in Single PV mode.
MultiPV=3 STC and LTC tests
LLR: 2.95 (-2.94,2.94) [0.00,5.00]
Total: 3113 W: 1248 L: 1064 D: 801
LLR: 2.95 (-2.94,2.94) [0.00,5.00]
Total: 2260 W: 848 L: 679 D: 733
Bench:
5023629
mainThread->bestMoveChanges = 0;
}
mainThread->bestMoveChanges = 0;
}
- size_t multiPV = Options["MultiPV"];
+ multiPV = Options["MultiPV"];
Skill skill(Options["Skill Level"]);
// When playing with strength handicap enable MultiPV search that we will
Skill skill(Options["Skill Level"]);
// When playing with strength handicap enable MultiPV search that we will
if (move == excludedMove)
continue;
if (move == excludedMove)
continue;
- // At root obey the "searchmoves" option and skip moves not listed in Root
- // Move List. As a consequence any illegal move is also skipped. In MultiPV
- // mode we also skip PV moves which have been already searched.
- if (rootNode && !std::count(thisThread->rootMoves.begin() + thisThread->PVIdx,
- thisThread->rootMoves.end(), move))
- continue;
+ if (rootNode)
+ {
+ // At root obey the "searchmoves" option and skip moves not listed in Root
+ // Move List. As a consequence any illegal move is also skipped.
+ if (!std::count(thisThread->rootMoves.begin() + thisThread->PVIdx,
+ thisThread->rootMoves.end(), move))
+ continue;
+
+ // In MultiPV mode we not only skip PV moves which have already been searched,
+ // but also any other move except we have reached the last PV line.
+ if ( thisThread->PVIdx + 1 < thisThread->multiPV
+ && move != ttMove)
+ continue;
+ }
ss->moveCount = ++moveCount;
ss->moveCount = ++moveCount;
int elapsed = Time.elapsed() + 1;
const RootMoves& rootMoves = pos.this_thread()->rootMoves;
size_t PVIdx = pos.this_thread()->PVIdx;
int elapsed = Time.elapsed() + 1;
const RootMoves& rootMoves = pos.this_thread()->rootMoves;
size_t PVIdx = pos.this_thread()->PVIdx;
- size_t multiPV = std::min((size_t)Options["MultiPV"], rootMoves.size());
+ size_t multiPV = pos.this_thread()->multiPV;
uint64_t nodesSearched = Threads.nodes_searched();
uint64_t tbHits = Threads.tb_hits() + (TB::RootInTB ? rootMoves.size() : 0);
uint64_t nodesSearched = Threads.nodes_searched();
uint64_t tbHits = Threads.tb_hits() + (TB::RootInTB ? rootMoves.size() : 0);
Pawns::Table pawnsTable;
Material::Table materialTable;
Endgames endgames;
Pawns::Table pawnsTable;
Material::Table materialTable;
Endgames endgames;
int selDepth, nmp_ply, nmp_odd;
std::atomic<uint64_t> nodes, tbHits;
int selDepth, nmp_ply, nmp_odd;
std::atomic<uint64_t> nodes, tbHits;