TBB組成
TBB裏的內容大致可以分爲以下幾類:
- 通用並行算法
這是TBB裏最主要的一大部分,比如示例裏的parallel_for就是這部分的一個算法
TBB提供了parallel_for,parallel_while,parallel_reduce等算法,應用於不同的並行算法場景
- 併發容器
這是對常見容器的線程安全版本的實現,同時考慮到performance的要求,提供了細粒度的鎖機制,TBB2.0裏提供的容器包括hash map,vector,queue。
- 任務調度器
提供了task機制的封裝
- 同步原語
提供了原子操作、mutex、lock等同步原語的封裝
- 內存分配
提供了對cache機制更友好的支持
TBB示例
#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,在多核平臺上運行結果更明顯。