Move perft out of search

This splits the logic of search and perft. Before, threads were started,
which then constructed a search object, which then started perft and
returned immediately. All of this is unnecessary, instead uci should
start perft right away.

closes https://github.com/official-stockfish/Stockfish/pull/5008

No functional change
This commit is contained in:
Disservin
2024-01-14 00:21:46 +01:00
parent 3d49a99aaf
commit 1dfbde2d10
4 changed files with 77 additions and 38 deletions

View File

@@ -122,37 +122,8 @@ void update_all_stats(const Position& pos,
int captureCount,
Depth depth);
// Utility to verify move generation. All the leaf nodes up
// to the given depth are generated and counted, and the sum is returned.
template<bool Root>
uint64_t perft(Position& pos, Depth depth) {
StateInfo st;
ASSERT_ALIGNED(&st, Eval::NNUE::CacheLineSize);
uint64_t cnt, nodes = 0;
const bool leaf = (depth == 2);
for (const auto& m : MoveList<LEGAL>(pos))
{
if (Root && depth <= 1)
cnt = 1, nodes++;
else
{
pos.do_move(m, st);
cnt = leaf ? MoveList<LEGAL>(pos).size() : perft<false>(pos, depth - 1);
nodes += cnt;
pos.undo_move(m);
}
if (Root)
sync_cout << UCI::move(m, pos.is_chess960()) << ": " << cnt << sync_endl;
}
return nodes;
}
} // namespace
Search::Worker::Worker(SharedState& sharedState,
std::unique_ptr<ISearchManager> sm,
size_t thread_id) :
@@ -173,13 +144,6 @@ void Search::Worker::start_searching() {
return;
}
if (limits.perft)
{
nodes = perft<true>(rootPos, limits.perft);
sync_cout << "\nNodes searched: " << nodes << "\n" << sync_endl;
return;
}
main_manager()->tm.init(limits, rootPos.side_to_move(), rootPos.game_ply(), options);
tt.new_search();