3714 views
# [現代處理器設計](http://hackfoldr.org/cpu):原理和關鍵特徵 * ==[直播錄影(上)](https://www.youtube.com/watch?v=9hNl8fWnHLI)== * ==[直播錄影(下)](https://www.youtube.com/watch?v=UHOvgmZNjXI)== [線上提問和討論](https://gitter.im/embedded2015/guts-general) ## 導讀 * [Modern Microprocessors (A 90-Minute Guide!)](http://www.lighterra.com/papers/modernmicroprocessors/) 重點提示和解說 * video: [How A CPU Works | A Basic Guide On Processor Stages & Functionality](https://www.youtube.com/watch?v=BREokpg5AIw) * video: [多核心處理器有前途嗎?](https://www.youtube.com/watch?v=yixQwNj7G0w) * [How shit works: the CPU](https://www.slideshare.net/holograph/how-shit-works-the-cpu) * [Why are we still using CPUs instead of GPUs?](https://superuser.com/questions/308771/why-are-we-still-using-cpus-instead-of-gpus) * [計算機組織結構的背景知識](https://hackmd.io/s/rkloHgHcx) #### More Than Just Megahertz 以一份簡潔的分數測試報告來說明時脈不代表效能,真正的效率取決於「在一個 clock cycle 中能做多少事情」。 #### Pipelining & Instruction-Level Parallelism ![](https://i.imgur.com/K3937kr.png) 將 CPU 處理資料的部份分為數個 stage,藉由這種設計可以讓處理的效率更好,因為每個 stage 在任意時間都有在工作。 ![](https://i.imgur.com/UOiN7u7.png) 而各個 stage 間是利用 latch 來傳遞資料給下一個 stage。 ![](https://i.imgur.com/3NZP5tp.png) 除此之外,因為資料的相依性,所以會從 Execute 或 Writeback 之後拉一條線到 Execute 之前,這樣可以減少不必要的等待。 ![](https://i.imgur.com/jk7xir5.png) 再來就是,Execute 階段中其實是由好幾組邏輯運算單元組成。 ![](https://i.imgur.com/96AFVpk.png) #### Multiple Issue – Superscalar 如同上一部份所說,Execute 中有好幾組邏輯運算單元,一條指令中不一定都會用到全部的運算單元,所以我們可以多讀取指令,依照所需分配到不同路徑。 ![](https://i.imgur.com/95XkjlU.png) 利用上面 pipeline 的圖案呈現出來就像這樣 ![](https://i.imgur.com/TxuChIk.png) 概念呈現影片: * [Pipelining & Superscalar (+ Hazard)](https://www.youtube.com/watch?v=JkwDt0tj1fs) * [Introduction to VLIW](https://www.youtube.com/watch?v=b8UBpmPBbns) #### Explicit Parallelism – VLIW VLIW 也就是 **Very Long Instruction Word**。表示一條指令中可以執行多種操作。 ![](https://i.imgur.com/wrZQ7wl.png) 好處是不用檢查資料相依性。壞處是遇到 cache miss 的話,處理器就要在那邊空等。 #### Instruction Dependencies & Latencies 既然 pipeline 可以讓 CPU 使用地更有效率,那我們只要把 stage 跟的更細,效能就會變得更好?從文章中得到的答案是否定的。 在文中的例子,Line 2 必須等待 Line 1 運算的結果,如果 stage 很多,就表示所需要等待的時間可能會更長。 ```clike a = b * c; d = a + 1; ``` 而當一個指令從 Execute 階段到運算的資料能夠被其他指令使用,其中所經過的時間就叫 Instruction Latency。 #### Branches & Branch Prediction 當遇到 branch instruction 時,CPU 不知道到底要抓下一個指令,還是跳躍後的那一個指令,所以 CPU 只能去預測。 預測的方法分為兩種,第一種是靜態的預測,也就交給 compiler 來做個 mark。第二種則是由 CPU 來根據過往的紀錄來進行預測。 文中也以 Pentium Pro/II/III 舉例,再怎麼聰明的 predictor 也只有 90% 的正確率,而預測失敗時會損失 30% 的效能。換句話說,Pentium Pro/II/III 有三分之一的時間根本沒做到什麼事,只在那邊說「糟糕~ 錯了」。 為了避免 branch instruction,所以有些平台會提供 conditional move instruction。 #### Instruction Scheduling, Register Renaming & OOO 這一個區段主要的概念就是重新排序指令避免各種 hazard 跟 latency。 根據重新排序的方式可以分為靜態與動態。 * 靜態:讓 compiler 來重新排序。 * 動態:在 runtime 時,由 CPU 來往後看幾個指令,進行排序。又稱為 Out-of-Order (OOO),優點是有些指令在 runtime 時才能夠更準確的去排,但缺點是 OOO 所需要的功耗較高。 #### The Power Wall & The ILP Wall * The Power Wall 當增加 20% 的 clock speed,功耗就增加更多,如 50%。 為了提升 clock speed 而必須要提供更多的電力以及改善散熱能力,並不那麼簡單,所以在這邊就遇到了一個瓶頸,稱之為 The Power Wall。 * The ILP Wall 因為程式中的 load latency、cache miss、branch prediction 等問題,讓程式沒辦法有效得平行化,導致所謂的 The ILP Wall。 #### What About x86? 在現今的 x86 架構中,會把原先的 x86 指令轉換成類似 RISC 的指令才進行處理。那些類 RISC 的指令又稱為 micro ops。 ![](https://i.imgur.com/d68hr7W.png) #### Threads – SMT, Hyper-Threading & Multi-Core * SMT (Simultaneous Multi-Threading) 在傳統的狀況下,當有 thread 空閒時,會切換至其他 thread,但如此一來,資源就無法更有效的被利用。 ![](https://i.imgur.com/6xZz6PX.png) 而 SMT 簡單來說就是在 CPU 中同時執行兩個 thread。等於把 thread level parallelism 轉換成 instruction level parallelism。 ![](https://i.imgur.com/etGQBLK.png) * Multi-Core 將多個核心封裝至一個 chip 中。 #### More Cores or Wider Cores? SMT 的核心通常會比較大一點,在相同大小的情況下,可以放入較多的普通核心。 那哪一種會比較好?端看程式的用途。 * 普通核心:適合比較活躍但受限於 memory latency 的應用程式,如資料庫系統、3D 圖形渲染等。因為 SMT 核心會花較多的時間在等待記憶體上。 * SMT 核心:對於大部分的應用程式都適用,因為單執行緒的效能會比較重要。 #### Memory & The Memory Wall 為了從記憶體當中載入資料,會花費許多時間,導致效能受到限制,這種情況就叫 The Memory Wall。 所以在現今的設計中都會使用 cache 來進行快取。 #### Caches & The Memory Hierarchy cache 是一個緊鄰處理器,速度快但容量小的記憶體。 因為容量小,一定不可能把需要的資料都快取起來,所以採用階層式的概念來快取資料。 如 L1 cache、L2 cache、L3 cache,速度由快到慢,大小由小到大。 另外,根據不同的設計,可以分為 direct-mapped cache、N-way set associative cache。可以參考 [淺談memory cache « EngineC's Blog](http://opass.logdown.com/posts/249025-discussion-on-memory-cache)。 ## 延伸閱讀 * [Scalar Performance Optimization](https://www.rsmas.miami.edu/users/miskandarani/Talks/CCS/scalopt.pdf) * [Introduction to High Performance Scientific Computing](http://pages.tacc.utexas.edu/~eijkhout/Articles/EijkhoutIntroToHPC.pdf)