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

全部博文(143)

文章存档

2013年(1)

2012年(11)

2011年(55)

2010年(76)

分类:

2010-11-27 10:35:44

第五课: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);
        }
    }
}


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