看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《s3748679 (冷羽翼塵)》之銘言: : → s3748679:@@a 因為這邊把迴圈拆了連i++和往回跳的動作都省啦~所以 10/13 20:49 : → s3748679:才會覺得在相同條件下會比較快就是了 10/13 20:49 很合理的猜測 但你得要思考一下迴圈內做的事情 那就是從記憶體內讀取資料,然後存到另一塊記憶體內 除了 i++ 以及判斷迴圈成立條件之外沒有做任何事 所以其實最花時間的是記憶體搬移這件事 根據 Intel 的 Optimization Reference Manual 目前最主流的 Sandy Bridge 架構其 L1 cache latency 至少為 4 cycle 這遠大於 i++ 所需要花的時間 另一方面固定次數的 for 迴圈對 branch prediction 來說準確率非常高 因此迴圈的 branch 形成的額外成本並不高 反觀把迴圈拆開的版本 儘管少了 i++ 和 branch 但它的 code size 卻大幅成長 導致更多次的 instruction cache miss 迴圈內的工作已經是 memory intensive 而你還讓它雪上加霜 XD 再次得到算盤本是好物的結論 -- ※ 發信站 :批踢踢實業坊(ptt.cc) ◆ From: 118.168.56.96
ericinttu:只好來跪算盤了 (誤) 10/13 23:15
s3748679:來整理下: 1.branch prediction => i++ 所需要花的時間少 10/13 23:27
s3748679:2. code size太大 => cache miss(似乎是塞不進快取) 10/13 23:28
s3748679:嘿~剛挖一下wiki順便放上來好了~ 10/13 23:28
s3748679:http://en.wikipedia.org/wiki/CPU_cache 10/13 23:28
s3748679:啊對~ 回樓主~ Thanks~ =ˇ= 10/13 23:30
VictorTom:推跪算盤XD 10/13 23:57
chchwy:推code size也是有locality呀 10/14 01:38
h9602b:推coding+算盤~~ 10/14 07:36
h9602b:code size太大是一種,date size太大且存取不夠連續也是另一 10/14 07:40
h9602b:個cache miss的重大主因,前一陣子剛解過一個類似的問題,由 10/14 07:42
h9602b:物件中的某變數做sort,size二十幾萬,後來把存data的結構重 10/14 07:43
h9602b:寫,sort一樣是quicksort,時間從幾分鐘變成幾秒 10/14 07:44
h9602b:所以再次得證算盤是好物~~ 10/14 07:46
tomap41017:請問算盤本是哪本啊?(我非本科系= =) 10/14 20:01
ericinttu:計算機組織的書, 白底, 封面有算盤. 10/14 20:19
ericinttu:很厚一本. 中英文的封面與頁數都差不多. 10/14 20:20
priv:感覺ericinttu應該也是老人了.. 10/14 21:04
priv:因為第三版之後的國際版就沒算盤了XD 10/14 21:04
priv:而且頁數大幅度刪減,把材料移到光碟上去 10/14 21:05
stosto:白算盤要好好念阿 10/15 01:34
stosto:不過現在pipeline的數目是多少啊? 10/15 01:35
purincess:感覺應該還是有十幾二十個stage XD 10/15 02:01