TBB:局部和全局的结果是parallel_for

TBB: local and global results in parallel_for

本文关键字:结果是 parallel for 全局 局部 TBB      更新时间:2023-10-16

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

示例,在伪代码中:我正在寻找一个非常长的向量的最大值。我可以在循环中做,像这样:

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中做同样的事情?我不要求一个确切的代码,我只是想知道如何在循环结束时更新全局结果,而不是在每次迭代…

(I am new to TBB)

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