tbb基础之parallel_reduce用法详解
2015-04-09 10:42
936 查看
对一组数据执行诸如sum, max, min等操作被称为reduction operation。对一组数据并行执行reduction操作可能由于四舍五入导致不同的结果,如 A+B+C+D,串行执行的顺序为(((A+B)+C)+D),而并行执行的顺序可能为((A+B)+(C+D))。
首先,我们还是来看一个例子:
通过上面的例子知道: parallel_reduce的定义与parallel_for类似,但parallel_reduce却与其也有很大的不同点:
1)operator()是非const
parallel_reduce必须对SumFoo::sum进行更新,以便后面执行join()时使用。
2)SumFoo有一个带有split类的构造函数
带有split类的SumFoo构造函数,split参数用于原对象的引用,用于区分copy构造函数。
3)join()操作
当任何一个subtask执行完成时就会调用join()方法,该方法将subtask执行完的结果merge到main body中。
parallel_reduce执行流程如下图所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/04/22fa7c68841e72818955df5f2a170f78)
具体来说就是:当任务调度器发现有可供调度的工作线程时,parallel_reduce就调用代用split的构造函数为处理器创建一个子任务(Invoking the splitting constructor to create a subtask for the processor);当子任务执行完成,parallel_reduce则调用join()方法累加子任务的结果。
首先,我们还是来看一个例子:
// parallel_reduction class SumFoo { float *my_a; public: float sum; void operator()( const blocked_range<size_t>& range) { float *a = my_a; for ( size_t i = range.begin(); i!=range.end(); ++i) { sum += a[i]; } } SumFoo(SumFoo& x, tbb::split):my_a(x.my_a),sum(0) { } void join(const SumFoo& y) { sum += y.sum; } SumFoo( float * a):my_a(a),sum(0) { } }; float ParallelSumFoo( float * fArray, size_t nSize) { SumFoo sf(fArray); parallel_reduce( blocked_range<size_t>(0, nSize, 100), sf); return sf.sum; }
通过上面的例子知道: parallel_reduce的定义与parallel_for类似,但parallel_reduce却与其也有很大的不同点:
1)operator()是非const
parallel_reduce必须对SumFoo::sum进行更新,以便后面执行join()时使用。
2)SumFoo有一个带有split类的构造函数
带有split类的SumFoo构造函数,split参数用于原对象的引用,用于区分copy构造函数。
3)join()操作
当任何一个subtask执行完成时就会调用join()方法,该方法将subtask执行完的结果merge到main body中。
parallel_reduce执行流程如下图所示:
具体来说就是:当任务调度器发现有可供调度的工作线程时,parallel_reduce就调用代用split的构造函数为处理器创建一个子任务(Invoking the splitting constructor to create a subtask for the processor);当子任务执行完成,parallel_reduce则调用join()方法累加子任务的结果。
相关文章推荐
- tbb基础之parallel_for用法详解
- Linux下GDB用法基础教程详解
- [C#基础知识]泛型Dictionary<string,string>的用法详解
- linux shell脚本基础用法详解
- JAVA常用集合框架用法详解基础篇三之Colletion子接口Set
- JAVA常用集合框架用法详解基础篇二之Colletion子接口List
- TBB基础之parallel_for
- 详解Github(3)--Git基础用法
- TBB基础之parallel_for
- C#基础系列——多线程的常见用法详解
- [置顶] Android开发之数据存储——SharedPreferences基础知识详解,饿补学会基本知识,开发者必会它的用法。
- java基础--static用法详解
- phone Extension 用法基础详解
- Python基础之函数用法实例详解
- swift详解之二十三------------UICollectionView基础用法和简单自定义
- TBB基础之parallel_for求数组平均数
- TBB基础之parallel_for
- Python基础之函数用法实例详解
- iOS基础控件-UITabBarController - 2 之UITabBarItem 详解,结合视图控制器和导航控制器的用法
- 数据库_基础知识_GROUP BY 用法详解