MeshLib C++ Docs
Loading...
Searching...
No Matches
MRBitSetParallelFor.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRBitSet.h"
4#include "MRFunctional.h"
5#include "MRParallel.h"
7
8namespace MR
9{
10
13
15template <typename Id>
16struct IdRange
17{
19 auto size() const { return end - beg; }
20};
21
22namespace BitSetParallel
23{
24
25template <typename IndexType>
27{
28 const size_t beginBlock = bitRange.beg / BitSet::bits_per_block;
29 const size_t endBlock = ( size_t( bitRange.end ) + BitSet::bits_per_block - 1 ) / BitSet::bits_per_block;
30 return tbb::blocked_range<size_t>( beginBlock, endBlock );
31}
32
33template <typename BS>
34inline auto blockRange( const BS & bs )
35{
36 const size_t endBlock = ( bs.size() + BS::bits_per_block - 1 ) / BS::bits_per_block;
37 return tbb::blocked_range<size_t>( 0, endBlock );
38}
39
40template <typename BS>
41inline auto bitRange( const BS & bs )
42{
43 return IdRange<typename BS::IndexType>{ bs.beginId(), bs.endId() };
44}
45
46template <typename IndexType>
47auto bitSubRange( const IdRange<IndexType> & bitRange, const tbb::blocked_range<size_t> & range, const tbb::blocked_range<size_t> & subRange )
48{
50 {
51 .beg = subRange.begin() > range.begin() ? IndexType( subRange.begin() * BitSet::bits_per_block ) : bitRange.beg,
52 .end = subRange.end() < range.end() ? IndexType( subRange.end() * BitSet::bits_per_block ) : bitRange.end
53 };
54}
55
56using Range = tbb::blocked_range<size_t>;
57
58MRMESH_API void forAllRanged( const Range & bitRange, FunctionRef<void ( size_t, const Range & )> f );
59
60MRMESH_API void forAllRanged( const Range & bitRange, FunctionRef<void ( size_t, const Range &, void* )> f,
61 FunctionRef<void* ()> ctx );
62
63MRMESH_API bool forAllRanged( const Range & bitRange, FunctionRef<void ( size_t, const Range &, void* )> f,
64 FunctionRef<void* ()> ctx, ProgressCallback progressCb, size_t reportProgressEveryBit = 1024 );
65
66template <typename BS, typename F, typename ...Cb>
67auto ForAllRanged( const BS & bs, F && f, Cb && ... cb )
68{
69 if constexpr ( sizeof...( cb ) == 0 )
70 {
71 return forAllRanged( { (size_t)0, bs.size() }, [&] ( size_t i, const Range& range )
72 {
73 using Id = typename BS::IndexType;
74 std::forward<F>( f )( Id{ i }, IdRange<Id>{ Id{ range.begin() }, Id{ range.end() } } );
75 } );
76 }
77 else
78 {
79 return forAllRanged( { (size_t)0, bs.size() }, [&] ( size_t i, const Range& range, void* )
80 {
81 using Id = typename BS::IndexType;
82 std::forward<F>( f )( Id{ i }, IdRange<Id>{ Id{ range.begin() }, Id{ range.end() } } );
83 }, [&]
84 {
85 return nullptr;
86 }, std::forward<Cb>( cb )... );
87 }
88}
89
90template <typename BS, typename L, typename F, typename ...Cb>
91auto ForAllRanged( const BS & bs, tbb::enumerable_thread_specific<L>& e, F && f, Cb && ... cb )
92{
93 return forAllRanged( { (size_t)0, bs.size() }, [&] ( size_t i, const Range& range, void* ctx )
94 {
95 using Id = typename BS::IndexType;
96 std::forward<F>( f )( Id{ i }, IdRange<Id>{ Id{ range.begin() }, Id{ range.end() } }, *(L*)ctx );
97 }, [&]
98 {
99 return (void*)&e.local();
100 }, std::forward<Cb>( cb )... );
101}
102
103}
104
110template <typename BS, typename ...F>
111inline auto BitSetParallelForAllRanged( const BS & bs, F &&... f )
112{
113 return BitSetParallel::ForAllRanged( bs, std::forward<F>( f )... );
114}
115
122template <typename BS, typename L, typename ...F>
123inline auto BitSetParallelForAllRanged( const BS & bs, tbb::enumerable_thread_specific<L> & e, F &&... f )
124{
125 return BitSetParallel::ForAllRanged( bs, e, std::forward<F>( f )... );
126}
127
132template <typename BS, typename F, typename ...Cb>
133inline auto BitSetParallelForAll( const BS & bs, F && f, Cb&&... cb )
134{
135 return BitSetParallel::ForAllRanged( bs, [&] ( auto bit, auto && ) { std::forward<F>( f )( bit ); }, std::forward<Cb>( cb )... );
136}
137
143template <typename BS, typename L, typename F, typename ...Cb>
144inline auto BitSetParallelForAll( const BS & bs, tbb::enumerable_thread_specific<L> & e, F && f, Cb&&... cb )
145{
146 return BitSetParallel::ForAllRanged( bs, e, [&] ( auto bit, auto &&, auto & tls ) { std::forward<F>( f )( bit, tls ); }, std::forward<Cb>( cb )... );
147}
148
153template <typename BS, typename F, typename ...Cb>
154inline auto BitSetParallelFor( const BS& bs, F && f, Cb&&... cb )
155{
156 return BitSetParallelForAll( bs, [&] ( auto bit ) { if ( bs.test( bit ) ) std::forward<F>( f )( bit ); }, std::forward<Cb>( cb )... );
157}
158
164template <typename BS, typename L, typename F, typename ...Cb>
165inline auto BitSetParallelFor( const BS& bs, tbb::enumerable_thread_specific<L> & e, F && f, Cb&&... cb )
166{
167 return BitSetParallelForAll( bs, e, [&] ( auto bit, auto & tls ) { if ( bs.test( bit ) ) std::forward<F>( f )( bit, tls ); }, std::forward<Cb>( cb )... );
168}
169
171
172}
static constexpr size_t bits_per_block
Definition MRBitSet.h:27
Definition MRFunctional.h:15
stores index of some element, it is made as template class to avoid mixing faces, edges and vertices
Definition MRId.h:19
auto BitSetParallelForAll(const BS &bs, F &&f, Cb &&... cb)
Definition MRBitSetParallelFor.h:133
auto BitSetParallelForAllRanged(const BS &bs, F &&... f)
namespace BitSetParallel
Definition MRBitSetParallelFor.h:111
auto BitSetParallelFor(const BS &bs, F &&f, Cb &&... cb)
Definition MRBitSetParallelFor.h:154
MRMESH_API void forAllRanged(const Range &bitRange, FunctionRef< void(size_t, const Range &)> f)
auto ForAllRanged(const BS &bs, F &&f, Cb &&... cb)
Definition MRBitSetParallelFor.h:67
tbb::blocked_range< size_t > Range
Definition MRBitSetParallelFor.h:56
auto bitRange(const BS &bs)
Definition MRBitSetParallelFor.h:41
auto blockRange(const IdRange< IndexType > &bitRange)
Definition MRBitSetParallelFor.h:26
auto bitSubRange(const IdRange< IndexType > &bitRange, const tbb::blocked_range< size_t > &range, const tbb::blocked_range< size_t > &subRange)
Definition MRBitSetParallelFor.h:47
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
range of indices [beg, end)
Definition MRBitSetParallelFor.h:17
auto size() const
Definition MRBitSetParallelFor.h:19
Id beg
Definition MRBitSetParallelFor.h:18
Id end
Definition MRBitSetParallelFor.h:18