具有不同深度的图像的Tbb并行化卷积

时间:2013-07-01 11:40:11

标签: c++ multithreading parallel-processing tbb

我想使用tbb(parallel_for模式)同时卷积大量图像 - 每个处理器的核心convolves单个图像。但是,图片的深度会有所不同:monograyscale(1-channel)stereograyscale(2-channel)monorgb(3-channel)stereorgb(6-channel)等。

事实证明,不同线程(核心)上的工作负载不断变化。如何在此任务中正确使用parallel_for,或者我应该考虑其他并行模式?

1 个答案:

答案 0 :(得分:1)

形式parallel_for(first,last,lambda)的tbb :: parallel_for执行一些负载平衡。你可以先试试。虽然它有一种启发式来猜测一个可以偶尔被愚弄的好粒度。

为了获得最佳负载平衡,可能以额外的每次迭代开销为代价,使用基于范围的tbb :: parallel_for,粒度为1,simple_partitioner。这会强制每次迭代作为单独的任务运行,从而为TBB运行时提供最大的灵活性来重新平衡负载。下面是一个执行100次迭代的示例,每次迭代都有一个随机延迟。

#include <tbb/parallel_for.h>
#include <unistd.h>

int main( int argc, char* argv[] ) {
    tbb::parallel_for(
        tbb::blocked_range<int>(0,100,1),  // Interval [0,100) with grainsize==1
        [&](tbb::blocked_range<int> r) {
            for( int i=r.begin(); i!=r.end(); ++i ) {
                printf("%d\n",i);
                usleep(random()%1000000);
            }
        },
        tbb::simple_partitioner());
}