设为首页 加入收藏

TOP

c++并行计算库TBB和PPL的用法(一)
2014-02-08 13:36:15 来源: 作者: 【 】 浏览:265
Tags:并行 计算 TBB PPL 用法

  并行库充分利用多核的优势,通过并行运算提高程序效率,本文主要介绍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, float value)->float {

  return std::accumulate(r.begin(), r.end(), value);

  },

  std::plus<float>()

  );

  }

  复制代码

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

  parallel_pipeline:并行的管道过滤器

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

  parallel_pipeline( max_number_of_live_tokens,

  make_filter<void,I1>(mode0,g0) &

  make_filter<I1,I2>(mode1,g1) &

  make_filter<I2,I3>(mode2,g2) &

  …

  make_filter<In,void>(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<void,float*>(

  filter::serial,

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

  if( first<last ) {

  return first++;

  } else {

  fc.stop();

  return NULL;

  }

  }

  ) &

  make_filter<float*,float>(

  filter::parallel,

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

  ) &

  make_filter<float,void>(

  filter::serial,

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

  )

  );

  return sqrt(sum);

  }

  复制代码

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

  parallel_sort:并行排序

  const int N = 1000000;

  float a[N];

  float b[N];

  parallel_sort(a, a + N);

  parallel_sort(b, b + N, std::greater<float>());

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

  void f();

  extern void bar(int);

  void RunFunctionsInParallel() {

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

  }

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++线段树求区间交,并,补 下一篇C++ Primer Plus:处理..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)