(十九)冒險和預測,解決危險就能抓住機會

      前面咱們講到,流水線技術可以顯著提升CPU的吞吐率,只不過咱們須要解決結構冒險、數據冒險、控制冒險三個方面的問題,這些問題和CPU的運行機制密切相關。緩存

1、結構冒險:

      結構冒險問題本質是一個硬件資源搶佔的問題,也就是電路問題。同一個時鐘週期內,同時運行兩條計算機指令的不一樣階段的指令時,若是會剛好用到相同的電路,就產生了電路競爭的問題。下圖是一個典型的內存數據訪問的衝突問題:架構

由圖可見,第一條指令和第四條在同一個時鐘週期內前者執行訪問內存操做,後者執行了取指令操做,因爲內存只有一個地址譯碼器做爲地址輸入,所以沒辦法同時執行指令一和指令是的訪問內存操做。設計

相似這種「資源衝突」問題的解決方案其實只有一種,就是增長資源,咱們能夠將內存分爲兩部分,一部分稱爲「指令內存」,另外一部分稱爲「數據內存」,各自擁有譯碼器。這種將內存分爲兩部分的方式稱爲哈佛架構,可是它並非馮·諾依曼體系的結構的方案,將內存分爲指令內存和數據內存的方式當然可以解決一部分資源衝突的問題,但它使得咱們不可以動態分配內存,喪失了靈活性。現代計算機體系在告訴緩存的設計上借鑑了這種架構,將高速緩存分爲了指令緩存和數據緩存,以下圖:blog

因爲CPU是從高速緩存讀取數據而不是直接讀取內存,所以,這種方式也就解決了數據訪問和指令訪問同時的資源衝突問題。內存

2、數據冒險:三種不一樣的依賴關係

      和上述結構冒險問題不一樣的是,數據冒險的問題在於程序邏輯,當多個指令的執行相互之間有數據上的依賴關係,問題就產生了,主要是三種依賴關係:先寫後讀、先讀後寫、寫後再寫。資源

  • 先寫後讀,程序中對一個變量對先寫入再讀取操做對應着不一樣的指令
  • 先讀後寫,後續的指令對變量進行寫入,須要讀取前置指令賦值的變量的值
  • 寫後再寫,變量的賦值前後順序須要保障,不然最終獲得錯誤的值

3、解決數據冒險問題

因爲在執行指令以前事先知道要訪問的寄存器和內存地址,所以能夠斷定其是否會觸發冒險,如會觸發則經過插入空指令NOP,什麼都不作,至關於讓CPU停頓一個時鐘週期這樣的方式來避免發生冒險。變量

4、總結

結構冒險,主要是因爲並行指令使用系統的硬件電路所引起,經過增長硬件資源的方式可解決;硬件

數據冒險,主要是因爲不一樣指令執行所要操做的數據有交叉,爲了指令執行的準確性,須要保障必定的執行順序,經過插入NOP指令解決。程序

相關文章
相關標籤/搜索