2012-09-30 41 views
0

我有一個函數如下:測量高速緩存的大小用C

int doSomething(long numLoop,long arraySize){ 
    int * buffer; 
    buffer = (int*) malloc (arraySize * sizeof(int)); 
    long k; 
int i; 

    for (i=0;i<arraySize;i++)   
    buffer[i]=2;//write to make sure memory is allocated 
    //start reading from cache 
    for(k=0;k<numLoop;k++){ 
     int i; 
     int temp 
     for (i=0;i<arraySize;i++)   
     temp = buffer[i]; 
    } 
} 

它所要做的就是聲明數組,並從開始到結束閱讀。目的是看看緩存的效果。 我期望看到的是:當我調用doSomething(10000,1000)時,arraySize很小,因此它全部存儲在緩存中。之後,我調用doSomething(100,100000),arraySize大於緩存的大小。因此,第二次函數調用應比第一次調用花費更長的時間。後一個函數調用涉及一些內存訪問,因爲整個數組不能存儲在緩存中。 但是,第2次手術似乎與第1次手術大致相同。那麼這裏有什麼問題?我試圖用-O0進行編譯,但它不能解決問題。 謝謝。

更新1:這些都是隨機訪問的代碼,它似乎工作,與大陣的時間訪問〜15秒,而小陣是〜3秒

int doSomething(long numLoop,int a, long arraySize){ 
    int * buffer; 
    buffer = (int*) malloc (arraySize * sizeof(int)); 
    long k; 
    int i; 

    for (i=0;i<arraySize;i++)   
     buffer[i]=2;//write to make sure memory is allocated 
    //start reading from cache 
    for(k=0;k<numLoop;k++){ 
     int temp; 
      for (i=0;i<arraySize;i++){ 
       long randnum = rand();//max is 32767 
       randnum = (randnum <<16) | rand(); 
       if (randnum < 0) randnum = -randnum; 
       randnum%=arraySize; 
       temp = buffer[randnum]; 
      } 
    } 
} 
+0

這個問題是非常相似的http://stackoverflow.com/q/12548651/841108 –

+0

考慮到你的啓動你的緩衝區一個for()循環,實際上數組越大,啓動緩衝區所用的時間就越長。我認爲你是完全誤導人的。 –

回答

1

您正在訪問的順序排列,

for (i=0;i<arraySize;i++)   
    temp = buffer[i]; 

所以你正在訪問的部分將始終在緩存中,因爲該模式是微不足道的預測。要查看緩存效果,您必須以較難預測的順序訪問數組,例如通過生成(僞)隨機索引,以便在數組的後部和後部之間跳轉。

+0

嗨,我已經編輯了一下這個功能。寫操作向上移動。請再次檢查,謝謝! – boh

+0

不改變任何東西,你仍然依次訪問數組。 –

+0

請檢查update1。有效!謝謝。 – boh

0

爲了衡量跨多次調用的效果,您必須使用相同的緩衝區(期望第一次通過您加載緩存,並在下次使用時)。在你的情況下,你爲每個呼叫分配一個新的緩衝區。 (此外,你永遠不會釋放你的分配。)

+0

請再次檢查代碼,寫入操作被移動並且不會重複。結果似乎保持不變。 – boh

+0

請閱讀我的回覆:)我沒有解決您的寫入操作,而是您沒有使用從一個呼叫到另一個呼叫的相同緩衝區。 – mah

+0

嗯,我明白你現在的意思,但不知道如何修復代碼。我怎樣才能確保我使用相同的緩存? – boh

1

除了其他答案:您的代碼順序訪問內存。我們假設緩存行是32個字節。這意味着你可能得到每8次訪問緩存未命中。所以,選擇一個隨機索引,你應該使它至少有32個字節遠離以前的值

+0

謝謝,但我認爲1/8錯過率足夠好吧? Anw,update1將解決這個問題,因爲訪問是完全隨機的。 – boh

+0

什麼?確定緩存的大小?或者確定命中率?每當下一次讀取都會導致讀取錯誤時,您需要找到一個點。 – Serge

相關問題