并行库充分利用多核的优势,通过并行运算提高程序效率,本文主要介绍c++中两个知名的并行库,一个是intel开发的TBB,一个是微软开发的PPL。本文只介绍其基本的常用用法:并行算法和任务。
TBB(Intel® Threading Building Blocks )
TBB是intel用标准c++写的一个开源的并行计算库。它的目的是提升数据并行计算的能力,可以在他的官网上下载最新的库和文档。TBB主要功能:
-
- 并行算法
- 任务调度
- 并行容器
- 同步原语
- 内存分配器
TBB并行算法
parallel_for:并行方式遍历一个区间。
parallel_for(1, 20000, [](int i){cout << i << endl; }); parallel_for(blocked_range<size_t>(0, 20000), [](blocked_range<size_t>& r) { for (size_t i = r.begin(); i != r.end(); ++i) cout << i << endl; });
parallel_do和parallel_for_each:将算法应用于一个区间
vector<size_t> v; parallel_do(v.begin(), v.end(), [](size_t i){cout << i << endl; }); parallel_for_each(v.begin(), v.end(), [](size_t i){cout << i << endl; });
parallel_reduce
类似于map_reduce,但是有区别。它先将区间自动分组,对每个分组进行聚合(accumulate)计算,每组得到一个结果,最后将各组的结果进行汇聚(reduce)。这个算法稍微复杂一点,parallel_reduce(range,identity,func,reduction),第一个参数是区间范围,第二个参数是计算的初始值,第三个参数是聚合函数,第四个参数是汇聚参数。
float ParallelSum(float array [], size_t n) { return parallel_reduce( blocked_range<float*>(array, array + n), 0.f, [](const blocked_range<float*>& r, floa