1. 程式人生 > >Intel Core & Enhanced Core微架構(13)

Intel Core & Enhanced Core微架構(13)

Store forwarding

如果一個讀存操作緊跟著寫存操作且這兩條指令操作同一個記憶體地址,Intel Core微架構可以直接將寫存操作的資料轉發給讀存操作指令。這個過程被稱為儲存到讀取轉發機制,簡稱為儲存轉發,可以節省讀存操作的週期數(即延遲),因為讀操作直接從寫操作獲得資料而不用等待寫操作完成再從儲存器中獲取資料。

要想利用儲存轉發機制,必須要滿足以下條件:

  • 寫存操作必須是最後一條到目的地址儲存指令。

注: 第二條MOV指令才會被轉發。

MOV [5000H], 1234H ; no store-forwarding

MOV [5000H], 5678H ; store-forwarding

MOV AX, [5000H] ; AX = 5678H

  • 儲存的資料寬度必須要大於等於讀取的資料寬度。

MOV [5000H], 12345678H ; store-forwarding

MOV AX, [5000H] ; AX = 5678H

  • 讀存操作不能跨越快取行邊界。
  • 讀存操作不能跨越8位元組邊界。16位元組的讀存操作是例外(即讀取16位元組必須要跨越8位元組邊界)。
  • 讀操作地址必須與寫操作的地址對齊,除非滿足如下的例外條件:
    •  64位對齊的寫存操作可以轉發它的任一32位半運算元(halves)。
    • 128位對齊的寫存操作可以轉發它的任一32位四分之一運算元(quarters)。
    • 128位對齊的寫存操作可以轉發它的任一64位半運算元(halves)。

對於複雜的結構體,軟體可以利用最後一條規則的例外情況適當的移動其儲存地址,從而不失去結構體中某些域的轉發能力。

在Enhanced Intel Core微架構中,允許做儲存轉發的對齊限制被放寬了,在某些讀存地址未對齊的情況下也允許做轉發了。下圖示出了額外了6種在Enhanced Core微架構中允許轉發的情況(但是在Core微架構中不允許轉發) 。紅色框表示不允許轉發,黃色框(6個)表示僅在Enhanced Intel Core微架構中允許轉發,綠色框表示在Intel Core與Enhanced Intel Core微架構中都允許轉發

Memory disambiguation

某個讀存操作可能會依賴前面的某個寫存操作(即可能操作同一個儲存器地址,但是不確定,或許是因為寫存操作的地址尚未計算出結果)。在這種情況下,許多微架構實現只能阻塞讀存操作,直到讀存操作前面所有的寫存操作地址都可獲知。

訪存消歧機制可以推測哪個讀存操作不依賴前面的任何寫存操作。當消歧器預測到這樣的讀存操作時,讀操作可以從一級快取中獲取資料。(TODO: 如果一級快取未命中,會投機式地讀記憶體麼? 我覺得不會。)

最終,消歧器的預測結果會比校驗。如果發生衝突(即預測失敗,的確依賴前面某個寫存操作),讀存操作以及隨後的指令都會被重新執行。