c++ - 待定:parallel_for 中的局部和全局结果

标签 c++ openmp tbb

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

例如,在伪代码中:我在一个很长的 vector 中搜索最大值。我可以像这样循环执行:

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 新手)

最佳答案

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

关于c++ - 待定:parallel_for 中的局部和全局结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8064900/

相关文章:

c++ - 结构中指针数组的析构函数

c++ - OpenGL 没有按预期绘制

c++ - 减少 OpenMP 中的数组

c++ - 令人尴尬的并行代码的低性能

c++ - 使 TBB 管道过滤器超时

c++ - 不在 Qmake 项目中构建 OBJ-C 代码

c - 使用 OpenMP : can't break on a hit 对巨大数组的线性搜索循环进行微优化

c++ - 如何让英特尔 TBB 库在至强融核上可用

c++ - 使用 Intel TBB 用随机数填充数组

c++ - 将 C++ 集成到 C 基础架构中