使用tbb并行化视频转换程序

时间:2014-03-02 20:59:14

标签: c++ pipeline tbb

所以,我得到了一个用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。基督。

1 个答案:

答案 0 :(得分:1)

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

基本方案是一个3阶段管道:输入过滤器读取blob,中间过滤器处理它,最后一个将处理后的blob写入文件。输入和输出过滤器应为serial_in_order,中间过滤器可为parallel。看似可以在中间阶段进行拆包和包装(我将从那开始,以最小化连续阶段中的工作量)或在输入和输入中进行。输出阶段(但可能会更慢)。

您还需要确保在并发处理的blob之间不共享数据存储(在您的情况下为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寻求帮助。