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

全部博文(143)

文章存档

2013年(1)

2012年(11)

2011年(55)

2010年(76)

分类:

2010-11-27 10:38:35

第七课: pipeline pattern

tbb中的pipeline模式是通过pipeline和filter两个类来完成,其中pipeline负责控制,各个stage通过实现filter的operator()函数完成自己的工作。 tbb中pipeline的定义如下:

class pipeline {
public:
    void add_filter(filter& filter_);
    void run(size_t max_live_tokens);
    void clear();

private:
    filter *filter_list;
    empty_task *end_counter;
    atomic<internal::Token> input_tokens;
};

class filter {
public:
    filter(bool is_serial_);
    filter(mode filter_mode);
    virtual void * operator() (void *item) = 0;

private:
    filter *next_filter_in_pipeline;
    filter *prev_filter_in_pipeline;
    internal::ordered_buffer *input_buffer;
    const unsigned char my_filter_mode;
    pipeline *my_pipeline;
}


从定义可以看出,通过pipeline::add_filter来将filter组合成pipeline,然后pipeline::run()将启动pipeline。对pipeline中的filter有两种模式,serial和parallel,serial模式下这个stage将只有一个thread,否则会创建多个thread,如果pipeline所有stage都是serial,整个pipeline就是serial,pipeline::run()将直接一次调用每个filter的operator(),完全不用创建新的thread。在parallel模式下,并行程度很大由run(max_live_tokens)参数决定,max_live_tokens决定了一个stage最多有可能几个operator()在并行。另外整个pipeline的throughput也是由处理最慢的那个stage决定的,最慢的stage决定了这个pipeline在每分钟所能处理的item的数目。
另外注意,每个stage的operator()的参数是不同的,是其上一个stage的operator()输出的结果。



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