我試圖測試我有權訪問的計算機的緩存屬性。要做到這一點,我正在嘗試閱讀記憶和時間。我改變工作集大小和跨步訪問模式以獲得不同的測量結果。控制海灣合作委員會優化
代碼看起來像這樣:
clock1 = get_ticks()
for (i = 0; i < 1000000; i++) {
for (j = 0; j < (workingset * stride/sizeof(data_t)); j += stride) {
*array[j];
}
}
clock2 = get_ticks()
現在的問題是,有一個合理的優化級別,GCC將優化出來讀,因爲它沒有副作用。我不能沒有優化級別,否則所有循環變量都會導致讀取到內存。我已經嘗試了一些不同的東西,比如使數組變爲volatile,並且使用內聯函數來將其轉換爲volatile,但gcc對volatile變量的處理很難預測。什麼是適當的方式來做到這一點?
不知道這是多麼可行:編譯成彙編器,沒有優化,你想要的代碼,然後用'asm {}'塊代替C代碼並編譯整個程序。 – pmg 2011-03-16 22:42:01
Ulrich Drepper的「每個程序員應該知道的內存」(http://www.akkadia.org/drepper/cpumemory.pdf)包含一些緩存屬性的基準。 – ninjalj 2011-03-16 23:47:42
舌頭:確保循環計算一個開放的數學問題的解決方案,以便編譯器無法優化它:http://blog.regehr.org/archives/140 – 2011-03-17 00:05:28