![]() |
|
#include <NonBlockingThreadPool.h>
Classes | |
struct | PerThread |
struct | SpinningState |
struct | ThreadData |
Public Types | |
typedef Environment::EnvThread | Thread |
typedef Environment::Task | Task |
typedef RunQueue< Task, 1024 > | Queue |
Public Member Functions | |
ThreadPoolTempl (int num_threads, Environment env=Environment()) | |
ThreadPoolTempl (int num_threads, bool allow_spinning, Environment env=Environment()) | |
~ThreadPoolTempl () | |
void | SetStealPartitions (const std::vector< std::pair< unsigned, unsigned >> &partitions) |
void | Schedule (std::function< void()> fn) EIGEN_OVERRIDE |
void | ScheduleWithHint (std::function< void()> fn, int start, int limit) override |
void | MaybeGetTask (Task *t) |
void | Cancel () EIGEN_OVERRIDE |
int | NumThreads () const EIGEN_FINAL |
int | CurrentThreadId () const EIGEN_FINAL |
![]() | |
virtual | ~ThreadPoolInterface () |
Private Member Functions | |
unsigned | EncodePartition (unsigned start, unsigned limit) |
void | DecodePartition (unsigned val, unsigned *start, unsigned *limit) |
void | AssertBounds (int start, int end) |
void | SetStealPartition (size_t i, unsigned val) |
unsigned | GetStealPartition (int i) |
void | ComputeCoprimes (int N, MaxSizeVector< unsigned > *coprimes) |
unsigned | NumBlockedThreads () const |
unsigned | NumActiveThreads () const |
void | WorkerLoop (int thread_id) |
Task | Steal (unsigned start, unsigned limit) |
Task | LocalSteal () |
Task | GlobalSteal () |
bool | WaitForWork (EventCount::Waiter *waiter, Task *t) |
int | NonEmptyQueueIndex () |
bool | StartSpinning () |
bool | StopSpinning () |
bool | IsNotifyParkedThreadRequired () |
EIGEN_STRONG_INLINE PerThread * | GetPerThread () |
Static Private Member Functions | |
static EIGEN_STRONG_INLINE uint64_t | GlobalThreadIdHash () |
static EIGEN_STRONG_INLINE unsigned | Rand (uint64_t *state) |
Private Attributes | |
Environment | env_ |
const int | num_threads_ |
const bool | allow_spinning_ |
const int | spin_count_ |
MaxSizeVector< ThreadData > | thread_data_ |
MaxSizeVector< MaxSizeVector< unsigned > > | all_coprimes_ |
MaxSizeVector< EventCount::Waiter > | waiters_ |
unsigned | global_steal_partition_ |
std::atomic< uint64_t > | spinning_state_ |
std::atomic< unsigned > | blocked_ |
std::atomic< bool > | done_ |
std::atomic< bool > | cancelled_ |
EventCount | ec_ |
std::unique_ptr< Barrier > | init_barrier_ |
EIGEN_MUTEX | per_thread_map_mutex_ |
std::unordered_map< uint64_t, std::unique_ptr< PerThread > > | per_thread_map_ |
Static Private Attributes | |
static constexpr int | kMaxPartitionBits = 16 |
static constexpr int | kMaxThreads = 1 << kMaxPartitionBits |
static constexpr int | kMaxSpinningThreads = 1 |
static constexpr int | kSpinCount = 5000 |
static constexpr int | kMinActiveThreadsToStartSpinning = 4 |
typedef RunQueue<Task, 1024> Eigen::ThreadPoolTempl< Environment >::Queue |
typedef Environment::Task Eigen::ThreadPoolTempl< Environment >::Task |
typedef Environment::EnvThread Eigen::ThreadPoolTempl< Environment >::Thread |
|
inline |
|
inline |
References Eigen::ThreadPoolTempl< Environment >::all_coprimes_, Eigen::ThreadPoolTempl< Environment >::ComputeCoprimes(), eigen_plain_assert, Eigen::ThreadPoolTempl< Environment >::EncodePartition(), Eigen::ThreadPoolTempl< Environment >::env_, i, Eigen::ThreadPoolTempl< Environment >::init_barrier_, Eigen::ThreadPoolTempl< Environment >::kMaxThreads, Eigen::ThreadPoolTempl< Environment >::num_threads_, Eigen::ThreadPoolTempl< Environment >::SetStealPartition(), Eigen::ThreadPoolTempl< Environment >::thread_data_, and Eigen::ThreadPoolTempl< Environment >::waiters_.
|
inline |
|
inlineprivate |
References eigen_plain_assert, Eigen::placeholders::end, Eigen::ThreadPoolTempl< Environment >::num_threads_, and oomph::CumulativeTimings::start().
Referenced by Eigen::ThreadPoolTempl< Environment >::LocalSteal(), and Eigen::ThreadPoolTempl< Environment >::SetStealPartitions().
|
inlinevirtual |
Reimplemented from Eigen::ThreadPoolInterface.
References Eigen::ThreadPoolTempl< Environment >::cancelled_, Eigen::ThreadPoolTempl< Environment >::done_, Eigen::ThreadPoolTempl< Environment >::ec_, i, Eigen::EventCount::Notify(), and Eigen::ThreadPoolTempl< Environment >::thread_data_.
Referenced by test_cancel().
|
inlineprivate |
References a, b, i, N, Eigen::MaxSizeVector< T >::push_back(), and tmp.
Referenced by Eigen::ThreadPoolTempl< Environment >::ThreadPoolTempl().
|
inlinevirtual |
Implements Eigen::ThreadPoolInterface.
References Eigen::ThreadPoolTempl< Environment >::GetPerThread(), Eigen::ThreadPoolTempl< Environment >::PerThread::pool, and Eigen::ThreadPoolTempl< Environment >::PerThread::thread_id.
Referenced by test_parallelism(), and test_pool_partitions().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::kMaxPartitionBits, Eigen::ThreadPoolTempl< Environment >::kMaxThreads, oomph::CumulativeTimings::start(), and calibrate::val.
Referenced by Eigen::ThreadPoolTempl< Environment >::LocalSteal().
|
inlineprivate |
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::GlobalThreadIdHash(), and Eigen::ThreadPoolTempl< Environment >::per_thread_map_.
Referenced by Eigen::ThreadPoolTempl< Environment >::CurrentThreadId(), Eigen::ThreadPoolTempl< Environment >::LocalSteal(), Eigen::ThreadPoolTempl< Environment >::MaybeGetTask(), Eigen::ThreadPoolTempl< Environment >::NonEmptyQueueIndex(), Eigen::ThreadPoolTempl< Environment >::ScheduleWithHint(), Eigen::ThreadPoolTempl< Environment >::Steal(), and Eigen::ThreadPoolTempl< Environment >::WorkerLoop().
|
inlineprivate |
References i, and Eigen::ThreadPoolTempl< Environment >::thread_data_.
Referenced by Eigen::ThreadPoolTempl< Environment >::LocalSteal().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::num_threads_, and Eigen::ThreadPoolTempl< Environment >::Steal().
Referenced by Eigen::ThreadPoolTempl< Environment >::MaybeGetTask().
|
inlinestaticprivate |
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::SpinningState::Decode(), Eigen::ThreadPoolTempl< Environment >::SpinningState::Encode(), Eigen::ThreadPoolTempl< Environment >::SpinningState::num_no_notification, Eigen::ThreadPoolTempl< Environment >::SpinningState::num_spinning, and Eigen::ThreadPoolTempl< Environment >::spinning_state_.
Referenced by Eigen::ThreadPoolTempl< Environment >::ScheduleWithHint().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::AssertBounds(), Eigen::ThreadPoolTempl< Environment >::DecodePartition(), Eigen::ThreadPoolTempl< Environment >::GetPerThread(), Eigen::ThreadPoolTempl< Environment >::GetStealPartition(), Eigen::ThreadPoolTempl< Environment >::global_steal_partition_, oomph::CumulativeTimings::start(), Eigen::ThreadPoolTempl< Environment >::Steal(), and Eigen::ThreadPoolTempl< Environment >::PerThread::thread_id.
Referenced by Eigen::ThreadPoolTempl< Environment >::MaybeGetTask().
|
inline |
References Eigen::ThreadPoolTempl< Environment >::allow_spinning_, EIGEN_PREDICT_FALSE, Eigen::ThreadPoolTempl< Environment >::GetPerThread(), Eigen::ThreadPoolTempl< Environment >::GlobalSteal(), i, Eigen::ThreadPoolTempl< Environment >::LocalSteal(), Eigen::ThreadPoolTempl< Environment >::num_threads_, Eigen::numext::q, Eigen::ThreadPoolTempl< Environment >::spin_count_, Eigen::ThreadPoolTempl< Environment >::StartSpinning(), Eigen::ThreadPoolTempl< Environment >::StopSpinning(), plotPSD::t, Eigen::ThreadPoolTempl< Environment >::thread_data_, and Eigen::ThreadPoolTempl< Environment >::PerThread::thread_id.
Referenced by Eigen::ForkJoinScheduler::ForkJoin(), and Eigen::ThreadPoolTempl< Environment >::WorkerLoop().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::all_coprimes_, Eigen::ThreadPoolTempl< Environment >::GetPerThread(), i, UniformPSDSelfTest::r, Eigen::ThreadPoolTempl< Environment >::PerThread::rand, Eigen::ThreadPoolTempl< Environment >::Rand(), size, and Eigen::ThreadPoolTempl< Environment >::thread_data_.
Referenced by Eigen::ThreadPoolTempl< Environment >::WaitForWork().
|
inlineprivate |
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::blocked_.
|
inlinevirtual |
Implements Eigen::ThreadPoolInterface.
References Eigen::ThreadPoolTempl< Environment >::num_threads_.
Referenced by Eigen::CoreThreadPoolDevice::calculateLevels(), and test_parallelism().
|
inlinestaticprivate |
|
inlinevirtual |
Implements Eigen::ThreadPoolInterface.
References Eigen::ThreadPoolTempl< Environment >::num_threads_, and Eigen::ThreadPoolTempl< Environment >::ScheduleWithHint().
Referenced by Eigen::ForkJoinScheduler::ForkJoin(), Eigen::ForkJoinScheduler::ParallelFor(), Eigen::CoreThreadPoolDevice::parallelForImpl(), test_async_parallel_for(), test_cancel(), test_large_number_of_tasks_no_spill(), test_large_number_of_tasks_with_spill(), test_notification_multiple(), test_notification_single(), test_parallelism(), test_pool_partitions(), and test_simple_thread_local().
|
inlineoverridevirtual |
Reimplemented from Eigen::ThreadPoolInterface.
References Eigen::ThreadPoolTempl< Environment >::ec_, eigen_plain_assert, Eigen::ThreadPoolTempl< Environment >::env_, Eigen::ThreadPoolTempl< Environment >::GetPerThread(), Eigen::ThreadPoolTempl< Environment >::IsNotifyParkedThreadRequired(), Eigen::EventCount::Notify(), Eigen::ThreadPoolTempl< Environment >::num_threads_, Eigen::ThreadPoolTempl< Environment >::PerThread::pool, Eigen::numext::q, Eigen::ThreadPoolTempl< Environment >::PerThread::rand, Eigen::ThreadPoolTempl< Environment >::Rand(), oomph::CumulativeTimings::start(), plotPSD::t, Eigen::ThreadPoolTempl< Environment >::thread_data_, and Eigen::ThreadPoolTempl< Environment >::PerThread::thread_id.
Referenced by Eigen::ThreadPoolTempl< Environment >::Schedule(), and test_pool_partitions().
|
inlineprivate |
|
inline |
References Eigen::ThreadPoolTempl< Environment >::AssertBounds(), eigen_plain_assert, Eigen::ThreadPoolTempl< Environment >::EncodePartition(), Eigen::placeholders::end, i, Eigen::ThreadPoolTempl< Environment >::num_threads_, Eigen::ThreadPoolTempl< Environment >::SetStealPartition(), oomph::CumulativeTimings::start(), and calibrate::val.
Referenced by test_pool_partitions().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::SpinningState::Decode(), Eigen::ThreadPoolTempl< Environment >::SpinningState::Encode(), Eigen::ThreadPoolTempl< Environment >::kMaxSpinningThreads, Eigen::ThreadPoolTempl< Environment >::kMinActiveThreadsToStartSpinning, Eigen::ThreadPoolTempl< Environment >::SpinningState::num_no_notification, Eigen::ThreadPoolTempl< Environment >::SpinningState::num_spinning, Eigen::ThreadPoolTempl< Environment >::NumActiveThreads(), and Eigen::ThreadPoolTempl< Environment >::spinning_state_.
Referenced by Eigen::ThreadPoolTempl< Environment >::MaybeGetTask().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::all_coprimes_, eigen_plain_assert, Eigen::ThreadPoolTempl< Environment >::GetPerThread(), i, UniformPSDSelfTest::r, Eigen::ThreadPoolTempl< Environment >::PerThread::rand, Eigen::ThreadPoolTempl< Environment >::Rand(), size, oomph::CumulativeTimings::start(), plotPSD::t, and Eigen::ThreadPoolTempl< Environment >::thread_data_.
Referenced by Eigen::ThreadPoolTempl< Environment >::GlobalSteal(), and Eigen::ThreadPoolTempl< Environment >::LocalSteal().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::SpinningState::Decode(), Eigen::ThreadPoolTempl< Environment >::SpinningState::Encode(), Eigen::ThreadPoolTempl< Environment >::SpinningState::num_no_notification, Eigen::ThreadPoolTempl< Environment >::SpinningState::num_spinning, and Eigen::ThreadPoolTempl< Environment >::spinning_state_.
Referenced by Eigen::ThreadPoolTempl< Environment >::MaybeGetTask().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::blocked_, Eigen::ThreadPoolTempl< Environment >::cancelled_, Eigen::EventCount::CancelWait(), Eigen::EventCount::CommitWait(), Eigen::ThreadPoolTempl< Environment >::done_, Eigen::ThreadPoolTempl< Environment >::ec_, eigen_plain_assert, Eigen::ThreadPoolTempl< Environment >::NonEmptyQueueIndex(), Eigen::EventCount::Notify(), Eigen::ThreadPoolTempl< Environment >::num_threads_, Eigen::EventCount::Prewait(), plotPSD::t, and Eigen::ThreadPoolTempl< Environment >::thread_data_.
Referenced by Eigen::ThreadPoolTempl< Environment >::WorkerLoop().
|
inlineprivate |
References Eigen::ThreadPoolTempl< Environment >::cancelled_, eigen_plain_assert, EIGEN_PREDICT_FALSE, EIGEN_PREDICT_TRUE, EIGEN_UNUSED_VARIABLE, Eigen::ThreadPoolTempl< Environment >::env_, Eigen::ThreadPoolTempl< Environment >::GetPerThread(), Eigen::ThreadPoolTempl< Environment >::GlobalThreadIdHash(), Eigen::ThreadPoolTempl< Environment >::init_barrier_, Eigen::ThreadPoolTempl< Environment >::MaybeGetTask(), Eigen::ThreadPoolTempl< Environment >::per_thread_map_, Eigen::ThreadPoolTempl< Environment >::per_thread_map_mutex_, Eigen::ThreadPoolTempl< Environment >::PerThread::pool, Eigen::ThreadPoolTempl< Environment >::PerThread::rand, plotPSD::t, Eigen::ThreadPoolTempl< Environment >::PerThread::thread_id, Eigen::ThreadPoolTempl< Environment >::waiters_, and Eigen::ThreadPoolTempl< Environment >::WaitForWork().
|
private |
|
private |
Referenced by Eigen::ThreadPoolTempl< Environment >::MaybeGetTask().
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
Referenced by Eigen::ThreadPoolTempl< Environment >::LocalSteal().
|
private |
|
staticconstexprprivate |
|
staticconstexprprivate |
Referenced by Eigen::ThreadPoolTempl< Environment >::StartSpinning().
|
staticconstexprprivate |
|
staticconstexprprivate |
Referenced by Eigen::ThreadPoolTempl< Environment >::StartSpinning().
|
staticconstexprprivate |
|
private |
Referenced by Eigen::ThreadPoolTempl< Environment >::AssertBounds(), Eigen::ThreadPoolTempl< Environment >::GlobalSteal(), Eigen::ThreadPoolTempl< Environment >::MaybeGetTask(), Eigen::ThreadPoolTempl< Environment >::NumActiveThreads(), Eigen::ThreadPoolTempl< Environment >::NumThreads(), Eigen::ThreadPoolTempl< Environment >::Schedule(), Eigen::ThreadPoolTempl< Environment >::ScheduleWithHint(), Eigen::ThreadPoolTempl< Environment >::SetStealPartitions(), Eigen::ThreadPoolTempl< Environment >::ThreadPoolTempl(), and Eigen::ThreadPoolTempl< Environment >::WaitForWork().
|
private |
|
private |
Referenced by Eigen::ThreadPoolTempl< Environment >::WorkerLoop().
|
private |
Referenced by Eigen::ThreadPoolTempl< Environment >::MaybeGetTask().
|
private |
|
private |
Referenced by Eigen::ThreadPoolTempl< Environment >::Cancel(), Eigen::ThreadPoolTempl< Environment >::GetStealPartition(), Eigen::ThreadPoolTempl< Environment >::MaybeGetTask(), Eigen::ThreadPoolTempl< Environment >::NonEmptyQueueIndex(), Eigen::ThreadPoolTempl< Environment >::ScheduleWithHint(), Eigen::ThreadPoolTempl< Environment >::SetStealPartition(), Eigen::ThreadPoolTempl< Environment >::Steal(), Eigen::ThreadPoolTempl< Environment >::ThreadPoolTempl(), Eigen::ThreadPoolTempl< Environment >::WaitForWork(), and Eigen::ThreadPoolTempl< Environment >::~ThreadPoolTempl().
|
private |