27 #include "vtkCommonCoreModule.h"
35 #include <type_traits>
37 #ifndef DOXYGEN_SHOULD_SKIP_THIS
44 VTK_ABI_NAMESPACE_BEGIN
46 class vtkSMPTools_Has_Initialize
48 typedef char (&no_type)[1];
49 typedef char (&yes_type)[2];
50 template <
typename U,
void (U::*)()>
55 static yes_type check(V<U, &U::Initialize>*);
57 static no_type check(...);
60 static bool const value =
sizeof(check<T>(
nullptr)) ==
sizeof(yes_type);
64 class vtkSMPTools_Has_Initialize_const
66 typedef char (&no_type)[1];
67 typedef char (&yes_type)[2];
68 template <
typename U,
void (U::*)() const>
73 static yes_type check(V<U, &U::Initialize>*);
75 static no_type check(...);
78 static bool const value =
sizeof(check<T>(0)) ==
sizeof(yes_type);
81 template <
typename Functor,
bool Init>
82 struct vtkSMPTools_FunctorInternal;
84 template <
typename Functor>
85 struct vtkSMPTools_FunctorInternal<Functor, false>
88 vtkSMPTools_FunctorInternal(Functor& f)
96 SMPToolsAPI.For(first, last, grain, *
this);
98 vtkSMPTools_FunctorInternal<Functor, false>& operator=(
99 const vtkSMPTools_FunctorInternal<Functor, false>&);
100 vtkSMPTools_FunctorInternal(
const vtkSMPTools_FunctorInternal<Functor, false>&);
103 template <
typename Functor>
104 struct vtkSMPTools_FunctorInternal<Functor, true>
108 vtkSMPTools_FunctorInternal(Functor& f)
115 unsigned char& inited = this->Initialized.
Local();
118 this->F.Initialize();
121 this->F(first, last);
126 SMPToolsAPI.For(first, last, grain, *
this);
129 vtkSMPTools_FunctorInternal<Functor, true>& operator=(
130 const vtkSMPTools_FunctorInternal<Functor, true>&);
131 vtkSMPTools_FunctorInternal(
const vtkSMPTools_FunctorInternal<Functor, true>&);
134 template <
typename Functor>
135 class vtkSMPTools_Lookup_For
140 typedef vtkSMPTools_FunctorInternal<Functor, init>
type;
143 template <
typename Functor>
144 class vtkSMPTools_Lookup_For<Functor const>
149 typedef vtkSMPTools_FunctorInternal<Functor const, init>
type;
152 template <
typename Iterator,
typename Functor,
bool Init>
153 struct vtkSMPTools_RangeFunctor;
155 template <
typename Iterator,
typename Functor>
156 struct vtkSMPTools_RangeFunctor<Iterator, Functor, false>
160 vtkSMPTools_RangeFunctor(Iterator& begin, Functor& f)
167 Iterator itFirst(Begin);
168 std::advance(itFirst, first);
169 Iterator itLast(itFirst);
170 std::advance(itLast, last - first);
171 this->F(itFirst, itLast);
175 template <
typename Iterator,
typename Functor>
176 struct vtkSMPTools_RangeFunctor<Iterator, Functor, true>
180 vtkSMPTools_RangeFunctor(Iterator& begin, Functor& f)
185 void Initialize() { this->F.Initialize(); }
188 Iterator itFirst(Begin);
189 std::advance(itFirst, first);
190 Iterator itLast(itFirst);
191 std::advance(itLast, last - first);
192 this->F(itFirst, itLast);
194 void Reduce() { this->F.Reduce(); }
197 template <
typename Iterator,
typename Functor>
198 class vtkSMPTools_Lookup_RangeFor
203 typedef vtkSMPTools_RangeFunctor<Iterator, Functor, init>
type;
206 template <
typename Iterator,
typename Functor>
207 class vtkSMPTools_Lookup_RangeFor<Iterator, Functor const>
212 typedef vtkSMPTools_RangeFunctor<Iterator, Functor const, init>
type;
215 template <
typename T>
217 VTK_ABI_NAMESPACE_END
221 #endif // DOXYGEN_SHOULD_SKIP_THIS
223 VTK_ABI_NAMESPACE_BEGIN
237 template <
typename Functor>
241 fi.For(first, last, grain);
244 template <
typename Functor>
248 fi.For(first, last, grain);
262 template <
typename Functor>
268 template <
typename Functor>
311 template <
typename Iter,
typename Functor>
312 static vtk::detail::smp::resolvedNotInt<Iter>
For(
313 Iter begin, Iter end,
vtkIdType grain, Functor& f)
320 template <
typename Iter,
typename Functor>
321 static vtk::detail::smp::resolvedNotInt<Iter>
For(
322 Iter begin, Iter end,
vtkIdType grain, Functor
const& f)
364 template <
typename Iter,
typename Functor>
365 static vtk::detail::smp::resolvedNotInt<Iter>
For(Iter begin, Iter end, Functor& f)
370 template <
typename Iter,
typename Functor>
371 static vtk::detail::smp::resolvedNotInt<Iter>
For(Iter begin, Iter end, Functor
const& f)
380 static const char* GetBackend();
393 static bool SetBackend(
const char* backend);
410 static void Initialize(
int numThreads = 0);
418 static int GetEstimatedNumberOfThreads();
426 static int GetEstimatedDefaultNumberOfThreads();
439 static void SetNestedParallelism(
bool isNested);
445 static bool GetNestedParallelism();
450 static bool IsParallelScope();
456 static bool GetSingleThread();
467 int MaxNumberOfThreads = 0;
469 bool NestedParallelism =
false;
473 : MaxNumberOfThreads(maxNumberOfThreads)
481 : NestedParallelism(nestedParallelism)
485 : MaxNumberOfThreads(maxNumberOfThreads)
487 , NestedParallelism(nestedParallelism)
490 #ifndef DOXYGEN_SHOULD_SKIP_THIS
492 : MaxNumberOfThreads(API.GetInternalDesiredNumberOfThread())
493 , Backend(API.GetBackend())
494 , NestedParallelism(API.GetNestedParallelism())
497 #endif // DOXYGEN_SHOULD_SKIP_THIS
535 template <
typename T>
557 template <
typename InputIt,
typename OutputIt,
typename Functor>
558 static void Transform(InputIt inBegin, InputIt inEnd, OutputIt outBegin, Functor transform)
561 SMPToolsAPI.Transform(inBegin, inEnd, outBegin, transform);
580 template <
typename InputIt1,
typename InputIt2,
typename OutputIt,
typename Functor>
582 InputIt1 inBegin1, InputIt1 inEnd, InputIt2 inBegin2, OutputIt outBegin, Functor transform)
585 SMPToolsAPI.Transform(inBegin1, inEnd, inBegin2, outBegin, transform);
602 template <
typename Iterator,
typename T>
603 static void Fill(Iterator begin, Iterator end,
const T&
value)
606 SMPToolsAPI.Fill(begin, end, value);
614 template <
typename RandomAccessIterator>
615 static void Sort(RandomAccessIterator begin, RandomAccessIterator end)
618 SMPToolsAPI.Sort(begin, end);
627 template <
typename RandomAccessIterator,
typename Compare>
628 static void Sort(RandomAccessIterator begin, RandomAccessIterator end, Compare comp)
631 SMPToolsAPI.Sort(begin, end, comp);
646 template <
typename RandomAccessIterator,
typename ValueType>
647 static ValueType ExclusiveScan(
648 RandomAccessIterator begin, RandomAccessIterator end, ValueType init);
664 template <
typename RandomAccessIterator,
typename ValueType>
666 RandomAccessIterator begin, RandomAccessIterator end, ValueType init)
669 typename std::iterator_traits<RandomAccessIterator>::difference_type num =
670 std::distance(begin, end);
674 ValueType retVal = *(end - 1);
679 ValueType val, sum = init;
680 for (
auto iter = begin; iter != end; ++iter)
700 std::vector<ValueType> batchOffsets(numBatches);
701 int batchSize =
static_cast<int>(std::ceil(static_cast<double>(num) / numBatches));
707 auto beginBatch = begin + (batchId * batchSize);
708 auto endBatch = begin + (endBatchId * batchSize);
709 endBatch = (endBatch > end ? end : endBatch);
711 ValueType val, sum{};
712 for (
auto iter = beginBatch; iter < endBatch; ++iter)
718 batchOffsets[batchId] = sum;
724 ValueType val, count = init;
725 for (
int batchNum = 0; batchNum < numBatches; ++batchNum)
727 val = batchOffsets[batchNum];
728 batchOffsets[batchNum] = count;
736 auto beginBatch = begin + (batchId * batchSize);
737 auto endBatch = begin + (endBatchId * batchSize);
738 endBatch = (endBatch > end ? end : endBatch);
740 ValueType
offset = batchOffsets[batchId];
741 for (
auto iter = beginBatch; iter < endBatch; ++iter)
748 return (retVal += *(end - 1));
751 VTK_ABI_NAMESPACE_END
T & Local()
This needs to be called mainly within a threaded execution path.
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
Thread local storage for VTK objects.