2010-11-06 25 views
1

有人指出,由於乒乓效應,訪問位於同一緩存行中的數據元素的性能很差。 但是,我寫的代碼沒有和valgrind --tool = cachegrind測試不顯示此行爲。希望對此有所瞭解?爲什麼多線程訪問同一緩存行中的數據的緩存未命中率較低?

以下附件是函數,每個並行線程執行:

void test_cache(void* arg)  
    {  
    long id = (long) arg; 
    uint32_t idx = (uint32_t) id; 
    uint32_t ctr = 0; 
    uint32_t total_sum = 0; 
    for(; ctr < 500000; ++ctr) 
    { 
     total_sum += shared[idx]; 
     AO_fetch_and_add(&shared[idx], idx);  
    } 
    printf("%d %d,\n",id, total_sum); 
} 

回答

0

如果你在「雙核」上運行,你正在打共享緩存。您需要單獨的物理CPU來查看乒乓效應。在問題中包含您的硬件規格。

+0

謝謝尼古拉。我的印象是他們有單獨的L2緩存。感謝您指出。我在雙核和Xeon處理器上嘗試過。 – Sandeep 2010-11-06 18:35:19

2

讀取都OK(一旦緩存被裝滿),寫道:都沒有,因爲這取決於架構,將導致所有其他處理器使該緩存行無效並從內存中獲取行。 (執行緩存行監聽的系統可以避免這種懲罰)。

由於需要每個緩存的負載(共享緩存更好),因此NUMA(從遠程處理器獲取)的情況是最糟糕的,所以初始緩存行負載也會造成損失。

+0

謝謝Theatrus看看。原來我在共享緩存模式下工作,所以我不必擔心。 – Sandeep 2010-11-06 18:37:54

相關問題