我最近閱讀過有關CPU指令重新排序的效率。但我無法理解CPU如何重新排列其指令。我的意思是編譯時間重新排序是可以想象的,因爲編譯器可以預見即將到來的代碼。但是對於一個接一個地讀取指令的CPU,它如何看到即將到來的指令對其進行重新排序CPU如何重新排序指令
1
A
回答
3
指令按順序解碼,但它們隨後進入「進行中」指令集合。如果他們的依賴性得到滿足,說明可以取得進展。
例如,假設所述指令:從存儲器
- 負載寄存器A。
- 從內存中加載寄存器B.
- 增寄存器A.
- 增量登記B.
這可能是最後的兩個指令都在進步的同時,如果讀寄存器B的存儲首先完成(也許它已經在L1緩存中),則寄存器B的增量將在寄存器A的增量之前發生(當然,在該指令被解碼之後)。
3
指令按程序順序被提取到指令隊列中;從隊列中解碼並移動到保留站。這些保留站有效地執行重新排序:指令被分派執行到執行單元,因爲它們的參數變得可用,並且所有參數變得可用的時間通常不對應於指令隊列/存儲器中的順序。
舉一個例子,使用Tomasulo Algorithm,看到這兩個視頻:
問題(和寄存器重命名): https://youtu.be/I2qMY0XvYHA?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs
調度/重新排序: https://youtu.be/bEB7sZTP8zc?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs
相關問題
- 1. CPU指令重新排序的跟蹤
- 2. ConcurrentHashMap重排序指令?
- 3. 如何關閉MIPS-GCC自動指令重新排序?
- 4. 對雙重問題處理的相關指令進行排序/重新排序
- 5. 排序在angularjs NG重複指令
- 6. 指令中的x86/x64的ASM重新排序 - 與最新的CPU性能優化
- 7. 如何重新排序表
- 8. 如何重新排序NSMutableDictionaries
- 9. CPU指令每秒
- 10. 易失性讀/寫和指令重新排序
- 11. 是JVM允許指令重新排序,周圍的AtomicInteger調用
- 12. 構造函數和指令重新排序
- 13. 的Java指令重新排序/緩存線程
- 14. 標杆使用<ctime>和指令重新排序
- 15. 重新排序的無關指令改變了結果
- 16. 如何手動重新加載指令?
- 17. 如何重新初始化Angular指令?
- 18. 指令中的重新連接指令
- 19. 如何使用jQuery的排序重新排序排序父
- 20. 如何找出CPU是否與ARM v5兼容cpu指令
- 21. UITableViewCell - 如何獲得重新排序控件的指針?
- 22. 如何按指定索引對數組重新排序
- 23. 如何重新指數(數)排序SQLite表
- 24. 重新排序
- 25. 最快的cpu指令
- 26. 如何重新排序搜索結果?
- 27. 如何重新排序列在qplot(R)
- 28. 如何重新排序活動
- 29. 如何重新排序主鍵?
- 30. 如何重新排序SQL查詢?
同樣的方式,你看即將到來的話當你在讀一個句子的時候:通過稍微提前看一下。 – hobbs
它的讀取速度比它能夠執行的快,因此它可以看到即將到來的指令窗口。有關詳細信息,請參閱[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)。 –
我的意思是,我對彙編代碼不太瞭解,但是從我記得的地方來看,每條指令基本上都在內存中,所以如果像上面說的那樣,CPU可以讀取的速度比它能夠執行的要快,那麼它可以跟隨內存位置的指令,並期待。這不是一個事實,這只是我所假設的,我自己也沒有想過。 –