2012-09-14 62 views
4

我有一個數據集,我想在interval_size的區間內使用tbb::parallel_for。我的仿函數消耗的每個時間間隔應該是interval_size,除了最後一個部分時間間隔,當interval_size不能均勻分配我的數據集時,這個間隔可能會更小。靜態分區tbb :: parallel_for

有沒有辦法使用TBB以這種方式進行靜態分區?這個測試會產生幾個區間比interval_size小我的系統上:

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

struct body 
{ 
    void operator()(const tbb::blocked_range<size_t> &r) const 
    { 
    std::cout << "range size: " << r.end() - r.begin() << std::endl; 
    } 
}; 

int main() 
{ 
    size_t num_intervals = 4; 
    size_t interval_size = 3; 

    // consume num_intervals plus a partial interval in total 
    size_t n = num_intervals * interval_size + (interval_size - 1); 
    tbb::parallel_for(tbb::blocked_range<size_t>(0, n, interval_size), 
        body(), 
        tbb::simple_partitioner()); 

    return 0; 
} 

輸出:

$ g++ test_parallel_for.cpp -ltbb 
$ ./a.out 
range size: 3 
range size: 2 
range size: 2 
range size: 3 
range size: 2 
range size: 2 

回答

4

的原因行爲是簡單的分區分區的範圍按以下標準:

ceil(粒度/ 2)< =大塊大小< =粒度大小

tbb::blocked_range(i, j, grainsize)一起使用時,chunksize是您的範圍的大小。

您可以在下查看Tutorial 3.2.5分區程序摘要

沒有簡單的方法可以用TBB獲得固定大小的塊大小(您可以使用OpenMP輕鬆實現這一目標)。這是因爲這違背了TBB的概念。 TBB試圖從你那裏抽取所有這些東西,調度程序確保在運行時儘可能使用最好的線程。

+1

謝謝。 TBB是否提供了保證塊大小不會超過'blocked_range'提供的'grainize'? –

+1

@JaredHoberock如果使用'simple_partitioner',則可以保證上面的公式。 – inf