TBB:局部和全局的结果是parallel_for
TBB: local and global results in parallel_for
我有一个关于并行循环中的局部值和更新全局变量的问题。
示例,在伪代码中:我正在寻找一个非常长的向量的最大值。我可以在循环中做,像这样:
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_max
是parallel_reduce
的body类的成员变量,它的join()
方法接收到该body的另一个实例,并将local_max
更新为当前值和另一个实例中的值中较大的一个。然后在调用parallel_reduce之后,从原始主体对象中取出local_max
值并将其赋值给全局变量。
相关文章:
- 为什么这个程序的结果是3 "born"?和 4 死
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- C++初始化的结果是什么?
- 我的输出结果是 0 英寸C++.可能是什么问题
- 在C++中使用 fread() 来解释这个结果是什么?
- 为什么双算的结果是错误的?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 在运行libtorch的模型时获得的结果是不正确的,该模型经过训练并从Pytorch出口
- 是迭代器增量结果是新的迭代器
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- 非常量表达式的左值到右值转换的结果是常数吗?
- 将Execl命令的结果(是目录列表)输送到父进程
- 如果我将未签名的int添加到负int且算术结果是正面的,会发生什么
- decltype( (A{}.int_member) 的正确结果是什么)
- 当我们在int上进行操作时,结果是暂时存储在int中的结果
- 大端序中的以下代码的结果是什么
- 并发::when_all的结果是 FIFO 吗?
- 递归宏点差的结果是什么
- static_casting constexpr void* 的结果是常量表达式吗?
- 将双精度转换为 int 的结果是错误的