2013-10-11 64 views
0

其實我有兩個問題,第一個問題是,考慮緩存,下列哪個代碼更快?C和OpenMP中的嵌套循環優化

int a[10000][10000]; 
for(int i = 0; i < 10000; i++){ 
    for(int j = 0; j < 10000; j++){ 
     a[i][j]++; 
    } 
} 

int a[10000][10000]; 
for(int i = 0; i < 10000; i++){ 
    for(int j = 0; j < 10000; j++){ 
     a[j][i]++; 
    } 
} 

我猜第一個會快很多,因爲有高速緩存未命中少了很多。而我的問題是,如果您使用的是OpenMP,您將使用哪種技術來優化這種嵌套循環?我的策略是將外部循環分成4個塊,並將它們分配到4個內核中,有沒有更好的方法來實現它?

謝謝! Bob

+0

您可以在您的平臺上進行測試。但我認爲,第一快。另外,問題:數組元素必須是int嗎?也許,足夠短或字符?通過減少元素大小,您將減少內存流量。 – maxihatop

回答

2

正如maxihatop指出的那樣,第一個表現更好,因爲它具有更好的緩存局部性。

在這種情況下,將外部循環分成塊是一個很好的策略,循環內任務的複雜性是恆定的。

您可能想看看#pragma omp for schedule(static)。這將在線程間平均分配迭代。所以你的代碼應該是這樣的:

#pragma omp for schedule(static) 
for (i = 0; i < 10000; i++) { 
    for(j = 0; j < 10000; j++){ 
     a[i][j]++; 
    } 

勞倫斯利弗莫爾國家實驗室提供了一個夢幻般的OpenMP教程。你可以在那裏找到更多的信息。 https://computing.llnl.gov/tutorials/openMP/