C++ 如何在pragmas中处理OpenMP pragmas

C++ 如何在pragmas中处理OpenMP pragmas,c++,c,openmp,C++,C,Openmp,我在一家开发计算机视觉库的公司工作。它部分地包含了许多矩阵运算和更复杂的算法。为了加快速度,我们开始使用OpenMP来并行化我们可能必须在矩阵运算中执行的大量双循环,以及可能调用这些运算,有时调用其中几个运算的更复杂算法 我知道在其他pragma中使用OpenMP pragma不会提供最好的性能。但是,尽管我们的复杂算法比它慢,它仍然使一些基本操作更快 举个例子,这可能是发生的事情: // in resize.c image resize_bilinear(const image& im

我在一家开发计算机视觉库的公司工作。它部分地包含了许多矩阵运算和更复杂的算法。为了加快速度,我们开始使用OpenMP来并行化我们可能必须在矩阵运算中执行的大量双循环,以及可能调用这些运算,有时调用其中几个运算的更复杂算法

我知道在其他pragma中使用OpenMP pragma不会提供最好的性能。但是,尽管我们的复杂算法比它慢,它仍然使一些基本操作更快

举个例子,这可能是发生的事情:

// in resize.c
image resize_bilinear(const image& img, int rows, int cols) {
 image out(rows, cols);
#pragma omp parallel for
 for (int i = 0; i < rows; ++i) {
  for (int j = 0; j < cols; ++j) {
   // bilinear interpolation to get out(i,j)
  }
 }
 return out;
}
我们可能在某个地方:

// in more_complex.c
std::vector<image> resize_all(const std::vector<image> imgs, int rows, int cols) {
 std::vector<image> out(imgs.size());
#pragma omp parallel for
 for (int i = 0; i < imgs.size(); ++i) {
  out[i] = resize_bilinear(imgs[i], rows, cols);
 }
}
是否有可能使上pragma禁用他将遇到的所有下pragma?或者,如果我们使用OpenMP来并行化我们所有的库,我们是否注定要失败


存在OMP_MAX_ACTIVE_LEVELS环境变量。但是有没有一种方法可以在pragma本身中控制它呢?

您可以尝试使用允许启用或禁用嵌套并行性的方法。

您可以简单地设计应用程序,以便只在外部循环中使用“pragma”,所以您应该将其从内部函数中删除。是的,我刚才看到了!我想这就是我想要的。就我所知,你知道有没有一种特殊的情况,我们可以为某些地区设置?像在某些pragma中一样,不允许嵌套并行,但在其他pragma中可以吗?我从未尝试过,但考虑到这是一个函数,您可以使用此函数在需要的地方启用/禁用嵌套并行。您可以在嵌套循环之前将其设置为1,在另一个嵌套循环之前将其设置为0。我强烈建议,除非您确实知道自己在做什么,否则应避免嵌套并行。如果机器在N个LogicalCPU上有N**2个线程,则很容易过度订阅,从而导致性能非常差。还可以看看omp_in_parallel和parallel pragma上的if子句,它允许您只在需要的地方引入并行,哦,不要忘记omp parallel for只是omp parallel的缩写,后面跟着omp for,所以可以有更大的并行区域。