介绍
这篇教程教你怎样使用Intel的Threading Building Blocks(Intel TBB),它是一个库帮助你利用多核提高性能,你不需要是个线程专家,这个项目可能首先看似使人畏惧,但是通常你只需要知道一些关键点就能利用多核处理器来改善你的代码。例如,通过只阅读这篇文档的3.4节,你就能成功实现多线程程序。随着你的专业知识的增长,你可能想要投入到更加复杂的项目中,这些都覆盖在更高级的章节中。
优点
有许多办法都可以做到并行化,从依赖平台线程原语(例如,pthread)到外来的新语言,TBB的优点是它工作在高阶中,而且不需要外部语言或者编译器,你能使用任何支持ISO C++的编译器。TBB不同于传统线程包如下:
- Intel TBB替你指定合理的并行,代替自己线程化。大多数线程包需要你指定线程。直接对线程编程是冗长的并且导致无效的编程,因为线程是低阶的,需要接近硬件的重构造,直接利用线程编程强迫你把逻辑任务映射到线程中,相反,Intel TBB 运行时库自动把逻辑并行映射到现在中,有效利用处理器资源。
- Intel TBB目标是性能。大多数通用线程包支持许多不同种线程,例如异步事件线程,结果,通用包趋向提够基础的低阶工具,而不是解决方案。替代,Intel TBB关注并行计算密集工作的目的,传递高阶,更简单的解决方案。
- Intel TBB和其他线程包兼容。因为库没有设计解决所有线程问题,它能和其他线程包无缝共处。
- Intel TBB强调可扩展,数据并行编程。把程序分成独立的函数块,把独立的线程分配给每个函数块是一个解决方案,但是这样扩展性不好,因为函数块的数量是固定的。相反,Intel TBB强调数据并行编程,使多个线程工作在数据集中不同部分,数据并行编程扩展性很好,处理器数量变大会把数据集分成更小的片段。利用数据并行编程,当你增加处理器时,程序性能也提高。
- Intel TBB依赖泛型编程。传统的库接口依据指定类型或者基类,而TBB使用泛型编程,泛型编程的本质是利用最少的约束写出最好的算法。C++的STL就是一个泛型编程很好的例子,接口是根据所需类型指定的。
编译
命令行编译debug:
把_debug去掉就是编译release。
初始化和终结TBB库
Intel TBB2.2自动初始化任务调度,参考文档描述怎样使用类task_scheduler_init显示初始化任务调度,显示初始化有以下好处:
- 控制任务调度什么时候构造,什么时候析构。
- 指定任务调度所使用的线程数。
- 指定工作线程的堆栈大小。