231 // The original paper is:
232 //
233 // Arora, N. S., Blumofe, R. D., and Plaxton, C. G.
234 // Thread scheduling for multiprogrammed multiprocessors.
235 // Theory of Computing Systems 34, 2 (2001), 115-144.
236 //
237 // The following paper provides an correctness proof and an
238 // implementation for weakly ordered memory models including (pseudo-)
239 // code containing memory barriers for a Chase-Lev deque. Chase-Lev is
240 // similar to ABP, with the main difference that it allows resizing of the
241 // underlying storage:
242 //
243 // Le, N. M., Pop, A., Cohen A., and Nardell, F. Z.
244 // Correct and efficient work-stealing for weak memory models
245 // Proceedings of the 18th ACM SIGPLAN symposium on Principles and
246 // practice of parallel programming (PPoPP 2013), 69-80
247 //
248
249 template <class E, MEMFLAGS F, unsigned int N = TASKQUEUE_SIZE>
250 class GenericTaskQueue: public TaskQueueSuper<N, F> {
251 ArrayAllocator<E, F> _array_allocator;
252 protected:
253 typedef typename TaskQueueSuper<N, F>::Age Age;
254 typedef typename TaskQueueSuper<N, F>::idx_t idx_t;
255
256 using TaskQueueSuper<N, F>::_bottom;
257 using TaskQueueSuper<N, F>::_age;
258 using TaskQueueSuper<N, F>::increment_index;
259 using TaskQueueSuper<N, F>::decrement_index;
260 using TaskQueueSuper<N, F>::dirty_size;
261
262 public:
263 using TaskQueueSuper<N, F>::max_elems;
264 using TaskQueueSuper<N, F>::size;
265
266 #if TASKQUEUE_STATS
267 using TaskQueueSuper<N, F>::stats;
268 #endif
269
270 private:
271 // Slow paths for push, pop_local. (pop_global has no fast path.)
|
231 // The original paper is:
232 //
233 // Arora, N. S., Blumofe, R. D., and Plaxton, C. G.
234 // Thread scheduling for multiprogrammed multiprocessors.
235 // Theory of Computing Systems 34, 2 (2001), 115-144.
236 //
237 // The following paper provides an correctness proof and an
238 // implementation for weakly ordered memory models including (pseudo-)
239 // code containing memory barriers for a Chase-Lev deque. Chase-Lev is
240 // similar to ABP, with the main difference that it allows resizing of the
241 // underlying storage:
242 //
243 // Le, N. M., Pop, A., Cohen A., and Nardell, F. Z.
244 // Correct and efficient work-stealing for weak memory models
245 // Proceedings of the 18th ACM SIGPLAN symposium on Principles and
246 // practice of parallel programming (PPoPP 2013), 69-80
247 //
248
249 template <class E, MEMFLAGS F, unsigned int N = TASKQUEUE_SIZE>
250 class GenericTaskQueue: public TaskQueueSuper<N, F> {
251 protected:
252 typedef typename TaskQueueSuper<N, F>::Age Age;
253 typedef typename TaskQueueSuper<N, F>::idx_t idx_t;
254
255 using TaskQueueSuper<N, F>::_bottom;
256 using TaskQueueSuper<N, F>::_age;
257 using TaskQueueSuper<N, F>::increment_index;
258 using TaskQueueSuper<N, F>::decrement_index;
259 using TaskQueueSuper<N, F>::dirty_size;
260
261 public:
262 using TaskQueueSuper<N, F>::max_elems;
263 using TaskQueueSuper<N, F>::size;
264
265 #if TASKQUEUE_STATS
266 using TaskQueueSuper<N, F>::stats;
267 #endif
268
269 private:
270 // Slow paths for push, pop_local. (pop_global has no fast path.)
|