10 #ifndef EIGEN_CXX11_THREADPOOL_RUNQUEUE_H
11 #define EIGEN_CXX11_THREADPOOL_RUNQUEUE_H
40 template <
typename Work,
unsigned kSize>
48 for (
unsigned i = 0;
i < kSize;
i++)
array_[
i].state.store(
kEmpty, std::memory_order_relaxed);
56 unsigned front =
front_.load(std::memory_order_relaxed);
58 uint8_t s =
e->state.load(std::memory_order_relaxed);
59 if (
s !=
kEmpty || !
e->state.compare_exchange_strong(
s,
kBusy, std::memory_order_acquire))
return w;
60 front_.store(front + 1 + (kSize << 1), std::memory_order_relaxed);
62 e->state.store(
kReady, std::memory_order_release);
69 unsigned front =
front_.load(std::memory_order_relaxed);
71 uint8_t s =
e->state.load(std::memory_order_relaxed);
72 if (
s !=
kReady || !
e->state.compare_exchange_strong(
s,
kBusy, std::memory_order_acquire))
return Work();
73 Work
w = std::move(
e->w);
74 e->state.store(
kEmpty, std::memory_order_release);
76 front_.store(front, std::memory_order_relaxed);
83 EIGEN_MUTEX_LOCK lock(
mutex_);
84 unsigned back =
back_.load(std::memory_order_relaxed);
86 uint8_t s =
e->state.load(std::memory_order_relaxed);
87 if (
s !=
kEmpty || !
e->state.compare_exchange_strong(
s,
kBusy, std::memory_order_acquire))
return w;
89 back_.store(back, std::memory_order_relaxed);
91 e->state.store(
kReady, std::memory_order_release);
97 if (
Empty())
return Work();
98 EIGEN_MUTEX_LOCK lock(
mutex_);
99 unsigned back =
back_.load(std::memory_order_relaxed);
101 uint8_t s =
e->state.load(std::memory_order_relaxed);
102 if (
s !=
kReady || !
e->state.compare_exchange_strong(
s,
kBusy, std::memory_order_acquire))
return Work();
103 Work
w = std::move(
e->w);
104 e->state.store(
kEmpty, std::memory_order_release);
105 back_.store(back + 1 + (kSize << 1), std::memory_order_relaxed);
112 if (
Empty())
return 0;
113 EIGEN_MUTEX_LOCK lock(
mutex_);
114 unsigned back =
back_.load(std::memory_order_relaxed);
117 if (
size > 1) mid = back + (
size - 1) / 2;
120 for (;
static_cast<int>(mid - back) >= 0; mid--) {
122 uint8_t s =
e->state.load(std::memory_order_relaxed);
124 if (
s !=
kReady || !
e->state.compare_exchange_strong(
s,
kBusy, std::memory_order_acquire))
continue;
131 result->push_back(std::move(
e->w));
132 e->state.store(
kEmpty, std::memory_order_release);
135 if (
n != 0)
back_.store(
start + 1 + (kSize << 1), std::memory_order_relaxed);
141 unsigned Size()
const {
return SizeOrNotEmpty<true>(); }
145 bool Empty()
const {
return SizeOrNotEmpty<false>() == 0; }
155 static const unsigned kMask = kSize - 1;
156 static const unsigned kMask2 = (kSize << 1) - 1;
185 template <
bool NeedSizeEstimate>
189 unsigned front =
front_.load(std::memory_order_acquire);
192 unsigned back =
back_.load(std::memory_order_acquire);
193 unsigned front1 =
front_.load(std::memory_order_relaxed);
194 if (front != front1) {
196 std::atomic_thread_fence(std::memory_order_acquire);
199 if (NeedSizeEstimate) {
203 unsigned maybe_zero = ((front ^ back) &
kMask2);
221 return static_cast<unsigned>(
size);
#define eigen_plain_assert(condition)
Definition: Assert.h:148
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
#define EIGEN_ALWAYS_INLINE
Definition: Macros.h:845
#define EIGEN_PREDICT_FALSE(x)
Definition: Macros.h:1179
#define eigen_assert(x)
Definition: Macros.h:910
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Definition: RunQueue.h:41
void operator=(const RunQueue &)=delete
EIGEN_ALIGN_TO_AVOID_FALSE_SHARING std::atomic< unsigned > back_
Definition: RunQueue.h:177
Work PushBack(Work w)
Definition: RunQueue.h:82
EIGEN_ALIGN_TO_AVOID_FALSE_SHARING std::atomic< unsigned > front_
Definition: RunQueue.h:176
unsigned SizeOrNotEmpty() const
Definition: RunQueue.h:186
RunQueue(const RunQueue &)=delete
unsigned PopBackHalf(std::vector< Work > *result)
Definition: RunQueue.h:111
Work PopBack()
Definition: RunQueue.h:96
EIGEN_MUTEX mutex_
Definition: RunQueue.h:178
Work PopFront()
Definition: RunQueue.h:68
EIGEN_ALWAYS_INLINE unsigned CalculateSize(unsigned front, unsigned back) const
Definition: RunQueue.h:212
EIGEN_ALIGN_TO_AVOID_FALSE_SHARING Elem array_[kSize]
Definition: RunQueue.h:180
void Flush()
Definition: RunQueue.h:148
Work PushFront(Work w)
Definition: RunQueue.h:55
unsigned Size() const
Definition: RunQueue.h:141
static const unsigned kMask2
Definition: RunQueue.h:156
~RunQueue()
Definition: RunQueue.h:51
bool Empty() const
Definition: RunQueue.h:145
State
Definition: RunQueue.h:158
@ kReady
Definition: RunQueue.h:161
@ kEmpty
Definition: RunQueue.h:159
@ kBusy
Definition: RunQueue.h:160
RunQueue()
Definition: RunQueue.h:43
static const unsigned kMask
Definition: RunQueue.h:155
RealScalar s
Definition: level1_cplx_impl.h:130
std::uint8_t uint8_t
Definition: Meta.h:36
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243
Definition: RunQueue.h:164
std::atomic< uint8_t > state
Definition: RunQueue.h:165
Work w
Definition: RunQueue.h:166