并行库充分利用多核的优势,通过并行运算提高程序效率,本文主要介绍c++中两个知名的并行库,一个是intel开发的TBB,一个是微软开发的PPL。本文只介绍其基本的常用用法:并行算法和任务。

TBB(Intel® Threading Building Blocks )

TBB是intel用标准c++写的一个开源的并行计算库。它的目的是提升数据并行计算的能力,可以在他的官网上下载最新的库和文档。TBB主要功能:

并行算法

任务调度

并行容器

同步原语

内存分配器

TBB并行算法

parallel_for:并行方式遍历一个区间。

parallel_for(1, 20000, [](int i){cout << i <

parallel_for(blocked_range(0, 20000), [](blocked_range&r)

{for (size_t i = r.begin(); i != r.end(); ++i)

cout<< i <

});

parallel_do和parallel_for_each:将算法应用于一个区间

vectorv;

parallel_do(v.begin(), v.end(), [](size_t i){cout<< i <

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(floatarray [], size_t n) {returnparallel_reduce(

blocked_range(array, array +n),0.f,

[](const blocked_range& r, float value)->float{returnstd::accumulate(r.begin(), r.end(), value);

},

std::plus()

);

}

这个对数组求和的例子就是先自动分组然后对各组中的元素进行聚合累加,最后将各组结果汇聚相加。

parallel_pipeline:并行的管道过滤器

数据流经过一个管道,在数据流动的过程中依次要经过一些过滤器的处理,其中有些过滤器可能会并行处理数据,这时就可以用到并行的管道过滤器。举一个例子,比如我要读入一个文件,先将文件中的数字提取出来,再将提取出来的数字做一个转换,最后将转换后的数字输出到另外一个文件中。其中读文件和输出文件不能并兴去做,但是中间数字转换的环节可以并行去做的。parallel_pipeline的原型:

parallel_pipeline( max_number_of_live_tokens,

make_filter(mode0,g0) &make_filter(mode1,g1) &make_filter(mode2,g2) &...

make_filter(moden,gn) );

第一个参数是最大的并行数,我们可以通过&连接多个filter,这些filter是顺序执行的,前一个filter的输出是下一个filter的输入。

float RootMeanSquare( float* first, float*last ) {float sum=0;

parallel_pipeline(/*max_number_of_live_token=*/16,

make_filter(

filter::serial,

[&](flow_control& fc)-> float*{if( first

}else{

fc.stop();returnNULL;

}

}

)&make_filter(

filter::parallel,

[](float* p){return (*p)*(*p);}

)&make_filter(

filter::serial,

[&](float x) {sum+=x;}

)

);returnsqrt(sum);

}

第一个filter生成数据(如从文件中读取数据等),第二个filter对产生的数据进行转换,第三个filter是对转换后的数据做累加。其中第二个filter是可以并行处理的,通过filter::parallel来指定其处理模式。

parallel_sort:并行排序

const int N = 1000000;floata[N];floatb[N];

parallel_sort(a, a+N);

parallel_sort(b, b+ N, std::greater());

parallel_invoke:并行调用,并行调用多个函数

voidf();extern void bar(int);voidRunFunctionsInParallel() {

tbb::parallel_invoke(f, []{bar(2);}, []{bar(3);} );

}

TBB任务

task_group表示可以等待或者取消的任务集合

task_group g;

g.run([]{TestPrint(); });

g.run([]{TestPrint(); });

g.run([]{TestPrint(); });

g.wait();

PPL(Parallel Patterns Library)

PPL是微软开发的并行计算库,它的功能和TBB是差不多的,但是PPL只能在windows上使用。二者在并行算法的使用上基本上是一样的, 但还是有差异的。二者的差异:

parallel_reduce的原型有些不同,PPL的paraller_reduce函数多一个参数,原型为parallel_reduce(begin,end,identity,func,reduction), 比tbb多了一个参数,但是表达的意思差不多,一个是区间,一个是区间迭代器。

PPL中没有parallel_pipeline接口。

TBB的task没有PPL的task强大,PPL的task可以链式连续执行还可以组合任务,TBB的task则不行。

PPL任务的链式连续执行then

intmain()

{

auto t= create_task([]() -> int{return 0;

});//Create a lambda that increments its input value.

auto increment = [](int n) { return n + 1; };//Run a chain of continuations and print the result.

int result = t.then(increment).then(increment).then(increment).get();

cout<< result <

}/*Output:

3*/

PPL任务的组合

1.when_all可以执行一组任务,所有任务完成之后将所有任务的结果返回到一个集合中。要求该组任务中的所有任务的返回值类型都相同。

array, 3> tasks ={

create_task([]()-> int { return 88; }),

create_task([]()-> int { return 42; }),

create_task([]()-> int { return 99; })

};

auto joinTask= when_all(begin(tasks), end(tasks)).then([](vectorresults)

{

cout<< "The sum is"

<< accumulate(begin(results), end(results), 0)<< '.' <

});//Print a message from the joining thread.

cout << "Hello from the joining thread." <

joinTask.wait();

2.when_any任务组中的某一个任务执行完成之后,返回一个pair,键值对是结果和任务序号。

array, 3> tasks ={

create_task([]()-> int { return 88; }),

create_task([]()-> int { return 42; }),

create_task([]()-> int { return 99; })

};//Select the first to finish.

when_any(begin(tasks), end(tasks)).then([](pairresult)

{

cout<< "First task to finish returns"

<

<< result.second<

}).wait();//output: First task to finish returns 42 and has index 1.

总结:

ppl和tbb两个并行运算库功能相似,如果需要跨平台则选择tbb,  否则选择ppl。ppl在任务调度上比tbb强大,tbb由于设计上的原因不能做到任务的连续执行以及任务的组合,但是tbb有跨平台的优势。

如果你觉得这篇文章对你有用,可以点一下推荐,谢谢。

c++11 boost技术交流群:296561497,欢迎大家来交流技术。

boost库 tbb_c++并行计算库TBB和PPL的基本用法相关推荐

  1. c++并行计算库TBB和PPL的基本用法

    c++并行计算库TBB和PPL的基本用法 参考:http://www.cnblogs.com/qicosmos/p/3517166.html 并行库充分利用多核的优势,通过并行运算提高程序效率,本文主 ...

  2. boost::signals2模块thread_safe_signals 库替代线程模型的基本测试

    boost::signals2模块thread_safe_signals 库替代线程模型的基本测试 实现功能 C++实现代码 实现功能 boost::signals2模块thread_safe_sig ...

  3. 使用 BOOST.ASSERT 机制替换库断言

    使用 BOOST.ASSERT 机制替换库断言 实现功能 C++实现代码 实现功能 使用 BOOST.ASSERT 机制替换库断言 C++实现代码 #include <boost/core/li ...

  4. VC++ 2005 使用BOOST库和WinPcap库

    最近在项目中需要用到C++的Boost库及WinPcap库,Boost库是C++的"准"标准库.WinPcap库则是Windows下的libpcap.用来抓取网络的数据包进行解析. ...

  5. boost库和Eigen库冲突的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在使用vs2013编写一个程序中同时使用boost库和Eigen库,出现一个编译错误: 错误       C2039  ...

  6. boost库使用—asio库

    boost库使用-asio库 **** 一.boost库asio简介 Boost Asio ( asynchronous input and output)关注异步输入输出.Boost Asio库提供 ...

  7. 静态库和共享库之间的区别?

    静态库和共享库有什么区别? 我使用Eclipse,并且有几种项目类型,包括"静态库"和"共享库"? 一个人比另一个人有优势吗? #1楼 对于静态库,链接器从库中 ...

  8. Py之dlib:Python库之dlib库的简介、安装、使用方法详细攻略

    Py之dlib:Python库之dlib库的简介.安装.使用方法详细攻略 目录 dlib库的简介 dlib库的安装 dlib库的使用函数 0.利用dlib.get_frontal_face_detec ...

  9. C++库介绍-标准库、类库

    目录: 1.标准库 2.GUI库 3.网络通信 4.XML 5.科学计算 6.游戏开发 7.线程 8.序列化 9.字符串 10.综合 11.其他 12.C++重要人物网站 C++类库介绍 再次体现了C ...

最新文章

  1. 更换XP SN的vbs
  2. 全球及中国抗菌溶液行业深度调研与前景研究建议报告2022年
  3. leetcode738. 单调递增的数字(贪心)
  4. 英语口语-文章朗读Week10 Wednesday
  5. buffsize 缓冲区的大小多少合适_对于Redis性能指标监控!你了解多少?
  6. Spring框架----切入点表达式的写法
  7. s8050三极管经典电路_电路板维修基本经验分享。
  8. VMware 设置网络
  9. Win10删除资源管理器左侧的Onedrive图标
  10. Ubuntu+Docker+Tensorflow+GPU安装
  11. 巴特沃斯滤波器原理及其仿真设计
  12. EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字...
  13. 前段时间《八佰》上映了,让我们看看网友们对这部电影有什么看法
  14. word如何添加下滑线
  15. Ubuntu锐捷认证方法(vmware)
  16. MP4学习(五)ts-mp4源码阅读(3)ftyp box的解析
  17. 解决Chrome浏览器启动页被劫持篡改为360
  18. Linux环境-自动化部署JAVA
  19. Http Chunked理解
  20. Android Q的全新特性与隐私权限

热门文章

  1. 跨文化管理 ——霍夫斯泰德的四个维度
  2. 大众点评点餐小程序开发经验 - 数据采集
  3. F libc : Fatal signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xcfeeb0ec in tid 21889
  4. AOV网(拓扑排序)和AOE网
  5. Sorry, we can‘t find a NetAcad account associated with this Cisco account.思科进行注册登录时出现该问题
  6. 纯命令行的centos如何通过上网认证的解决方案
  7. stm32无感无刷电机——电位器转速控制
  8. 机器学习 —— 聚类算法
  9. (AS笔记)AndroidStudio4.2.2安装和配置gradle阿里源
  10. 美网络安全公司称非蓝牙类无线鼠标和键盘存隐患