【问题标题】:TBB: local and global results in parallel_forTBB:parallel_for 中的局部和全局结果
【发布时间】:2011-12-25 06:43:18
【问题描述】:

我有一个关于并行循环中的局部值和更新全局变量的问题。

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

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

【问题讨论】:

    标签: c++ openmp tbb


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这正是我需要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多