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

Tbb-parallelized convolution of images with different depths

本文关键字:卷积 图像 并行化 深度 Tbb      更新时间:2023-10-16

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

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

形式为parallel_fo(first,last,lambda)的tbb::parallel__for执行一些负载平衡。你可以先试试。尽管它有一个猜测好粒度的启发式方法,有时会被愚弄。

为了获得最佳负载平衡,可能会以每次迭代额外开销为代价,请使用粒度为1的基于范围的tbb::parallel_fo和simple_partitor。这迫使每个迭代作为一个单独的任务运行,从而为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("%dn",i);
                usleep(random()%1000000);
            }
        },
        tbb::simple_partitioner());
}