2012-04-26 49 views
4

我正在學習關於空間局部性的緩存操作。 (我引用至今都原則林和斯奈德,this tutorial並行編程的,當然還有維基百科)。緩存使用,空間局部性和延遲

看看下面的例子,用gcc編譯,在Windows 7 Professional上運行,採用Intel酷睿2雙核CPU( L7500)。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    int *array; 
    int length; 
    int count; 
    int range; 
    int i; 

    // generate an array of a million integers between 0 and 99 
    length = 1000000; 
    range = 100; 
    array = calloc(length, sizeof(int)); 
    srand(time(NULL)); 
    for(i = 0; i < length; i++) 
    { 
     array[i] = rand() % range; 
     // printf("%d\n", array[i]); 
    } 

    // count the number of occurrences of 3 in the array 
    count=0; 
    for(i=0; i<length; i++) 
    { 
     if(array[i]==3) 
     { 
      count++; 
     } 
    } 
    printf("count = %6d\n", count); 

    return 0; 
} 

現在,在常規的後半,整數的整個陣列將要被讀出,所以每個空間局部性的CPU應該將它們加載到所述高速緩存提前。但是,在循環過程中,有多少數組可以/是否應該在緩存中加載到緩存中?一次一個高速緩存行(每個int有64個字節/ 4個字節= 16個整數),它的大塊還是整個數組一舉陷入?根據我的理解,從RAM加載數據到高速緩存(或從非本地存儲器到本地存儲器的每本教科書)所涉及的等待時間比實際運行例程所需的時間要重要得多。真正?

現在說我們將此代碼移動到多處理器/多核機器,並且代碼的計數部分更改爲在4,8,16等並行線程(使用pthreads)中運行,計算陣列的單獨部分,然後在最後加上私人計數。這是否會導致多次單獨的RAM到緩存延遲事件,使得並行版本比串行版本運行慢?

回答

2

是的,內存速度和延遲確實支配了許多算法,並且有必要儘可能高效地使用內存緩存來加速這些算法。

並行運行可以傷害你的表現,但通常不會。搞清楚這需要大量的測試和調整。

例如,將四核心芯片連接到一個RAM組。如果算法需要最大速度的內存讀取並且計算總是比RAM的速度更快,那麼並行運行不會獲得任何收益,並且可能會減慢速度。

但是,如果你有一個雙套接字系統,每個CPU將有自己的RAM和算法將加快。

或者,系統可能會從1個RAM庫升級到4個,並從單個通道切換到四通道RAM配置。那時,RAM速度可能會超過計算速度,四核將會看到運行更多線程的好處。

在我看來,每個核心運行一個線程通常會使您受益,並將利用系統升級。運行單個線程可能會避免少量的同步開銷,但總是會限制將來的程序。

+0

感謝您的幫助! (沒有足夠的代表upvote - 對不起。)關於_But的任何見解,但是在循環過程中的任何時候,有多少數組可以/不應該加載到緩存中?一次一個緩存行(每個int有64個字節/ 4個字節= 16個整數),它的大塊,或者整個數組一次性下降?_這是我真正無法找到的參考。 – 2012-04-26 19:21:46

+0

@RevWaldo:您可能無法找到參考,因爲它幾乎每個芯片都會發生變化。英特爾/ AMD總是試圖改進緩存預取行爲。最好忽略它,並嘗試將內存訪問佔用空間保留在一個緩存大小的塊中。 – 2012-04-26 23:34:27

+0

解釋爲什麼教科書中的傢伙在解釋績效結果時使用「我們認爲的」很多。再次感謝。 – 2012-04-27 04:15:19