2013-07-01 22 views
0

我想使用tbb(parallel_for模式)同時卷積大量圖像 - 每個處理器的核心convolves單個圖像。但是,圖像的深度變化:要麼monograyscale(1-channel),或stereograyscale(2-channel),或monorgb(3-channel),或stereorgb(6-channel)不同深度圖像的Tbb並行化卷積

事實證明,在不同的線程(內核)的工作量不斷變化。如何在這個任務中正確使用parallel_for,或者我應該考慮其他並行模式?

回答

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()); 
}