所以,我得到了一个用c ++编写的程序,我必须使用TBB对它进行并行化(使其更快)。当我查看代码时,我认为使用管道是有意义的。问题是我没什么经验,而且我在网上找到的任何东西都让我更加困惑。以下是代码的主要部分:
uint64_t cbRaw=uint64_t(w)*h*bits/8;
std::vector<uint64_t> raw(cbRaw/8);
std::vector<uint32_t> pixels(w*h);
while(1){
if(!read_blob(STDIN_FILENO, cbRaw, &raw[0]))
break; // No more images
unpack_blob(w, h, bits, &raw[0], &pixels[0]);
process(levels, w, h, bits, pixels);
//invert(levels, w, h, bits, pixels);
pack_blob(w, h, bits, &pixels[0], &raw[0]);
write_blob(STDOUT_FILENO, cbRaw, &raw[0]);
}
它实际上读取视频文件,解压缩,应用转换,打包然后将其写入输出。这看起来非常简单,所以如果您有任何想法或资源可以提供帮助,请分享。
提前完成,
d。基督。
答案 0 :(得分:1)
实际上,您可以使用tbb::parallel_pipeline
并行处理多个视频“blob”。
基本方案是一个3阶段管道:输入过滤器读取blob,中间过滤器处理它,最后一个将处理后的blob写入文件。输入和输出过滤器应为serial_in_order
,中间过滤器可为parallel
。看似可以在中间阶段进行拆包和包装(我将从那开始,以最小化连续阶段中的工作量)或在输入和输入中进行。输出阶段(但可能会更慢)。
您还需要确保在并发处理的blob之间不共享数据存储(在您的情况下为raw
和pixels
)。也许最简单的方法是通过管道传递每个blob存储。与串行程序不同,不可能将自动变量用于需要在管道阶段之间传递的存储;因此,您需要在输入过滤器中使用new
分配存储,通过引用(或通过指针)通过管道传递它,然后在输出过滤器中完成所有处理后delete
。这对raw
存储肯定是必要的。但是对于pixels
,如果所有需要它的操作(即解包,处理和打包结果)都在中间过滤器的主体内完成,则可以继续使用自动变量。当然,变量的声明也应该移动到那里。
让我勾勒出对序列代码的修改,使其更适合应用parallel_pipeline。请注意,我将raw
更改为动态分配的数组,而不是std::vector
;你显示的代码似乎并没有将它用作矢量。请注意,它只是一个草图,它可能无法正常工作。
uint64_t cbRaw=uint64_t(w)*h*bits/8;
uint64_t * raw; // now a pointer to a dynamically allocated array
while(1){
{ // The input stage
raw = new uint64_t[cbRaw/8];
if(!read_blob(STDIN_FILENO, cbRaw, raw)) {
delete[] raw;
break; // No more images
}
}
{ // The second stage
std::vector<uint32_t> pixels(w*h);
unpack_blob(w, h, bits, raw, &pixels[0]);
process(levels, w, h, bits, pixels);
//invert(levels, w, h, bits, pixels);
pack_blob(w, h, bits, &pixels[0], raw);
}
{ // The output stage
write_blob(STDOUT_FILENO, cbRaw, raw);
delete[] raw;
}
}
TBB文档中的管道上有a tutorial。尝试将代码与示例匹配;它应该很容易做到。您也可以在the TBB forum寻求帮助。