1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Fix uninitialized memory usage

After increasing the number of threads, the histories were not cleared,
resulting in uninitialized memory usage.

This patch fixes this by clearing threads histories in Thread c'tor as
is the idomatic way.

This fixes issue 1227

No functional change.
This commit is contained in:
Joost VandeVondele 2017-08-31 09:34:32 +02:00 committed by Marco Costalba
parent 7b4c9852e1
commit e385f194e9
4 changed files with 21 additions and 13 deletions

View file

@ -75,9 +75,6 @@ namespace {
int FutilityMoveCounts[2][16]; // [improving][depth] int FutilityMoveCounts[2][16]; // [improving][depth]
int Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber] int Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber]
// Threshold used for countermoves based pruning
const int CounterMovePruneThreshold = 0;
template <bool PvNode> Depth reduction(bool i, Depth d, int mn) { template <bool PvNode> Depth reduction(bool i, Depth d, int mn) {
return Reductions[PvNode][i][std::min(d / ONE_PLY, 63)][std::min(mn, 63)] * ONE_PLY; return Reductions[PvNode][i][std::min(d / ONE_PLY, 63)][std::min(mn, 63)] * ONE_PLY;
} }
@ -219,16 +216,7 @@ void Search::clear() {
TT.clear(); TT.clear();
for (Thread* th : Threads) for (Thread* th : Threads)
{ th->clear();
th->counterMoves.fill(MOVE_NONE);
th->mainHistory.fill(0);
for (auto& to : th->contHistory)
for (auto& h : to)
h.fill(0);
th->contHistory[NO_PIECE][0].fill(CounterMovePruneThreshold - 1);
}
Threads.main()->callsCnt = 0; Threads.main()->callsCnt = 0;
Threads.main()->previousScore = VALUE_INFINITE; Threads.main()->previousScore = VALUE_INFINITE;

View file

@ -31,6 +31,10 @@ class Position;
namespace Search { namespace Search {
/// Threshold used for countermoves based pruning
const int CounterMovePruneThreshold = 0;
/// Stack struct keeps track of the information we need to remember from nodes /// Stack struct keeps track of the information we need to remember from nodes
/// shallower and deeper in the tree during the search. Each search thread has /// shallower and deeper in the tree during the search. Each search thread has
/// its own array of Stack objects, indexed by the current ply. /// its own array of Stack objects, indexed by the current ply.

View file

@ -35,6 +35,7 @@ ThreadPool Threads; // Global object
Thread::Thread(size_t n) : idx(n), stdThread(&Thread::idle_loop, this) { Thread::Thread(size_t n) : idx(n), stdThread(&Thread::idle_loop, this) {
wait_for_search_finished(); wait_for_search_finished();
clear(); // Zero-init histories (based on std::array)
} }
@ -51,6 +52,20 @@ Thread::~Thread() {
} }
/// Thread::clear() reset histories, usually before a new game
void Thread::clear() {
counterMoves.fill(MOVE_NONE);
mainHistory.fill(0);
for (auto& to : contHistory)
for (auto& h : to)
h.fill(0);
contHistory[NO_PIECE][0].fill(Search::CounterMovePruneThreshold - 1);
}
/// Thread::start_searching() wakes up the thread that will start the search /// Thread::start_searching() wakes up the thread that will start the search
void Thread::start_searching() { void Thread::start_searching() {

View file

@ -52,6 +52,7 @@ public:
explicit Thread(size_t); explicit Thread(size_t);
virtual ~Thread(); virtual ~Thread();
virtual void search(); virtual void search();
void clear();
void idle_loop(); void idle_loop();
void start_searching(); void start_searching();
void wait_for_search_finished(); void wait_for_search_finished();