我正在使用一些OpenCV代码处理数据处理管道,在实现管道之后,我发现并没有加速,也没有减速。我正在尝试调查为什么会这样。
我想到了以下示例:
int start = 0;
tbb::parallel_pipeline(16,
tbb::make_filter<void, int>(tbb::filter::serial_out_of_order, [&](tbb::flow_control& fc){
if(start < 1000) {
return start++;
}
fc.stop();
return start;
}) &
tbb::make_filter<int, int>(tbb::filter::parallel, [](int num){
std::cout << num << std::endl;
return num + 1;
}) &
tbb::make_filter<int, void>(tbb::filter::parallel, [](int num){
})
);
执行此代码时,将顺序打印1-1000。这是正确的行为吗?还是我的环境有问题?
答案 0 :(得分:2)
实际上,在第二个过滤器的开头不太可能看到重新排序。
parallel_pipeline
的工作方式是,同一线程将给定项目尽可能长时间地通过管道(在管道中,第一个之后的所有过滤器都是并行的,因此同一线程将执行所有一个项目的三个过滤器)。一个线程将一项移至下一个过滤器的开销比另一线程窃取下一个项目的任务,处理第一个过滤器然后移至第二个过滤器所需的开销少得多。例如,仍然可以重新排序第一个线程被操作系统抢占,但不太可能。
为了更好地观察乱序执行,请将打印语句移至第三个过滤器,并在第二个过滤器中添加一些随机的“工作”,以使其处理项目的时间有所不同。 / p>