我正在開發一些計算機視覺庫的公司工作。它部分包含了許多具有更復雜算法的矩陣運算。爲了使一切都變得更快,我們開始使用OpenMP來並行化我們可能必須在矩陣運算中執行的大量雙循環,以及更復雜的算法,這些算法可能會調用這些循環,有時甚至可能會調用其中的幾個。如何處理編譯指令中的OpenMP pragmas
我知道它不會給在其他編譯指示中使用OpenMP編譯指示的最佳性能。但儘管我們的複雜算法比它慢,但它仍然可以使一些基本操作更快。
舉個例子,這可能是發生的事情:
// 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',因此您應該將其從內部函數中刪除。 – Jepessen