14#include <oneapi/tbb/blocked_range.h>
15#include <oneapi/tbb/enumerable_thread_specific.h>
16#include <oneapi/tbb/parallel_for.h>
40 tbb::enumerable_thread_specific<void*>
values;
43ThreadLocalStorage::ThreadLocalStorage(
void* context,
Factory factory,
Deleter deleter)
44 : mImpl{
std::make_unique<
Impl>(context, factory, deleter)}
52 return mImpl->values.local();
57 return {mImpl->values.begin(), mImpl->values.end()};
62 tbb::parallel_for(tbb::blocked_range<size_t>{begin,
end, grainSize}, [context, body](
const tbb::blocked_range<size_t>&
range) {
70 : mCapacity{capacity}, mSlab{slab ? slab :
size_t{1}}
76 if (mExhausted.load(std::memory_order_relaxed)) {
79 const size_t base = mCursor.fetch_add(mSlab, std::memory_order_relaxed);
80 if (base >= mCapacity) {
81 mExhausted.store(
true, std::memory_order_relaxed);
84 return {.base = base, .n = std::min(mSlab, mCapacity - base)};
89 return std::min(mCursor.load(std::memory_order_relaxed), mCapacity);
94 const size_t threads =
static_cast<size_t>(std::max(1, nThreads));
95 const size_t fairShare = std::max<size_t>(1, capacity / threads);
96 return std::clamp(std::max<size_t>(1, capacity / (8 * threads)),
97 std::min(minSlab, fairShare),
98 std::min(maxSlab, fairShare));
103 assert(mCursor.load(std::memory_order_relaxed) == 0);
104 mCapacity = capacity;
105 mExhausted.store(capacity == 0, std::memory_order_relaxed);
Lock-free slot allocator and single-pass sink.
void resetCapacity(size_t capacity) noexcept
size_t watermark() const noexcept
static size_t suggestSlab(size_t capacity, int nThreads, size_t minSlab=256, size_t maxSlab=4096) noexcept
SlabBumpAllocator(size_t capacity, size_t slab) noexcept
void *(*)(void *) Factory
std::vector< void * > values() const
GLsizei const GLfloat * value
GLenum GLsizei GLsizei GLint * values
void parallelFor(size_t begin, size_t end, size_t grainSize, void *context, ParallelForBody body)
void(*)(void *, size_t, size_t) ParallelForBody
tbb::enumerable_thread_specific< void * > values
Impl(void *context_, Factory factory_, Deleter deleter_)