第五课:blocked_range<>之外的range
前面使用的blocked_range<>无法满足所有情况下split range的要求,下面介绍自定义range的实现方法。 一个Range类模板如下:
class R {
public:
bool empty() const;
bool is_divisible() const;
R(R&r, split); /* 在此完成对R的split,分解为r + *this */
};
|
在tbb中的blocked_range2d实现如下:
template<typename RowValue, typename ColValue = RowValue>
class blocked_range2d {
public:
typedef blocked_range<RowValue> row_range_type;
typedef blocked_range<ColValue> col_range_type;
private:
row_range_type my_rows;
col_range_type my_cols;
public:
blocked_range2d(RowValue row_begin, row_end,
typename row_range_type:size_type row_grainsize,
ColValue col_begin, col_end,
typename col_range_type:size_type col_grainsize);
bool empty() const {
return my_rows.empty() || my_cols.empty();
}
bool is_divisible() const {
return my_rows.is_divisible() || my_cols.is_divisible();
}
blocked_range2d(blocked_range2d& r, split) {
if (my_rows.size() * my_cols.grainsize() <
my_cols.size() * my_rows.grainsize()) {
my_cols.my_begin = col_range_type::do_split(r.my_cols);
} else {
my_rows.my_begin = row_range_type::do_split(r.my_rows);
}
}
}
|
阅读(882) | 评论(0) | 转发(0) |