Allocation of pawn and material hash tables should
be strictly bounded to the change of the number of
activeThreads, so move the code inside set_size().
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
read_evaluation_uci_options(pos.side_to_move());
Threads.read_uci_options();
read_evaluation_uci_options(pos.side_to_move());
Threads.read_uci_options();
- // Allocate pawn and material hash tables if number of active threads
- // increased and set a new TT size if changed.
- Threads.init_hash_tables();
+ // Set a new TT size if changed
TT.set_size(Options["Hash"].value<int>());
if (Options["Clear Hash"].value<bool>())
TT.set_size(Options["Hash"].value<int>());
if (Options["Clear Hash"].value<bool>())
namespace { extern "C" {
// start_routine() is the C function which is called when a new thread
namespace { extern "C" {
// start_routine() is the C function which is called when a new thread
- // is launched. It simply calls idle_loop() with the supplied threadID.
+ // is launched. It simply calls idle_loop() of the supplied threadID.
// There are two versions of this function; one for POSIX threads and
// one for Windows threads.
// There are two versions of this function; one for POSIX threads and
// one for Windows threads.
activeThreads = cnt;
for (int i = 0; i < MAX_THREADS; i++)
activeThreads = cnt;
for (int i = 0; i < MAX_THREADS; i++)
- threads[i].do_sleep = !(i < activeThreads);
+ if (i < activeThreads)
+ {
+ // Dynamically allocate pawn and material hash tables according to the
+ // number of active threads. This avoids preallocating memory for all
+ // possible threads if only few are used as, for instance, on mobile
+ // devices where memory is scarce and allocating for MAX_THREADS could
+ // even result in a crash.
+ threads[i].pawnTable.init();
+ threads[i].materialTable.init();
+
+ threads[i].do_sleep = false;
+ }
+ else
+ threads[i].do_sleep = true;
threads[0].state = Thread::SEARCHING;
threads[0].threadID = 0;
threads[0].state = Thread::SEARCHING;
threads[0].threadID = 0;
- // Allocate pawn and material hash tables for main thread
- init_hash_tables();
-
// Initialize threads lock, used when allocating slaves during splitting
lock_init(&threadsLock);
// Initialize threads lock, used when allocating slaves during splitting
lock_init(&threadsLock);
-// init_hash_tables() dynamically allocates pawn and material hash tables
-// according to the number of active threads. This avoids preallocating
-// memory for all possible threads if only few are used as, for instance,
-// on mobile devices where memory is scarce and allocating for MAX_THREADS
-// threads could even result in a crash.
-
-void ThreadsManager::init_hash_tables() {
-
- for (int i = 0; i < activeThreads; i++)
- {
- threads[i].pawnTable.init();
- threads[i].materialTable.init();
- }
-}
-
-
// available_slave_exists() tries to find an idle thread which is available as
// a slave for the thread with threadID "master".
// available_slave_exists() tries to find an idle thread which is available as
// a slave for the thread with threadID "master".
Thread& operator[](int threadID) { return threads[threadID]; }
void init();
void exit();
Thread& operator[](int threadID) { return threads[threadID]; }
void init();
void exit();
- void init_hash_tables();
bool use_sleeping_threads() const { return useSleepingThreads; }
int min_split_depth() const { return minimumSplitDepth; }
bool use_sleeping_threads() const { return useSleepingThreads; }
int min_split_depth() const { return minimumSplitDepth; }