我正在使用一些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。这是正确的行为吗?还是我的环境有问题?
发布于 2020-04-24 19:28:33
实际上,在第二个过滤器开始时不太可能看到重新排序。
parallel_pipeline的工作方式是同一线程尽可能长时间地将给定项目放入管道中(在管道中,第一个过滤器之后的所有过滤器都是并行的,因此同一线程将为一个项目执行所有三个过滤器)。一个线程将一个项目移动到下一个筛选器的开销比另一个线程窃取下一个项目的任务、处理第一个筛选器,然后再移动到第二个筛选器所需的开销小得多。如果例如第一线程被OS抢占,则重新排序仍然是可能的,但不太可能。
为了更好地观察无序执行,将print语句移到第三个筛选器,并在第二个筛选器中添加一些随机量的“工作”,以便它处理项目的时间有所不同。
https://stackoverflow.com/questions/61399069
复制相似问题