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提供的算法可以实现对并行概念的抽象。
相关文章推荐
- Web Service入门简介(一个简单的WebService示例)
- (转)Web Service入门简介(一个简单的WebService示例)
- Web Service入门简介(一个简单的WebService示例)
- 一个简单登陆示例的MVC和MVP实现
- 一个简单的makefile示例及其注释(转载)
- 一个简单的Servlet示例
- Libgdx Developer's Guide(Libgdx开发者手册)-9(一个简单的游戏2--扩展示例游戏)
- Dubbo教程(三)----一个简单的Dubbo示例
- Skinned Mesh原理解析和一个最简单的实现示例
- java播放声音类和一个简单示例
- 一个非常简单的 ASP.NET MVC 示例:长轮询(又叫:反向 AJAX,英文名:Comet)实现
- 循序渐进学java基础笔记(3)——一个简单的示例
- 一个简单的JNI示例
- 一个简单的alv的示例
- Ajax得知(两)—— 一个简单的Ajax示例
- 一个简单的ajax上传进度显示示例
- 一个简单的登录页面示例
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 04 数据访问层
- 直接插入排序 一个简单示例
- Linux平台:一个简单的TCP6 server的示例代码(socket)