我試圖通過並行化矩陣乘法來提高相當複雜的迭代算法的性能,矩陣乘法在每次迭代時被調用。該算法需要500次迭代和大約10秒。但在並行化矩陣乘法之後,它會減慢到13秒。然而,當我單獨測試相同維度的矩陣乘法時,速度有所增加。最後(我說的是100×100矩陣)使用openmp時出現奇怪的減速
,我關掉任何並行化算法內每個迭代添加下面的一段代碼,這也絕對沒有什麼想必不應該長時間:
int j;
#pragma omp parallel for private(j)
for (int i = 0; i < 10; i++)
j = i;
再次,與沒有這段代碼的相同算法相比,有30%的減速。因此,在主算法內部使用openmp調用任何並行操作500次會降低速度。這種行爲看起來很奇怪,任何人都有什麼線索是什麼問題?
主要算法由桌面應用程序調用,由VS2010,Win32 Release編譯。 我上英特爾酷睿(並行創建4個線程),64位Windows 7
在這裏工作是一個程序的結構:調用平行片 :
int internal_method(..)
{
...//no openmp here
// the following code does nothing, has nothing to do with the rest of the program and shouldn't take long,
// but somehow adding of this code caused a 3 sec slowdown of the Huge_algorithm()
double sum;
#pragma omp parallel for private(sum)
for (int i = 0; i < 10; i++)
sum = i*i*i/(1.0 + i*i*i*i);
...//no openmp here
}
int Huge_algorithm(..)
{
...//no openmp here
for (int i = 0; i < 500; i++)
{
.....// no openmp
internal_method(..);
......//no openmp
}
...//no openmp here
}
所以,最後一點是代碼500次(當省略算法的其餘部分時)的代碼時間不到0.01秒,但是當您在一個巨大的算法中調用500次時,它會導致整個算法延遲3秒。 而我不明白的是小的平行部分如何影響算法的其餘部分?
只是爲了確定,你如何衡量執行時間?我在這裏看到很多OpenMP和MT相關的問題,在這些問題中,人們在並行程序中測量CPU時間而不是掛鐘時間。其他的事情是:進入和退出並行區域相對昂貴(即使現代化的OMP運行時池)。 – 2012-07-13 10:15:03
我正在使用掛鐘時間,桌面應用程序實際測量時間。關於進入和退出平行區域是這樣的,但我有500個進入和退出以及3秒的放緩 - 這不加起來。 – Sergei 2012-07-13 10:27:59
@ phresnel是對的。 – 2012-07-13 10:48:22