您的位置:首页 > 其它

TBB组成简介和一个简单的示例

2012-03-16 10:22 309 查看

一.TBB组成

TBB里的内容大致可以分为以下几类:

- 通用并行算法

o 这是TBB里最主要的一大部分,比如示例里的parallel_for就是这部分的一个算法

o TBB提供了parallel_for,parallel_while,parallel_reduce等算法,应用于不同的并行算法场景

- 并发容器

o 这是对常见容器的线程安全版本的实现,同时考虑到performance的要求,提供了细粒度的锁机制,TBB2.0里提供的容器包括hash map,vector,queue。

- 任务调度器

o 提供了task机制的封装

- 同步原语

o 提供了原子操作、mutex、lock等同步原语的封装

- 内存分配

o 提供了对cache机制更友好的支持



它们之间的关系如下图:






二.TBB示例

在Vs2008里新建一个项目,输入如下代码,编译运行。


#include "stdafx.h"


#include "tbb/task_scheduler_init.h"


#include "tbb/blocked_range.h"


#include "tbb/parallel_for.h"




// 链接tbb_debug.lib


#pragma comment(lib, "tbb_debug.lib")




using namespace tbb;




// 对每个Item执行该操作


void Foo(float value)


{


printf("%.2f ", value);


}




class ApplyFoo


{


float * const my_a;


public:


void operator () (const blocked_range<size_t> & r) const


{


float * a = my_a;


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


Foo(a[i]);


}





ApplyFoo(float a[]) : my_a(a) {}


};




int _tmain(int argc, _TCHAR* argv[])


{


// 创建task scheduler


// task_scheduler_init支持一个参数,以指定使用的线程数


task_scheduler_init init;


float a[100];


for (int i = 0; i < 100; i ++)


a[i] = (float)i;


// TBB会把数组分成若干的block


// 对block调用ApplyFoo这个functor


parallel_for(blocked_range<size_t>(0, 100), ApplyFoo(a));


return 0;


}



该示例创建一个大小为100的数组,利用TBB提供的parallel_for算法对该数组应用并行算法,对每个Item应用Foo函数。在运行时我们会看到有多个线程同时执行Foo,在多核平台上运行结果更明显。



通过这个例子我们可以发现用TBB可以很好地方便并行程序的编写,通过TBB提供的算法可以实现对并行概念的抽象。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: