41 std::atomic<bool> keepGoing{
true };
45 constexpr int hardware_destructive_interference_size = 64;
46 struct alignas(hardware_destructive_interference_size) S
48 std::atomic<size_t> processed{ 0 };
50 static_assert(
alignof(S) == hardware_destructive_interference_size );
51 static_assert(
sizeof(S) == hardware_destructive_interference_size );
53 tbb::parallel_for( tbb::blocked_range( begin, end ),
54 [&] (
const tbb::blocked_range<I>& range )
56 const auto callingThreadLock = callingThreadMutex.
tryLock();
57 const bool report = cb && callingThreadLock;
58 size_t myProcessed = 0;
60 for (
I i = range.begin(); i < range.end(); ++i )
62 if ( !keepGoing.load( std::memory_order_relaxed ) )
65 if ( ( ++myProcessed % reportProgressEvery ) == 0 )
69 if ( !cb(
float( myProcessed + s.processed.load( std::memory_order_relaxed ) ) /
size ) )
70 keepGoing.store(
false, std::memory_order_relaxed );
74 s.processed.fetch_add( myProcessed, std::memory_order_relaxed );
79 const auto total = myProcessed + s.processed.fetch_add( myProcessed, std::memory_order_relaxed );
80 if ( report && !cb(
float( total ) /
size ) )
81 keepGoing.store(
false, std::memory_order_relaxed );
83 return keepGoing.load( std::memory_order_relaxed );
void For(I begin, I end, const CM &callMaker, F &&f)
Definition MRParallelFor.h:17