【问题标题】:TBB Parallel Pipeline seems to run in-order?TBB Parallel Pipeline 似乎按顺序运行?
【发布时间】:2020-04-24 00:22:04
【问题描述】:

我正在使用一些 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】:

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

    parallel_pipeline 以这样一种方式工作,即同一个线程将给定项目尽可能长时间地通过管道(在您的管道中,第一个过滤器之后的所有过滤器都是并行的,因此同一个线程将执行所有三个过滤器对于一个项目)。一个线程将一个项目移动到下一个过滤器的开销远小于另一个线程为下一个项目窃取任务、处理第一个过滤器然后也移动到第二个过滤器所需的开销。如果例如,重新排序仍然是可能的第一个线程被操作系统抢占,但不太可能。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多