2011-12-03 56 views
0

當在試圖加快我的並行代碼涉及許多二級嵌套循環驚奇溶解嵌套循環

我創建一個整數數組並在它們的順序環路的存儲索引,從而在兩個水平嵌套減緩循環變成了一層應該減少開銷的大循環。

k = 0; 
for (int i=0;i<n;++i) 
{ 
for (int j=0;j<n;++j) 
{ 
index[k][0] = i; 
index[k][1] = j; 
} 
} 

例如:

#pragma omp for 
for (int i=0;i<n;++i) 
{ 
for (int j=0;j<n;++j) 
{ 
a[i][j] = 2.0*i+3.0; 
} 
} 

轉向

#pragma omp for 
for (int k=0;k<n;++k) 
{ 
i = index[k][0]; 
j = index[k][1]; 
a[i][j] = 2.0*i+3.0; 
} 

讓我吃驚的代碼放緩,而不是加快,我不知道爲什麼?

+0

爲什麼第一段代碼從不修改'k'? –

回答

1

循環並不昂貴。它在循環中做什麼是昂貴的。你創建了一個運行i * j次的新循環,所以你最終執行內部代碼的次數是相同的。所以你沒有保存任何內容,只是內部循環的開銷很小。

您的新代碼現在爲每次迭代訪問內存。內存很慢。慢得多的循環,你已經擺脫了開銷。

這就是爲什麼你的新版本比舊版本慢。