sax0936
高級會員
積分 6292
發文 304
註冊 2005-9-6
狀態 離線
|
#1 [分享]WINDOWS資料夾下,有個Prefetch資料夾的作用
其實早就有Prefetch了
其實我可以這樣講,如果沒有PreFetch,那我們現在的CPU會跑的慢上很多.
大家一定覺得很奇怪,
如果真是這樣,那請問那為什麼Palomino沒有比缺少Hardware prefetch的TB快上很多?
那各位就有所不知了,其實每顆CPU管你裡面有沒有Hardware Prefetch的功能,
每顆現代的CPU早就在享受Prefetch帶來的好處了,只是,不是用"硬體"做的罷了..
什麼是 Prefetch.
prefetch英翻中,直接的意思也就是"預先提取".其實道理再簡單不過了,也就是說要早在CPU需要那筆資料之前,
就下一筆不是"常態"的指令,
先把它從MainMemory(以後就直接說DRAM好了)提取出來,放在離CPU較近的L2 or L1 Cache中.
那大家一定覺得很怪,幹嘛預先就要?不會到時要喔?這樣有差嗎?
沒有Prefetch,效能差很多
不要忘了,到DRAM抓資料回來Cache至少要30個以上CPU cycles.
也就是如果你現在用這筆資料,不得不去DRAM抓的時候,你要在這裡等個30 Cycle,你才能做下去.
再嚴重點.現在的CPU都是超純量的(SuperScalar,就是多管線的意思啦),
如果今天是一顆4-way(4管)的CPU,正好其他3管的指令,都在等你這管的處理後的資料,(這種叫Dependency),
哇,也就在30個CPU cycle內,沒有一條管線可以跑任何一筆資料,完完全全浪費了這顆CPU的功能.
他的設計原本應該是1個cycle能跑四筆指令的,現在變成1個cycle只能跑1/30個指令.
Prefetch的功用
那很明顯的,如果在之前,就先發了load的指令讓資料能預先留在cache裡頭,到時候要用時,就可以直接拿來用了.
不過,這很自然的會增加一些指令,甚至有時會抓進去一大堆 到時候根本沒有屁用的資料,看了便知.
當然這是可以"改良"的.
Software 和 Hardware prefetch的不同
就我所知,Software based的prefetch是必然要用的.也就是程式在寫好,compile之後,他裡面的程式碼早就考慮到prefetch的問題了.
現在的compiler一定都會提供這類的選項,或甚至直接使用.
Compiler很聰明,他會在程式跑到真正需要用到該筆資料之很多行之前,會插入prefetch的指令.
(當然,這些指令不是當初寫程式的人所能知道的).
想想如果沒有Software Prefetch,這真的會是一場災難.因為x86的程式會compile出一大堆Memory指令.
如果每條指令都按步就班,不偷步.那CPU也真的不用SuperScalar了,
就弄一個80386-1000SX好了.
Hardware Prefetch
當然目的是一樣的,但是作法實在太多種了,簡單到最難,一應具全.
他在L2 Cache旁邊,自己加了一個小buffer.
ok,如果是最簡單的,那他會在Cache miss時,同時把Miss的資料和緊接著幾筆的資料一起抓到Buffer中,
也就是如果第二筆資料就是緊接在第一筆之後的話,那他就可以直接從Buffer中拿,不用還要回DRAM拿了.
當然,天下沒有白吃的事.不是所有的資料都是緊接著的.有時候,他可是有間隔的.
可能是隔4,可能是隔8,看他爽不爽.那你笨笨的隔一個抓豈不儘抓些垃圾,給我滾.
也因此,比較好的Prefetch buffer會有一個"預測"的機構,會把每次資料相差的距離大概記錄一下,再決定下一筆資料
要從那個位址抓過來.這樣當然比較準,但是相對難做很多,甚至Latency變大.
對於Hardware的Prefetch的大概就是這樣.
|
|