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:
Marco Costalba
2015-02-22 14:59:55 +01:00
parent 775f8239d3
commit 38112060dc
3 changed files with 41 additions and 41 deletions
+15 -15
View File
@@ -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;
};