TBB并行管道似乎按顺序运行?

问题描述 投票:0回答:1

我正在使用一些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。这是正确的行为吗?还是我的环境有问题?

c++ parallel-processing tbb
1个回答
0
投票

实际上,不太可能在第二个过滤器的开头看到重新排序。

parallel_pipeline的工作方式是,同一线程将给定项目尽可能长时间地通过管道(在管道中,第一个之后的所有过滤器都是并行的,因此同一线程将针对一个物品)。一个线程将一个项目移至下一个过滤器的开销比另一个线程窃取下一个项目的任务,处理第一个过滤器然后移至第二个过滤器所需的开销少得多。例如,仍然可以重新排序第一个线程被操作系统抢占,但可能性很小。

[为了更好地观察乱序执行,请将打印语句移至第三个过滤器,并在第二个过滤器中添加一些随机的“工作”,以便其处理项目的时间有所不同。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.