7#ifndef PXR_BASE_WORK_LOOPS_H
8#define PXR_BASE_WORK_LOOPS_H
12#include "pxr/base/work/api.h"
14#include "pxr/base/work/impl.h"
19PXR_NAMESPACE_OPEN_SCOPE
37 std::forward<Fn>(fn)(0, n);
64 PXR_WORK_IMPL_NAMESPACE_USING_DIRECTIVE;
65 WorkImpl_ParallelForN(n, std::forward<Fn>(callback), grainSize);
103template <
typename RangeType,
typename Fn>
109 PXR_WORK_IMPL_NAMESPACE_USING_DIRECTIVE;
113#if defined WORK_IMPL_HAS_PARALLEL_FOR_TBB_RANGE
114 WorkImpl_ParallelForTBBRange(range, std::forward<Fn>(callback));
125 : _dispatcher(dispatcher)
126 , _range(std::move(range))
127 , _callback(callback) {}
129 void operator()()
const {
132 RangeType &leftRange = _range;
133 while (leftRange.is_divisible()) {
134 RangeType rightRange(leftRange, tbb::split());
135 _dispatcher.Run(_RangeTask(
136 _dispatcher, std::move(rightRange), _callback));
141 if (!leftRange.empty()) {
142 std::invoke(_callback, leftRange);
148 mutable RangeType _range;
153 RangeType range = range;
154 dispatcher.Run(_RangeTask(
155 dispatcher, range, std::forward<Fn>(callback)));
159 std::forward<Fn>(callback)(range);
175template <
typename InputIterator,
typename Fn>
178 InputIterator first, InputIterator last, Fn &&fn)
181 PXR_WORK_IMPL_NAMESPACE_USING_DIRECTIVE;
182 WorkImpl_ParallelForEach(first, last, std::forward<Fn>(fn));
184 std::for_each(first, last, std::forward<Fn>(fn));
188PXR_NAMESPACE_CLOSE_SCOPE
A work dispatcher runs concurrent tasks.
void WorkParallelForTBBRange(const RangeType &range, Fn &&callback)
WorkParallelForTBBRange(const RangeType &r, Fn &&callback)
void WorkParallelForEach(InputIterator first, InputIterator last, Fn &&fn)
WorkParallelForEach(Iterator first, Iterator last, CallbackType callback)
void WorkParallelForN(size_t n, Fn &&callback, size_t grainSize)
WorkParallelForN(size_t n, CallbackType callback, size_t grainSize = 1)
void WorkSerialForN(size_t n, Fn &&fn)
WorkSerialForN(size_t n, CallbackType callback)
WORK_API bool WorkHasConcurrency()
Return true if WorkGetPhysicalConcurrencyLimit() returns a number greater than 1 and PXR_WORK_THREAD_...