July 2007
Intermediate to advanced
332 pages
10h 4m
English
Example 11-20 does away with the need to supply a grain size by converting the prior example to use an auto_partitioner. Note how the block_range loses the grainsize parameter, and the parallel_reduce has a parameter added specifying our desire to use the auto_partitioner.
Example 11-20. ParallelSum with auto_partitioner
#include "tbb/parallel_reduce.h"
#include "tbb/blocked_range.h"
using namespace tbb;
struct Sum {
float value;
Sum() : value(0) {}
Sum( Sum& s, split ) {value = 0;}
void operator()( const blocked_range<float*>& range ) {
float temp = value;
for( float* a=range.begin(); a!=range.end(); ++a ) {
temp += *a;
}
value = temp;
}
void join( Sum& rhs ) {value += rhs.value;}
};
float ParallelSum( float array[], size_t n ) {
Sum total;
parallel_reduce( blocked_range<float*>( array, array+n ),
total, auto_partitioner() );
return total.value;
}