gpt4 book ai didi

c++ - 使用 omp 并行使用引用的函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:50 26 4
gpt4 key购买 nike

考虑简化的示例。假设我有以下功能:

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。使用一些相对简单的解决方案来解决此问题的最佳方法是什么?

免责声明:我知道很多人会说以这种方式使用引用是不好的,但就我而言,这是完成任务的最简单方法:flag如果发生任何异常。

最佳答案

这会给你一场比赛。在这种特殊情况下,您可能没有问题,因为线程只会在一个方向上更改变量,因此如果两个线程同时写入它,两种方式的最终结果都是相同的。但这仍然很糟糕。

引用没有问题,不调用外部函数时也有同样的问题。在下面的示例中,我不会使用外部函数,但这不会改变要点。

解决方案是使用 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 block 的末尾,即 for 循环,本地拷贝将使用“or”减少,并将其放入线程全局变量 标记

在其他情况下,您可以在 if 语句周围放置一个 #pragma omp critical,但这会显着降低性能。

关于c++ - 使用 omp 并行使用引用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47511835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com