如何在pragma中处理OpenMP pragma

时间:2017-03-07 08:31:03

标签: c++ c openmp

我在一家开发计算机视觉库的公司工作。它部分包括许多矩阵运算和更复杂的算法。为了使一切变得更快,我们开始使用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);
 }
}

是否有可能使上层编译区禁用他将遇到的所有下层编译指示?或者,如果我们使用OpenMP来并行化我们所有的库,我们是否会注定失败?

OMP_MAX_ACTIVE_LEVELS环境变量。但有没有办法在pragma本身控制它呢?

1 个答案:

答案 0 :(得分:1)

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