From dccaa145d2b57999aa3e368c7c9203731b4e9685 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Tue, 17 Feb 2015 10:10:58 +0100 Subject: [PATCH] Compute SplitPoint::spLevel on the fly And retire a redundant field. This is important also from a concept point of view becuase we want to keep SMP structures as simple as possible with the only strictly necessary data. Verified with dbg_hit_on(sp->spLevel != level) that the values are 100% the same out of more 50K samples. No functional change. --- src/search.cpp | 9 +++++++-- src/thread.cpp | 3 +-- src/thread.h | 1 - 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 29820a1f..dcb89d75 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1604,7 +1604,12 @@ void Thread::idle_loop() { && sp->slavesCount < MAX_SLAVES_PER_SPLITPOINT && available_to(Threads[i])) { - int score = sp->spLevel * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1; + // Compute the recursive split points chain size + int level = -1; + for (SplitPoint* spp = Threads[i]->activeSplitPoint; spp; spp = spp->parentSplitPoint) + level++; + + int score = level * 256 * 256 + sp->slavesCount * 256 - sp->depth * 1; if (score < bestScore) { @@ -1618,7 +1623,7 @@ void Thread::idle_loop() { if (bestSp) { sp = bestSp; - + // Recheck the conditions under lock protection Threads.mutex.lock(); sp->mutex.lock(); diff --git a/src/thread.cpp b/src/thread.cpp index 02cb4562..5c013c6a 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -154,7 +154,6 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes sp.masterThread = this; sp.parentSplitPoint = activeSplitPoint; - sp.spLevel = activeSplitPoint ? activeSplitPoint->spLevel + 1 : 0; sp.slavesMask = 0, sp.slavesMask.set(idx); sp.slavesCount = 1; sp.depth = depth; @@ -184,7 +183,7 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes Thread* slave; - while ( sp.slavesCount < MAX_SLAVES_PER_SPLITPOINT + while ( sp.slavesCount < MAX_SLAVES_PER_SPLITPOINT && (slave = Threads.available_slave(this)) != NULL) { sp.slavesMask.set(slave->idx); diff --git a/src/thread.h b/src/thread.h index 949f87ad..0265ee67 100644 --- a/src/thread.h +++ b/src/thread.h @@ -73,7 +73,6 @@ struct SplitPoint { const Position* pos; Search::Stack* ss; Thread* masterThread; - int spLevel; Depth depth; Value beta; int nodeType; -- 2.39.2