Skip to content

Commit

Permalink
Fix a data race for NNUE
Browse files Browse the repository at this point in the history
the stateInfo at the rootPos is no longer read-only, as the NNUE accumulator is part of it.
Threads can thus not share this object and need their own copy.

tested for no regression
https://tests.stockfishchess.org/tests/view/5f3022239081672066536bce
LLR: 2.96 (-2.94,2.94) {-1.50,0.50}
Total: 52800 W: 6843 L: 6802 D: 39155
Ptnml(0-2): 336, 4646, 16399, 4679, 340

closes #2957

fixes #2933

No functional change
  • Loading branch information
vondele committed Aug 9, 2020
1 parent a6e8929 commit 27b593a
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/Makefile
Expand Up @@ -354,8 +354,8 @@ endif
endif

ifeq ($(KERNEL),Darwin)
CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.13
LDFLAGS += -arch $(arch) -mmacosx-version-min=10.13
CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.14
LDFLAGS += -arch $(arch) -mmacosx-version-min=10.14
endif

### Travis CI script uses COMPILER to overwrite CXX
Expand Down
13 changes: 5 additions & 8 deletions src/thread.cpp
Expand Up @@ -204,21 +204,18 @@ void ThreadPool::start_thinking(Position& pos, StateListPtr& states,

// We use Position::set() to set root position across threads. But there are
// some StateInfo fields (previous, pliesFromNull, capturedPiece) that cannot
// be deduced from a fen string, so set() clears them and to not lose the info
// we need to backup and later restore setupStates->back(). Note that setupStates
// is shared by threads but is accessed in read-only mode.
StateInfo tmp = setupStates->back();

// be deduced from a fen string, so set() clears them and they are set from
// setupStates->back() later. The rootState is per thread, earlier states are shared
// since they are read-only.
for (Thread* th : *this)
{
th->nodes = th->tbHits = th->nmpMinPly = th->bestMoveChanges = 0;
th->rootDepth = th->completedDepth = 0;
th->rootMoves = rootMoves;
th->rootPos.set(pos.fen(), pos.is_chess960(), &setupStates->back(), th);
th->rootPos.set(pos.fen(), pos.is_chess960(), &th->rootState, th);
th->rootState = setupStates->back();
}

setupStates->back() = tmp;

main()->start_searching();
}

Expand Down
1 change: 1 addition & 0 deletions src/thread.h
Expand Up @@ -65,6 +65,7 @@ class Thread {
std::atomic<uint64_t> nodes, tbHits, bestMoveChanges;

Position rootPos;
StateInfo rootState;
Search::RootMoves rootMoves;
Depth rootDepth, completedDepth;
CounterMoveHistory counterMoves;
Expand Down

0 comments on commit 27b593a

Please sign in to comment.