}
-// ThreadBase::notify_one() wakes up the thread when there is some work to do
+// notify_one() wakes up the thread when there is some work to do
void ThreadBase::notify_one() {
}
-// ThreadBase::wait_for() set the thread to sleep until condition 'b' turns true
+// wait_for() set the thread to sleep until condition 'b' turns true
void ThreadBase::wait_for(volatile const bool& b) {
maxPly = splitPointsSize = 0;
activeSplitPoint = NULL;
activePosition = NULL;
- idx = Threads.size();
+ idx = Threads.size(); // Starts from 0
}
-// Thread::cutoff_occurred() checks whether a beta cutoff has occurred in the
+// cutoff_occurred() checks whether a beta cutoff has occurred in the
// current active split point, or in some ancestor of the split point.
bool Thread::cutoff_occurred() const {
void ThreadPool::read_uci_options() {
- maxThreadsPerSplitPoint = Options["Max Threads per Split Point"];
- minimumSplitDepth = Options["Min Split Depth"] * ONE_PLY;
- size_t requested = Options["Threads"];
+ minimumSplitDepth = Options["Min Split Depth"] * ONE_PLY;
+ size_t requested = Options["Threads"];
assert(requested > 0);
- // Value 0 has a special meaning: We determine the optimal minimum split depth
- // automatically. Anyhow the minimumSplitDepth should never be under 4 plies.
+ // If zero (default) then set best minimum split depth automatically
if (!minimumSplitDepth)
- minimumSplitDepth = (requested < 8 ? 4 : 7) * ONE_PLY;
- else
- minimumSplitDepth = std::max(4 * ONE_PLY, minimumSplitDepth);
+ minimumSplitDepth = requested < 8 ? 4 * ONE_PLY : 7 * ONE_PLY;
while (size() < requested)
push_back(new_thread<Thread>());
}
-// slave_available() tries to find an idle thread which is available as a slave
+// available_slave() tries to find an idle thread which is available as a slave
// for the thread 'master'.
Thread* ThreadPool::available_slave(const Thread* master) const {
activeSplitPoint = &sp;
activePosition = NULL;
- size_t slavesCnt = 1; // This thread is always included
+ int slavesCnt = 1; // This thread is always included
Thread* slave;
- while ( (slave = Threads.available_slave(this)) != NULL
- && ++slavesCnt <= Threads.maxThreadsPerSplitPoint && !Fake)
+ while (!Fake && (slave = Threads.available_slave(this)) != NULL)
{
+ ++slavesCnt;
sp.slavesMask |= 1ULL << slave->idx;
slave->activeSplitPoint = &sp;
slave->searching = true; // Slave leaves idle_loop()