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库的程序样子应该是这样地:
- #include <tbb/task_scheduler_init.h>
- #include ...//其它头文件
- int main()
- {
- tbb::task_scheduler_init init;
- ...//代码
- return 0;
- }
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的简单易学,也为了增强一下学习的信心,先放上一个小甜饼:并行排序
- template<typename RandomAccessIterator>
- void parallel_sort(RandomAccessIterator begin,
- RandomAccessIterator end);
- template<typename RandomAccessIterator, typename Compare>
- void parallel_sort(RandomAccessIterator begin,
- RandomAccessIterator end,
- const Compare& comp );
从定义可以看出,它的用法与std::sort完全一样,我们只需把原程序里的std::sort替换成tbb::parallel_sort,就得到了一个多核优化的程序了(嗯~~起码能向别人这么吹了,呵呵)。
例:
- #include <tbb/task_scheduler_init.h>
- #include <tbb/parallel_sort.h>
- #include <math.h>
- int main()
- {
- //准备排序原料
- const int N = 100000;
- float a[N];
- float b[N];
- for( int i = 0; i < N; i++ ) {
- a[i] = sin((double)i);
- b[i] = cos((double)i);
- }
- //TBB初始化
- tbb::task_scheduler_init init;
- //排序
- tbb::parallel_sort(a, a + N);
- //倒序
- tbb::parallel_sort(b, b + N, std::greater<float>( ));
- return 0;
- }
注意,和std::sort一样,tbb::parallel_sort的排序结果是不稳定的。