函数使用Player使用oPM并行参考

Function using reference in parallel using omp

本文关键字:oPM 并行 参考 使用 Player 函数      更新时间:2023-10-16

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

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,但这会大大降低您的性能。