我將首先給出一些關於我遇到的問題的背景知識,以便您瞭解我正在嘗試做什麼。我一直在幫助開發一個特定的軟件工具,並發現使用OpenMP來並行化該軟件中的一些最大循環可以大大受益。實際上,我們實際上並行化了這些循環,只用兩個內核,循環執行速度提高了30%,這是一個不錯的改進。另一方面,我們注意到函數中的一個奇怪的現象,它使用遞歸調用遍歷樹結構。在OpenMP開啓的情況下,程序實際上減慢了,此功能的執行時間翻了一番。我們認爲樹形結構可能不夠平衡,並且在這個函數中註釋掉OpenMP pragmas。這似乎對執行時間沒有影響。目前我們正在使用帶有-fopenmp標誌的GCC-compiler 4.4.6來支持OpenMP。這裏是目前存在的問題:OpenMP會減慢程序而不是加快速度:gcc中的錯誤?
如果我們沒有在代碼中使用任何OMP編譯指示,一切運行良好。但是,如果我們只是下面的程序的主要功能,在從35秒雙打樹travelsal函數的執行時間開始增加爲75秒:
//beginning of main function
...
#pragma omp parallel
{
#pragma omp single
{}
}
//main function continues
...
有誰有關於爲什麼發生這種情況的任何線索?我不明白爲什麼程序使用OpenMP編譯指示很慢。如果我們取消所有的omp編譯指示,樹遍歷函數的執行時間會再次下降到35秒。我猜想這是某種編譯器錯誤,因爲我現在沒有其他解釋。
感謝您的回答,但這仍不能解釋執行時間的增加。問題給出的代碼幾乎立即完成,但是會減慢程序的其餘部分,即使空的「編譯指示omp single」塊不應該以任何方式影響它。我開始懷疑,如果使用OpenMP實際上禁用某些編譯器優化,並因此在程序中的任何地方使用OpenMP **,都會在程序中的任何地方減慢代碼**的執行速度。 – Kuzin 2011-05-09 16:54:47
根據編譯器的不同,可能會在OpenMP區域內禁用某些優化。但是,它不應該影響區域外的代碼。也就是說,我們已經看到了像內存分配器這樣的事情在OpenMP區域之後有更高的開銷,並且降低了速度。就你而言,如果代碼如你所示,那麼由於OpenMP的設置,你會看到一些額外的開銷。它不應該像你已經指出的那樣增加運行時間。你應該看看生成的代碼(-S),看看它與OpenMP不同。 – ejd 2011-05-09 18:50:34