TBB簡介和一個簡單的示例

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,在多核平臺上運行結果更明顯。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章