10 #ifndef EIGEN_CXX11_THREADPOOL_NONBLOCKING_THREAD_POOL_H
11 #define EIGEN_CXX11_THREADPOOL_NONBLOCKING_THREAD_POOL_H
18 template <
typename Environment>
21 typedef typename Environment::EnvThread
Thread;
22 typedef typename Environment::Task
Task;
41 ThreadPoolTempl(
int num_threads,
bool allow_spinning, Environment env = Environment())
72 #ifndef EIGEN_THREAD_LOCAL
80 #ifndef EIGEN_THREAD_LOCAL
112 const auto& pair = partitions[
i];
113 unsigned start = pair.first,
end = pair.second;
125 if (pt->
pool ==
this) {
128 t =
q.PushFront(std::move(
t));
134 int num_queues = limit -
start;
135 int rnd =
Rand(&pt->
rand) % num_queues;
138 t =
q.PushBack(std::move(
t));
184 if (has_no_notify_task && !
t->f) *
t =
q.PopFront();
195 #ifdef EIGEN_THREAD_ENV_SUPPORTS_CANCELLATION
209 if (pt->
pool ==
this) {
248 for (
int i = 1;
i <=
N;
i++) {
328 #ifndef EIGEN_THREAD_LOCAL
339 #ifndef EIGEN_THREAD_LOCAL
340 std::unique_ptr<PerThread> new_pt(
new PerThread());
354 while (!
cancelled_.load(std::memory_order_relaxed)) {
379 for (
unsigned i = 0;
i <
size;
i++) {
386 if (victim >=
size) {
387 victim -=
static_cast<unsigned int>(
size);
400 unsigned start, limit;
468 unsigned victim =
r %
size;
469 for (
unsigned i = 0;
i <
size;
i++) {
474 if (victim >=
size) {
475 victim -=
static_cast<unsigned int>(
size);
523 return has_no_notify_task;
552 return std::hash<std::thread::id>()(std::this_thread::get_id());
556 #ifndef EIGEN_THREAD_LOCAL
562 return it->second.get();
565 EIGEN_THREAD_LOCAL
PerThread per_thread_;
574 *state = current * 6364136223846793005ULL + 0xda3e39cb94b95bdbULL;
576 return static_cast<unsigned>((current ^ (current >> 22)) >> (22 + (current >> 61)));
#define eigen_plain_assert(condition)
Definition: Assert.h:148
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_PREDICT_TRUE(x)
Definition: Macros.h:1180
#define EIGEN_OVERRIDE
Definition: Macros.h:1287
#define EIGEN_FINAL
Definition: Macros.h:1288
#define EIGEN_PREDICT_FALSE(x)
Definition: Macros.h:1179
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:966
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: EventCount.h:184
Definition: EventCount.h:52
void CommitWait(Waiter *w)
Definition: EventCount.h:82
void Notify(bool notifyAll)
Definition: EventCount.h:127
void CancelWait()
Definition: EventCount.h:110
void Prewait()
Definition: EventCount.h:71
The MaxSizeVector class.
Definition: MaxSizeVector.h:31
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void push_back(const T &t)
Definition: MaxSizeVector.h:78
Definition: ThreadPoolInterface.h:20
Definition: NonBlockingThreadPool.h:19
void AssertBounds(int start, int end)
Definition: NonBlockingThreadPool.h:235
const int num_threads_
Definition: NonBlockingThreadPool.h:316
static constexpr int kMaxThreads
Definition: NonBlockingThreadPool.h:225
unsigned NumBlockedThreads() const
Definition: NonBlockingThreadPool.h:334
void Cancel() EIGEN_OVERRIDE
Definition: NonBlockingThreadPool.h:190
Environment::Task Task
Definition: NonBlockingThreadPool.h:22
bool WaitForWork(EventCount::Waiter *waiter, Task *t)
Definition: NonBlockingThreadPool.h:413
std::atomic< unsigned > blocked_
Definition: NonBlockingThreadPool.h:324
int CurrentThreadId() const EIGEN_FINAL
Definition: NonBlockingThreadPool.h:207
const int spin_count_
Definition: NonBlockingThreadPool.h:318
void Schedule(std::function< void()> fn) EIGEN_OVERRIDE
Definition: NonBlockingThreadPool.h:120
EIGEN_MUTEX per_thread_map_mutex_
Definition: NonBlockingThreadPool.h:330
void ComputeCoprimes(int N, MaxSizeVector< unsigned > *coprimes)
Definition: NonBlockingThreadPool.h:247
~ThreadPoolTempl()
Definition: NonBlockingThreadPool.h:87
ThreadPoolTempl(int num_threads, bool allow_spinning, Environment env=Environment())
Definition: NonBlockingThreadPool.h:41
static constexpr int kSpinCount
Definition: NonBlockingThreadPool.h:268
static EIGEN_STRONG_INLINE unsigned Rand(uint64_t *state)
Definition: NonBlockingThreadPool.h:571
void ScheduleWithHint(std::function< void()> fn, int start, int limit) override
Definition: NonBlockingThreadPool.h:122
void SetStealPartition(size_t i, unsigned val)
Definition: NonBlockingThreadPool.h:241
int NonEmptyQueueIndex()
Definition: NonBlockingThreadPool.h:460
MaxSizeVector< ThreadData > thread_data_
Definition: NonBlockingThreadPool.h:319
std::unordered_map< uint64_t, std::unique_ptr< PerThread > > per_thread_map_
Definition: NonBlockingThreadPool.h:331
Environment::EnvThread Thread
Definition: NonBlockingThreadPool.h:21
const bool allow_spinning_
Definition: NonBlockingThreadPool.h:317
static constexpr int kMaxSpinningThreads
Definition: NonBlockingThreadPool.h:264
static constexpr int kMaxPartitionBits
Definition: NonBlockingThreadPool.h:224
unsigned NumActiveThreads() const
Definition: NonBlockingThreadPool.h:335
std::unique_ptr< Barrier > init_barrier_
Definition: NonBlockingThreadPool.h:329
Task LocalSteal()
Definition: NonBlockingThreadPool.h:394
std::atomic< uint64_t > spinning_state_
Definition: NonBlockingThreadPool.h:323
int NumThreads() const EIGEN_FINAL
Definition: NonBlockingThreadPool.h:205
void DecodePartition(unsigned val, unsigned *start, unsigned *limit)
Definition: NonBlockingThreadPool.h:229
static constexpr int kMinActiveThreadsToStartSpinning
Definition: NonBlockingThreadPool.h:278
EIGEN_STRONG_INLINE PerThread * GetPerThread()
Definition: NonBlockingThreadPool.h:555
unsigned GetStealPartition(int i)
Definition: NonBlockingThreadPool.h:245
ThreadPoolTempl(int num_threads, Environment env=Environment())
Definition: NonBlockingThreadPool.h:39
unsigned EncodePartition(unsigned start, unsigned limit)
Definition: NonBlockingThreadPool.h:227
MaxSizeVector< MaxSizeVector< unsigned > > all_coprimes_
Definition: NonBlockingThreadPool.h:320
std::atomic< bool > cancelled_
Definition: NonBlockingThreadPool.h:326
EventCount ec_
Definition: NonBlockingThreadPool.h:327
void SetStealPartitions(const std::vector< std::pair< unsigned, unsigned >> &partitions)
Definition: NonBlockingThreadPool.h:107
bool StartSpinning()
Definition: NonBlockingThreadPool.h:485
RunQueue< Task, 1024 > Queue
Definition: NonBlockingThreadPool.h:23
bool StopSpinning()
Definition: NonBlockingThreadPool.h:510
std::atomic< bool > done_
Definition: NonBlockingThreadPool.h:325
Task GlobalSteal()
Definition: NonBlockingThreadPool.h:408
unsigned global_steal_partition_
Definition: NonBlockingThreadPool.h:322
static EIGEN_STRONG_INLINE uint64_t GlobalThreadIdHash()
Definition: NonBlockingThreadPool.h:551
bool IsNotifyParkedThreadRequired()
Definition: NonBlockingThreadPool.h:532
MaxSizeVector< EventCount::Waiter > waiters_
Definition: NonBlockingThreadPool.h:321
void WorkerLoop(int thread_id)
Definition: NonBlockingThreadPool.h:338
Environment env_
Definition: NonBlockingThreadPool.h:315
void MaybeGetTask(Task *t)
Definition: NonBlockingThreadPool.h:157
Task Steal(unsigned start, unsigned limit)
Definition: NonBlockingThreadPool.h:368
@ N
Definition: constructor.cpp:22
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
const Scalar * a
Definition: level2_cplx_impl.h:32
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
std::uint64_t uint64_t
Definition: Meta.h:42
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
ThreadPoolTempl< StlThreadEnvironment > ThreadPool
Definition: NonBlockingThreadPool.h:580
val
Definition: calibrate.py:119
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243
t
Definition: plotPSD.py:36
Definition: NonBlockingThreadPool.h:25
ThreadPoolTempl * pool
Definition: NonBlockingThreadPool.h:27
int thread_id
Definition: NonBlockingThreadPool.h:29
uint64_t rand
Definition: NonBlockingThreadPool.h:28
constexpr PerThread()
Definition: NonBlockingThreadPool.h:26
Definition: NonBlockingThreadPool.h:280
static constexpr uint64_t kNumSpinningMask
Definition: NonBlockingThreadPool.h:291
static constexpr uint64_t kNumNoNotifyMask
Definition: NonBlockingThreadPool.h:292
static constexpr uint64_t kNumNoNotifyShift
Definition: NonBlockingThreadPool.h:293
uint64_t num_spinning
Definition: NonBlockingThreadPool.h:295
uint64_t Encode() const
Definition: NonBlockingThreadPool.h:309
uint64_t num_no_notification
Definition: NonBlockingThreadPool.h:296
static SpinningState Decode(uint64_t state)
Definition: NonBlockingThreadPool.h:300
Definition: NonBlockingThreadPool.h:32
std::unique_ptr< Thread > thread
Definition: NonBlockingThreadPool.h:34
std::atomic< unsigned > steal_partition
Definition: NonBlockingThreadPool.h:35
constexpr ThreadData()
Definition: NonBlockingThreadPool.h:33
Queue queue
Definition: NonBlockingThreadPool.h:36