2013-12-23 48 views
1

我編碼了以下玩具基準。緩存命中,缺失和預測 - 對性能的影響

int N = 1024*4096; 
unsigned char *ary = malloc(N); 
ary[0] = 1; 
int stride, i; 
double start, end; 
int sum; 
for(stride = 1; stride < N; ++stride) { 
    start = getCPUTime(); 

    sum = 0; 
    for(i = 0; i < N; i+=stride) { 
     sum += ary[i]; 
    } 

    end = getCPUTime(); 
    printf("stride %d time %f sum %d\n", stride, (end - start)/(N/stride), sum); 
} 

基本上,它在不同的步幅中遍歷一個數組。然後我繪製的結果:

enter image description here

(結果被平滑)

當步幅〜128中,CPU可以適合所有的數據在L1高速緩存進行訪問。考慮到訪問的線性,未來的讀取可能是預測的。

我的問題是,爲什麼閱讀的平均時間在那之後繼續上升?我對stride =〜128的推理也適用於比這更大的值。

謝謝!

+0

您是否認爲對打印語句的緩存有重大影響? –

+0

平均時間的不斷增加是否會受到軟頁面錯誤的約束? –

回答

0

是你使用的代碼?它所做的只是從16 MB讀取數據。我在我的PC上運行它,其中16 MB來自RAM,計算MB /秒,在步幅2時爲993,在步幅999時減少到880.基於測量微秒運行時間,在步幅2時,計算時間爲0.0040, 0.0045在步幅999.

速度降低有各種各樣的原因,例如突發讀取,緩存對齊和不同的內存組。

+0

感謝您的回答!是的,這是我使用的代碼。實際上這是4MByte,而不是16個。令我困惑的是,爲什麼在步幅= 128時降到接近0 _與此後的組合_持續增加... –

+0

對不起,我錯過了,但是我使用的PC仍然是4 MB。我的電腦在128下沒有丟失,但突然從RAM讀取,一些緩存可以是128字節。需要查看用於添加到角色的指示。 –