形式为 parallel_for(first,last,lambda) 的 tbb::parallel_for 做了一些负载平衡。你可以先试试。虽然它有一个启发式方法来猜测一个有时会被愚弄的好粒度。
为了获得最佳负载平衡,可能以额外的每次迭代开销为代价,使用粒度为 1 的基于范围的 tbb::parallel_for 和 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());
}