mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-22 10:06:26 +08:00
Use atomics instead of volatile
Rely on well defined behaviour for message passing, instead of volatile. Three versions have been tested, to make sure this wouldn't cause a slowdown on any platform. v1: Sequentially consistent atomics No mesurable regression, despite the extra memory barriers on x86. Even with 15 threads and extreme time pressure, both acting as a magnifying glass: threads=15, tc=2+0.02 ELO: 2.59 +-3.4 (95%) LOS: 93.3% Total: 18132 W: 4113 L: 3978 D: 10041 threads=7, tc=2+0.02 ELO: -1.64 +-3.6 (95%) LOS: 18.8% Total: 16914 W: 4053 L: 4133 D: 8728 v2: Acquire/Release semantics This version generates no extra barriers for x86 (on the hot path). As expected, no regression either, under the same conditions: threads=15, tc=2+0.02 ELO: 2.85 +-3.3 (95%) LOS: 95.4% Total: 19661 W: 4640 L: 4479 D: 10542 threads=7, tc=2+0.02 ELO: 0.23 +-3.5 (95%) LOS: 55.1% Total: 18108 W: 4326 L: 4314 D: 9468 As suggested by Joona, another test at LTC: threads=15, tc=20+0.05 ELO: 0.64 +-2.6 (95%) LOS: 68.3% Total: 20000 W: 3053 L: 3016 D: 13931 v3: Final version: SeqCst/Relaxed threads=15, tc=10+0.1 ELO: 0.87 +-3.9 (95%) LOS: 67.1% Total: 9541 W: 1478 L: 1454 D: 6609 Resolves #474
This commit is contained in:
12
src/thread.h
12
src/thread.h
@@ -44,15 +44,16 @@ const size_t MAX_THREADS = 128;
|
||||
|
||||
struct ThreadBase : public std::thread {
|
||||
|
||||
ThreadBase() { exit = false; }
|
||||
virtual ~ThreadBase() = default;
|
||||
virtual void idle_loop() = 0;
|
||||
void notify_one();
|
||||
void wait(volatile const bool& b);
|
||||
void wait_while(volatile const bool& b);
|
||||
void wait(std::atomic<bool>& b);
|
||||
void wait_while(std::atomic<bool>& b);
|
||||
|
||||
Mutex mutex;
|
||||
ConditionVariable sleepCondition;
|
||||
volatile bool exit = false;
|
||||
std::atomic<bool> exit;
|
||||
};
|
||||
|
||||
|
||||
@@ -72,7 +73,7 @@ struct Thread : public ThreadBase {
|
||||
Endgames endgames;
|
||||
size_t idx, PVIdx;
|
||||
int maxPly;
|
||||
volatile bool searching;
|
||||
std::atomic<bool> searching;
|
||||
|
||||
Position rootPos;
|
||||
Search::RootMoveVector rootMoves;
|
||||
@@ -87,10 +88,11 @@ struct Thread : public ThreadBase {
|
||||
/// special threads: the main one and the recurring timer.
|
||||
|
||||
struct MainThread : public Thread {
|
||||
MainThread() { thinking = true; } // Avoid a race with start_thinking()
|
||||
virtual void idle_loop();
|
||||
void join();
|
||||
void think();
|
||||
volatile bool thinking = true; // Avoid a race with start_thinking()
|
||||
std::atomic<bool> thinking;
|
||||
};
|
||||
|
||||
struct TimerThread : public ThreadBase {
|
||||
|
||||
Reference in New Issue
Block a user