TBB:parallel_for的本地和全球结果

时间:2011-11-09 12:16:22

标签: c++ openmp tbb

我对并行循环中的局部值以及更新全局变量有疑问。

示例,在伪代码中:我在很长的向量中搜索最大值。我可以在循环中完成它,就像那样:

int max;
for(i ...) {
    if (max < vector[i]) max = vector[i];
}

我可以轻松地将它与OpenMP并行化:

int max;
#pragma omp parallel
{
    int local_max;
#pragma omp parallel for
    for(i ...) {
        if (local_max < vector[i]) local_max = vector[i];
    }

#pragma omp critical
    {   
        // choose the best solution from all
        if (max < local_max) max = local_max; local_max
    }
}

如何在TBB parallel_for中执行相同的操作?我没有请求确切的代码,我只想知道如何在循环结束时更新全局结果 ,而不是每次迭代...

(我是TBB的新手)

1 个答案:

答案 0 :(得分:2)

您在此示例中执行的操作称为缩减,因此请使用parallel_reduce。它应该比在锁定下更新全局变量更有效。基本思想是local_maxparallel_reduce的正文类的成员变量,其join()方法接收正文的另一个实例并将local_max更新为更大当前值和另一个实例中的值。然后在调用parallel_reduce之后,从原始主体对象中取出local_max值并将其分配给全局变量。