C++ tbb并行_流水线中的粒度调整
管道的任务如下:C++ tbb并行_流水线中的粒度调整,c++,multithreading,pipeline,tbb,C++,Multithreading,Pipeline,Tbb,管道的任务如下: 按顺序读取大量(10-15k)的~100-200 Mb压缩文件 并行解压缩每个文件 并行反序列化每个解压缩文件 处理结果反序列化对象,并基于所有对象(平均值、中值、分组等)获取一些值 当我得到解压缩的文件内存缓冲区时,序列化的块会一个接一个地移动,所以我希望以相同的方式将它们传递给下一个过滤器,或者,至少,通过将序列化的块打包成若干组,然后传递来调整这个过程。然而(据我所知),tbb_管道使我将指针传递给所有序列化块的缓冲区,因为每个过滤器必须获取指针并返回指针 据我所知,使用
嵌套并行_管道的一般示例
parallel_pipeline( 2/*only two files at once*/,
make_filter<void,std::string>(
filter::serial,
[&](flow_control& fc)-> std::string {
if( !files.empty() ) {
std::string filename = files.front();
files.pop();
return filename;
} else {
fc.stop();
return "stop";
}
}
) &
make_filter<std::string,void>(
filter::parallel,
[](std::string s) {
// a nested pipeline
parallel_pipeline( 1024/*only two files at once*/,
make_filter<void,char>(
filter::serial,
[&s](flow_control& fc)-> char {
if( !s.empty() ) {
char c = s.back();
s.pop_back();
return c;
} else {
fc.stop();
return 0;
}
}
) &
make_filter<char,void>(
filter::parallel,
[](char c) {
putc(c, stdout);
}
)
);
}
)
);
parallel_pipeline(2/*一次仅两个文件*/,
制造过滤器(
过滤器::串行,
[&](流量控制&fc)->标准::字符串{
如果(!files.empty()){
std::string filename=files.front();
pop()文件;
返回文件名;
}否则{
fc.stop();
返回“停止”;
}
}
) &
制造过滤器(
过滤器::并行,
[](标准::字符串s){
//嵌套管道
并行_管道(1024/*一次仅两个文件*/,
制造过滤器(
过滤器::串行,
[&s](流量控制&fc)->字符{
如果(!s.empty()){
char c=s.back();
s、 向后弹出();
返回c;
}否则{
fc.stop();
返回0;
}
}
) &
制造过滤器(
过滤器::并行,
[](字符c){
putc(c,stdout);
}
)
);
}
)
);
1。在我提到的标题tbb_parallel_pipeline中,有问题的文本如此短别名命中实际的Previous版本名=)无论如何,感谢您的关注2。combinable解决了这个任务,很抱歉在文档中没有注意到它。就我所见,合并进程只消耗一个线程。有没有办法与之平行?(在我的例子中,合并是关于合并映射的映射,所以遍历args和填充结果映射)3。嵌套管道非常好,tbb文档确实错过了此类细节4。“您可以安全地将一个并行算法嵌入到另一个并行算法中,以便更改某些阶段的粒度”-这是否也与并行*有关?(safety=对于管道任务平衡器或类似的东西来说是最优和可管理的)@iamiggor,是的,任何并行算法都可以嵌套到另一个中。。甚至递归地。所有高级算法都基于由公共TBB任务调度器管理的任务。它提供了可组合性。据我所知,组合进程只消耗一个线程。有没有办法与之平行?(在我的例子中,合并是关于合并映射的映射,所以遍历args和填充结果映射)看看parallel\u re