mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 06:17:49 +00:00
Use spinlock instead of mutex for Threads and SplitPoint
It is reported to be defenitly faster with increasing number of threads, we go from a +3.5% with 4 threads to a +15% with 16 threads. The only drawback is that now when testing with more threads than physical available cores, the speed slows down to a crawl. This is expected and was similar at what we had setting the old sleepingThreads to false. No functional change.
This commit is contained in:
+15
-15
@@ -39,6 +39,19 @@ const size_t MAX_THREADS = 128;
|
||||
const size_t MAX_SPLITPOINTS_PER_THREAD = 8;
|
||||
const size_t MAX_SLAVES_PER_SPLITPOINT = 4;
|
||||
|
||||
/// Spinlock class wraps low level atomic operations to provide spin lock functionality
|
||||
|
||||
class Spinlock {
|
||||
|
||||
std::atomic_flag lock;
|
||||
|
||||
public:
|
||||
Spinlock() { std::atomic_flag_clear(&lock); }
|
||||
void acquire() { while (lock.test_and_set(std::memory_order_acquire)) {} }
|
||||
void release() { lock.clear(std::memory_order_release); }
|
||||
};
|
||||
|
||||
|
||||
/// SplitPoint struct stores information shared by the threads searching in
|
||||
/// parallel below the same split point. It is populated at splitting time.
|
||||
|
||||
@@ -58,7 +71,7 @@ struct SplitPoint {
|
||||
SplitPoint* parentSplitPoint;
|
||||
|
||||
// Shared variable data
|
||||
std::mutex mutex;
|
||||
Spinlock spinlock;
|
||||
std::bitset<MAX_THREADS> slavesMask;
|
||||
volatile bool allSlavesSearching;
|
||||
volatile uint64_t nodes;
|
||||
@@ -70,19 +83,6 @@ struct SplitPoint {
|
||||
};
|
||||
|
||||
|
||||
/// Spinlock class wraps low level atomic operations to provide spin lock functionality
|
||||
|
||||
class Spinlock {
|
||||
|
||||
std::atomic_flag lock;
|
||||
|
||||
public:
|
||||
Spinlock() { std::atomic_flag_clear(&lock); }
|
||||
void acquire() { while (lock.test_and_set(std::memory_order_acquire)) {} }
|
||||
void release() { lock.clear(std::memory_order_release); }
|
||||
};
|
||||
|
||||
|
||||
/// ThreadBase struct is the base of the hierarchy from where we derive all the
|
||||
/// specialized thread classes.
|
||||
|
||||
@@ -162,7 +162,7 @@ struct ThreadPool : public std::vector<Thread*> {
|
||||
void start_thinking(const Position&, const Search::LimitsType&, Search::StateStackPtr&);
|
||||
|
||||
Depth minimumSplitDepth;
|
||||
std::mutex mutex;
|
||||
Spinlock spinlock;
|
||||
std::condition_variable sleepCondition;
|
||||
TimerThread* timer;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user