第三课:控制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) |