2016-08-21 68 views
1

我最近閱讀過有關CPU指令重新排序的效率。但我無法理解CPU如何重新排列其指令。我的意思是編譯時間重新排序是可以想象的,因爲編譯器可以預見即將到來的代碼。但是對於一個接一個地讀取指令的CPU,它如何看到即將到來的指令對其進行重新排序CPU如何重新排序指令

+2

同樣的方式,你看即將到來的話當你在讀一個句子的時候:通過稍微提前看一下。 – hobbs

+1

它的讀取速度比它能夠執行的快,因此它可以看到即將到來的指令窗口。有關詳細信息,請參閱[x86標記wiki](http://stackoverflow.com/tags/x86/info)中的某些鏈接,如Agner Fog的微型pdf,以及[David Kanter撰寫的英特爾Haswell設計](http ://www.realworldtech.com/haswell-cpu/)。當然,如果你只是用「亂序執行」來搜索,你會發現[你應該閱讀的維基百科文章](https://en.wikipedia.org/wiki/Out-of-order_execution)。 –

+0

我的意思是,我對彙編代碼不太瞭解,但是從我記得的地方來看,每條指令基本上都在內存中,所以如果像上面說的那樣,CPU可以讀取的速度比它能夠執行的要快,那麼它可以跟隨內存位置的指令,並期待。這不是一個事實,這只是我所假設的,我自己也沒有想過。 –

回答

3

指令按順序解碼,但它們隨後進入「進行中」指令集合。如果他們的依賴性得到滿足,說明可以取得進展。

例如,假設所述指令:從存儲器

  1. 負載寄存器A。
  2. 從內存中加載寄存器B.
  3. 增寄存器A.
  4. 增量登記B.

這可能是最後的兩個指令都在進步的同時,如果讀寄存器B的存儲首先完成(也許它已經在L1緩存中),則寄存器B的增量將在寄存器A的增量之前發生(當然,在該指令被解碼之後)。

3

指令按程序順序被提取到指令隊列中;從隊列中解碼並移動到保留站。這些保留站有效地執行重新排序:指令被分派執行到執行單元,因爲它們的參數變得可用,並且所有參數變得可用的時間通常不對應於指令隊列/存儲器中的順序。

舉一個例子,使用Tomasulo Algorithm,看到這兩個視頻:

問題(和寄存器重命名): https://youtu.be/I2qMY0XvYHA?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs

調度/重新排序: https://youtu.be/bEB7sZTP8zc?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs