2009年7月22日 星期三

只要大cache, 不用 out-of-order ?

最近聽聞一種對於微處理器的論調, 就如標題所言:
只要大cache, 就不用 out-of-order

聽起來很有道理, 因為如果cache很大, 表示Memory Read幾乎都是cache hit, 那麼就不太會有等待運算元的指令卡住, 所以也就不需要複雜的out-of-order技術去填補這些等待時間所造成的bubble.

但真的是這樣嗎?

1. 首先, "cache 很大所以operand幾乎都是cache hit"這句話真的是對的嗎?
如果今天我們暫存到memory的variable就只被讀回來用一次, 那這筆data進到cache就可能毫無意義, 因為第一次必須從DRAM讀取. 如果程式的特性對同一個位址的重複使用率不高, 那麼再大的data cache會不會發揮不了太大的作用?

2. 另一個觀點是, 如果cache加得很大就可以看成cache大部分時間都可以代替DRAM作為資料來源, 那是否意味著DRAM的速度根本不重要了? 那麼從SDRAM 到DDR, DDR2, 到最新的DDR3技術, 這些發展對電腦系統不就沒多大意義? 北橋晶片的performance也不重要了?

好, 關於第二點, 或許我們應該注意到, DRAM和cache保存的除了資料以外還有程式. 剛剛我只關心資料的部分, 那程式呢? 假如程式的迴圈不多, 重複執行的機會也不大, 那麼同樣會造成instruction cache的效率不高. 此時DRAM的速度就顯得相當重要了. 也就是說, 也許Fetch code不能單靠instruction cache加大就能滿足大部份的程式?

所以, 如果標題的說法是成立的, 我們或許可以這樣解釋: 在data cache 夠大的情況下, 提升DRAM的速度對instruction fetch仍具有相當的幫助, 因為instruction cache比較有可能效率較差, 即使它的size很大. 但data cache只要size夠大, 它的hit rate在絕大部分情況下都會很高, 因此對於提供CPU運算元大多不成問題, 所以就無須out-of-order. 因為out-of-order所要填補的bubble, 多半都是data read造成的, 與instruction fetch 的速度無直接關係.

但是, 對於第一點的質疑該怎麼解釋呢? 或許也可以這樣解釋:
如果某筆data重複使用率不高, 那又何必暫存到memory呢? 應該存在內部暫存器, 提供下一次運算直接使用. 所以既然程式選擇將資料暫存到memory, 應該是這筆資料需要存在一段時間, 被重複讀取的機會就應該蠻大的.

"資料需要存在一段時間"意味的是它的重複使用率較高嗎? 或者也可能代表這筆資料要很久以後才會再使用, 但是最終只讀取一兩次而已?

另外, 存在DRAM中的資料來源也可能不是CPU, 而是其他周邊存進去的, 比如網路封包. 這些資料也是非常有可能只被讀取一次而已, 這樣再大的cache好像也幫不了忙了?

分析至此, 難道第一點的質疑無法推翻嗎? 如果是這樣, 那標題的論述就是有問題的.

但是我們不能忘記的一點是, 會進入cache的資料, 除了真正要被讀取的那筆以外, 其餘跟他在同一條cache line上的資料也會一並被讀取, 而這些資料之後被使用的機會很高. 也就是說, 這些資料就算只被讀取一次, 也可以受惠於cache. 就像是一人得道, 雞犬升天.

所以呢, 假如一條cache line有4筆data, 如果4筆都會被使用, 就算都只被使用一次, 也可能只有第一筆須老老實實等DRAM, 其餘三筆都直接從cache或line fill buffer得到. 也就是說, 基本上還有75%的hit rate. 若是資料的重複使用率再高一點, 則hit rate 又可以從75%往上再提升. 但這種想法似乎又太簡化也太理想了! 因為並不是跟著昇天的data就一定會被使用, 扣除這個負面因素, data cache 的hit rate還能有多高? 市面上所說的cache hit rate 99% 又是用怎樣的計算方式? 老實說我不相信這種數據, 我認為cache不是萬能的, 因為它的size再大也使終遠小於DRAM, 怎麼可能在99%的時間裡取代DRAM? 99% 這個數字我們可以簡單的做個比喻: 當一部份的data從DRAM被搬到cache後, 這些data每筆都會被使用99次, 然後再把另一部份data從DRAM搬到cache, 然後再各使用99次... 有可能嗎?

說了半天, 結論呢? 筆者認為data cache不是萬能的, out-of-order對CPU的性能仍會有很大的幫助.
下一篇我們再來深入探討cache要如何提昇性能, 重點再哪裡?






沒有留言: