2012-09-14 36 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