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