Chinaunix首页 | 论坛 | 博客
  • 博客访问: 470087
  • 博文数量: 143
  • 博客积分: 6159
  • 博客等级: 准将
  • 技术积分: 1667
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-25 23:08
文章分类

全部博文(143)

文章存档

2013年(1)

2012年(11)

2011年(55)

2010年(76)

分类:

2010-11-27 10:25:02

第三课:控制parallel_for的chunking

前面的例子中都是采用TBB中的自动chunking,通常情况下缺省的chunking效率还是不错,不过一些特殊情况下自定义chunking可以完成很大的性能提升。

chunking有partitioner和grainsize共同决定,partitioner决定如何分片,grainsize决定最小粒度多大。当粒度过小时,threading的overhead将十分明显,一个有用的确定grainsize窍门就是保证运行grainsize次operator()至少要100,000个clock,比如一次operator()要1000个clock,那么grainsize至少要100,另外一般情况下保证所使用的grainsize的数量级正确即可,细调效果并不明显。

使用SimplePartitioner的例子如下:

parallel_for(blocked_range<size_t>(0, n), ApplyFoo(a),

             SimplePartitioner());


TBB中提供了三种Partitioner: simple_partitioner, auto_partitioner (default), affinity_partitioner, affinity适用于memory access bandwidth较小,需要牺牲一定parallel来保证affinity的情况

auto_partitioner的定义如下:

class auto_partitioner {
    size_t num_chunks;
    
private:
    class partition_type : public internal::partition_type_base {
    public:
        partition_type(const auto_partitioner&ap):
            num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
        partition_type(partition_type &pt, split) {
            num_chunks = pt.num_chunks /= 2;
        }
    };
};


阅读(916) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~