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

    技术2026-04-13  1

    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];    forint 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的排序结果是不稳定的。

     

    最新回复(0)