2012-11-19 65 views
2

我發現英特爾的線程構建模塊庫有點混亂。舉例來說,我想用TBB並行執行以下計算:並行我的代碼的TBB教程/文檔?

int CountNegatives(std::vector<Trigraph> input) 
{ 
    int count = 0; 
    for(int i = 0; i< input.size(); i++) 
    { 
     if(input[i].VisibleFrom(viewPoint)) 
     { 
      count++; 
     } 
    } 
    return count; 
} 

我明白,你必須使用一個operator()帶班做,在TBB;真的嗎?我希望閱讀關於TBB的一些「初學者教程」,以幫助我弄清楚這一點,但似乎沒有任何初學者教程。

你能幫我把TBB應用到這個計算中嗎?

+0

讓我們瞭解您嘗試和你在哪裏卡住 – sehe

+0

另外:在矢量位進行計數一些是位擺弄黑客,真的。沒有用循環做的事情。 'std :: vector '在大多數情況下都是反模式。使用'std :: bitset',如果你可以 – sehe

+0

我用bools爲例,實際上我試圖執行View Frustum剔除檢查,但對於很多事情我也可以使用多線程功能。我只需要一些使用parallel_for的基本方向:( – none

回答

5

TBB有一個help reference doc,這對開始非常有用。使用the doc代替parallel_for,將您的示例轉換爲使用parallel_for非常簡單。以下是一些示例代碼。這不是100%,但你可以明白。上面的鏈接也包含一些更有趣的功能的例子。

#include <tbb/parallel_for.h> 
#include <tbb/atomic.h> 
#include <iostream> 
#include <vector> 

/** 
* To be used with tbb::parallel_for, this increments count 
* if the value at the supplied index is zero. 
*/ 
class ZeroCounter 
{ 
public: 
    ZeroCounter(std::vector<int> * vec, tbb::atomic<int> * count) : 
     vec(vec), 
     count(count) 
    { } 

    void operator()(int index) const 
    { 
     if((*vec)[index] == 0) 
      ++(*count); 
    } 

    std::vector<int> * vec; 
    tbb::atomic<int> * count; 
}; 

int main() 
{ 
    // Create a vector and fill it with sample values 
    std::vector<int> a; 
    a.push_back(0); 
    a.push_back(3); 
    a.push_back(0); 

    // Counter to track the number of zeroes 
    tbb::atomic<int> count; 
    count = 0; 

    // Create our function object and execute the parallel_for 
    ZeroCounter counter(&a, &count); 
    tbb::parallel_for(size_t(0), a.size(), counter); 

    std::cout << count << std::endl; 
} 
+2

我同意這個文檔很有用,但它也非常糟糕,因爲大部分英特爾文檔都是。 – Cartesius00