TBB简介
TBB(Thread Building Blocks)是Intel发布的一个库,全称为Threading Building Blocks。如果你感觉很陌生,很正常,因为我也感觉很陌生,初次接触是在CGAL的示例中看到的,所以就了解下,TBB 曾获得过 17 届 Jolt Productivity Awards,看样子还是蛮厉害的。但是作为用户,我更关注的还是TBB的效率如何(因为是高性能计算,所以比较关注性能)以及是否容易入门并有效的提高自己算法的计算速度。
在多核的计算机平台上开发或优化并行化的程序,能否更合理的利用系统资源是至关重要的,如线程的管理,缓存的使用等是否处于最佳状态。而TBB很好的解决了上述问题(重点还是在于使用者):
- TBB提供C++模板库,用过只需要关注任务本身,而不必关注线程
- 抽象层只提供了很少的接口,但性能依旧强大
- 不受平台与编译器的制约,Linux或windows,Gcc或vs都可以
- 接口层次明确,可以用最简单的,也可以用相对底层的
TBB库包含的内容
TBB共包含了6个模块:Algorithms、Containers、Memory Allocation、Synchronization、Timing、Task Scheduling。其结构图为(盗取网上的,不要太介意):
TBB函数的使用
关于TBB的资料太少了,着实找不出几个,结合使用过程,留个记录也便于后续学习研究。
tbb::parallel_for
对for
的并行化处理,对使用方式有些要求,使用方式为:
parallel_for(first, last, step, f)
表示一个循环的并行操作,相当于标准C/C++代码:
for(int i = first; i < last; i = i + step)
{
f(i);
}
在使用该函数时,需要注意以下几点:
- 索引类型必须为整形
- 步长为正
- 循环不能形成回环
对于该函数,最大的目的就是并行化for
循环,所以,在以目的为导向的实施过程中,会自动的忽略一些不常用的功能。例子:
#include <iostream>
#include <tbb.h>
void f(int i)
{
std::cout << i << std::endl;
}
int main()
{
tbb::parallel_for(0, 100, 1, f);
//for(int i = 0; i < 100; i++) std::cout << i << std::endl;
system("pause");
return 0;
}
看完上面的例子,应该会有一点体会了吧,在某DN
上也看过很多代码,但是太繁琐,需要理解,不如上述的直观。从我的视角看,该函数的执行需要实现将循环体写到一个函数中才可以,上述只是一个最简单的cout
演示,若要修改数据,只能声明一个全局变量,该应用尚不能满足应用标准,后期会追加示例。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。