2014-03-02 42 views
0

所以,我给了一个程序在C++中,我必须使用TBB并行化(使其更快)。当我查看代码时,我认为使用管道是有道理的。问题是我没有什么经验,我在网上发现的任何东西都让我更加困惑。这里是代码的主要部分:并行视频转换程序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]); 
    } 

它实际上读取视频文件,拆包,适用改造,包装,然后将它写入到输出。这看起来很简单,所以如果你有任何想法或资源可能有用,请分享。

Thanx提前,

D.基督。

回答

1

事实上,您可以使用tbb::parallel_pipeline并行处理多个视频“blob”。

的基本方案是3级流水线:输入滤波器读取斑点,中间滤波器进行处理,并且最后一个经处理的团块写入到文件中。输入和输出过滤器应该是serial_in_order,中间过滤器可以是parallel。看起来可能会在中间阶段(我会以此为开始,尽量减少串行阶段的工作量)或在输出阶段(但可能会更慢)进行拆包和打包。

您还需要确保数据存储(您的案例中的rawpixels)不会在并发处理的斑点之间共享。也许最简单的方法是通过管道传输每个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寻求帮助。

+0

从概念上说,我明白了。问题在于它在教程中使用了TextSlice *类型以便在流水线阶段之间传输数据。它看起来非常复杂 – user3371706

+0

我已经更新了答案,以解释您可能需要做的数据传输。希望有所帮助。 –