Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TBB并行管道似乎运行正常?_C++_Parallel Processing_Tbb - Fatal编程技术网

C++ TBB并行管道似乎运行正常?

C++ TBB并行管道似乎运行正常?,c++,parallel-processing,tbb,C++,Parallel Processing,Tbb,我正在使用一些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) {

我正在使用一些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){
    })
);
int start=0;
tbb::平行_管道(16,
tbb::make_filter(tbb::filter::串行_out_of_order,[&](tbb::flow_control&fc){
如果(开始<1000){
返回开始++;
}
fc.stop();
返回启动;
}) &
tbb::make_filter(tbb::filter::parallel,[](int num){

std::cout在实践中,在第二个过滤器开始时不太可能看到重新排序

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


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

在实践中,在第二个筛选器的开头不太可能看到重新排序

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

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