函数使用Player使用oPM并行参考
Function using reference in parallel using omp
考虑简化的示例。说我有以下功能:
int foo(int x, int y, bool &flag) {
if (x == y)
flag = true;
return x + y;
}
然后使用OpenMP并行执行:
bool flag = false;
#pragma omp parallel for
for (int i = 0; i < n; i++) {
z[i] = foo(x[i], y[i], flag);
}
我猜想这里的问题是该函数并联多次调用,并且每个实例都指向相同的flag
。使用一些简单的解决方案解决此问题的最佳方法是什么?
免责声明:i 知道,许多人会说以这种方式使用参考是不好的,但是在我的情况下,这是实现任务的最简单方法:标志如果发生任何例外。
这将为您带来比赛。在这种特殊情况下,您可能没有问题,因为线程只会在一个方向上更改变量,因此,如果在同一时刻上写两个线程,则最终结果将是相同的。但这仍然很糟糕。
参考不是问题,当您不调用外部功能时,您会遇到相同的问题。在下面的示例中,我不会使用外部功能,但不会改变要点。
解决方案是使用openMP减少:
int main() {
int const n = 4;
int x[n];
int y[n];
int z[n];
bool flag = false;
#pragma omp parallel for reduction(|| : flag)
for (int i = 0; i < n; i++) {
if (x[i] == y[i])
flag = true;
z[i] = x[i] + y[i];
}
}
现在每个线程将拥有自己的flag
副本。在parallel
块的末尾,即for
循环,将使用"或"减少本地副本,并将其放入螺纹 - 磁全变变量flag
。
在其他情况下,您可以在该if
语句周围放置#pragma omp critical
,但这会大大降低您的性能。
相关文章:
- C++17中的并行执行策略
- 并行用于C++17中数组索引范围内的循环
- 如何在Elixir中调用递归函数并行
- OpenMP:并行更新数组总是需要减少数组吗
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用OpenMP使这个循环并行
- 遍历并行数组以确定C++中的最大数字
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 并行标准::复制复杂性
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何在 C++17 STL 并行算法中处理调度?
- OpenMP 与有序和关键指令并行
- OpenMP for 循环并行性问题
- 两个连续的 OpenMP 并行区域会相互减慢速度
- C++17:如何在并行 STL 中获取工作项的索引
- 如何使用 OpenMP 并行化最近邻搜索
- 函数使用Player使用oPM并行参考