Intel Threading Building Blocks 之 并行循环(一)

来源:互联网 发布:php自定义函数 编辑:程序博客网 时间:2024/05/18 02:55

Intel Threading Building Blocks(下文简称TBB)是一个C++的并行编程模板库,它能使你的程序充分利用多核CPU的性能优势。

 

从www.threadingbuildingblocks.org/download.php下载TBB库,建议顺便把几本教程和参考手册也下下来。

解压...

    其中的include子目录就是头文件路径

    ia32子目录里有vc7.1,vc8和vc9三个下级目录,按照你所使用的IDE选择一个(比如我的VC2005就选择vc8),里面的bin和lib分别是dll文件和对应的lib文件所在地。

    另外还有一个em64t目录,也许是64位的吧,没试过-_-

在VC2005项目属性里:

    附加包含目录里加上TBB路径下子目录include/的完整路径名。

    附加库目录加上TBB路径下子目录ia32/vcX/lib/的完整路径名。

把TBB路径下子目录ia32/vcX/bin添加到PATH环境变量中,或者把dll文件复制到要编译的程序所在目录下,确保系统能找到这些dll文件就行。

说起来挺长,其实只是三个目录的问题:include,lib,bin。我想只要是编写过C程序的人看到这三个目录都会知道该怎么做吧。

开始使用TBB

一个使用TBB库的程序样子应该是这样地:

  1. #include <tbb/task_scheduler_init.h>
  2. #include ...//其它头文件
  3.  
  4. int main()
  5. {
  6.     tbb::task_scheduler_init init;
  7.     ...//代码
  8.     return 0;
  9. }

task_scheduler_init对象在构造时初始化TBB环境(比如线程池之类的东东),析构时回收TBB环境。在使用其它TBB组件之前必须先构造一个task_scheduler_init对象。

我们可以在task_scheduler_init对象的构造函数里指定线程池里线程的数量,比如tbb::task_scheduler_init init(10)。如果不指定,默认值是task_scheduler_init::automatic,它会自动根据当前系统决定线程量。

task_scheduler_init定义在tbb/task_scheduler_init.h文件中,绝大部分的TBB组件都放在它们自己的头文件中,比如下面要讲的blocked_range放在blocked_range.h中,parallel_for放在parallel_for.h中等。

并行排序parallel_sort

为了突出TBB的简单易学,也为了增强一下学习的信心,先放上一个小甜饼:并行排序

  1. template<typename RandomAccessIterator>
  2.   void parallel_sort(RandomAccessIterator begin,
  3.                      RandomAccessIterator end);
  4. template<typename RandomAccessIterator, typename Compare>
  5.   void parallel_sort(RandomAccessIterator begin,
  6.                      RandomAccessIterator end,
  7.                      const Compare& comp ); 

从定义可以看出,它的用法与std::sort完全一样,我们只需把原程序里的std::sort替换成tbb::parallel_sort,就得到了一个多核优化的程序了(嗯~~起码能向别人这么吹了,呵呵)。

例:

  1. #include <tbb/task_scheduler_init.h>
  2. #include <tbb/parallel_sort.h>
  3. #include <math.h>
  4.  
  5. int main()
  6. {
  7.     //准备排序原料
  8.     const int N = 100000;
  9.     float a[N];
  10.     float b[N];
  11.     forint i = 0; i < N; i++ ) {
  12.        a[i] = sin((double)i);
  13.        b[i] = cos((double)i);
  14.     }
  15.     //TBB初始化
  16.     tbb::task_scheduler_init init;
  17.     //排序
  18.     tbb::parallel_sort(a, a + N);
  19.     //倒序
  20.     tbb::parallel_sort(b, b + N, std::greater<float>( ));   
  21.    
  22.     return 0;
  23. }

注意,和std::sort一样,tbb::parallel_sort的排序结果是不稳定的。

 

原创粉丝点击