# 2016q3 Homework3 (software-pipelining)
contribute by <`petermouse`>
## 開發環境
* OS:Lubuntu 16.04 LTS
* Memory: 8 GB
* CPU:
* Name:
* Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz
* Cache:
* L1d Cache: 32K
* L1i Cache: 32K
* L2 Cache: 256K
* L3 Cache: 3072K
## 資料閱讀
### [Modern Microprocessors](http://www.lighterra.com/papers/modernmicroprocessors/)
* 不同CPU時脈高不等於運算上比較快,因為還牽扯到每個CPU在每個clock下做的動作
* Pipeline要注意到:
* 後面指令可能要馬上使用到前面還沒儲存的運算結果→加入forwarding line趕快將結果告訴前面的
* 運算時可能因為不同的指令,而有不同的運算單元處理
* RISC比CISC來得容易pineline,因為都是很精簡的動作
* Superpipelining:clock speed被最複雜的stage限制→再把stage切得更細,clock speed加快,IPC維持不變,但每秒Clock變多了,處理更多指令。
* Superscalar:因為有不同的運算單元,為了充分利用,乾脆想辦法全都使用到吧!→一次執行多個不同指令(多個pipeline運作)
* 增加fetch/decode單元數量(也就是增加issue width)
* 各取所需:INT與FP以不同pipeline運算
* 每個pipeline所需時間不一致
* 不同pipeline、同個pipeline間的forwarding
* 不會一次多個指令都剛好有適用的pipeline→運算單元通常比issue width多
* VLIW:執行一個"明確的"長指令,一個指令包含很多"明確的"次指令。
* 簡化一開始的decode/dispatch(調度)處理
* 不考慮次指令之間的dependency→變成交由compiler處理
* 部份應用:GPU、DSP等
* Instruction Dependencies & Latencies
* 指令間有先後執行順序
* latency:從指令執行到結果可被其他指令使用的時間。
* 因為latency→stage越多不會越有效益
* memory有更多麻煩:cache hit/miss的latency差很多
* branch prediction
* 先猜再說,猜錯在取消
* 改善方向
* 增加猜對機率
* 降低猜錯成本
* static:complier猜測提示處理器
* runtime:有on-chip branch prediction table以及1~2bit來決定先執行哪個branch
* mispredict→mispredict penalty.,尤其是愈深的pipeline,反映出diminishing returns(報酬遞減)
* out-of-order:避免branch產生的bubble以及instruction的latancy產生浪費的cycle→更改執行順序。
* dynamic instructin scheduling:dispatch logic需要先看好幾個instruction來規劃順序。
* Register Renaming:更改目標的暫存器,使得指令可以平行不衝突
* 耗電,但可以不用重新編譯
* 另一種方法:編譯器來更改執行順序,但也有可能出差錯
* brainiac vs speed-demon debate
* Brainiac:OOO取向
* speed-demon:complier最佳化&結構單純化。
* 各家CPU朝不同取向在發展,也有轉向發展,也可能考量其他問題。
* The Power Wall & The ILP Wall:CPU的發展到了瓶頸
* power wall:clock speed到了極限,可以往上但極度耗熱
* ILP wall:平行因為load latencies, cache misses, branches and dependencies between instructions也有發展極限
* About x86
* 屬於CISC架構,複雜而且慢
* 為了和RISC匹敵→將x86指令decode成類似RISC的小指令
* 稱為μops(micro ops)
* 因為細節(μops)只有在執行時知道,complier難對其最佳化
* Simultaneous multi-threading
* OOO、Superscaler、Complier優化都對指令的平行化影響有限(ILP Wall)
* 一樣是解決bubble等問題,但這次是用不同執行緒填補,讓運算單元充分利用
* 一個physical processor但是多個logical processor
* 需增加硬體成本,以區別、維護不同執行緒資料以及資料狀態
* intel稱為Hyper-Threading
* 來不及整理 待續