Allow a slave to 'late join' another splitpoint

Instead of waiting to be allocated, actively search
for another split point to join when finishes its
search. Also modify split conditions.

This patch has been tested with 7 threads SMP and
passed both STC:

LLR: 2.97 (-2.94,2.94) [-1.50,4.50]
Total: 2885 W: 519 L: 410 D: 1956

And a reduced-LTC at  25+0.05
LLR: 2.95 (-2.94,2.94) [0.00,6.00]
Total: 4401 W: 684 L: 566 D: 3151

Was then retested against regression in 3 thread case
at standard LTC of  60+0.05:

LLR: 2.96 (-2.94,2.94) [-4.00,0.00]
Total: 40809 W: 5446 L: 5406 D: 29957

bench: 8802105
This commit is contained in:
Joona Kiiski
2014-05-03 18:29:31 +01:00
committed by Marco Costalba
parent 8f6a494ad7
commit f6e98a924a
3 changed files with 53 additions and 6 deletions

View File

@@ -112,9 +112,9 @@ bool Thread::cutoff_occurred() const {
// which are busy searching the split point at the top of slave's split point
// stack (the "helpful master concept" in YBWC terminology).
bool Thread::available_to(const Thread* master) const {
bool Thread::available_to(const Thread* master, bool latejoin) const {
if (searching)
if (searching && !latejoin)
return false;
// Make a local copy to be sure it doesn't become zero under our feet while
@@ -239,7 +239,7 @@ void ThreadPool::read_uci_options() {
Thread* ThreadPool::available_slave(const Thread* master) const {
for (const_iterator it = begin(); it != end(); ++it)
if ((*it)->available_to(master))
if ((*it)->available_to(master, false))
return *it;
return NULL;
@@ -292,6 +292,7 @@ void Thread::split(Position& pos, const Stack* ss, Value alpha, Value beta, Valu
Threads.mutex.lock();
sp.mutex.lock();
sp.allowLatejoin = true; // Only set this under lock protection
++splitPointsSize;
activeSplitPoint = &sp;
activePosition = NULL;