1. 程式人生 > >Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (16) - L1資料快取/儲存轉發&訪存消歧&儲存體衝突

Intel Sandy Bridge/Ivy Bridge架構/微架構/流水線 (16) - L1資料快取/儲存轉發&訪存消歧&儲存體衝突

Store Forwarding

如果讀存操作緊跟著寫存操作,且要讀取的資料包含在要寫入的資料中,則資料可能可以從寫操作直接轉發給讀操作。這個過程叫做“儲存-讀取轉發”,簡稱為“儲存轉發”。這種技術可以節省讀操作的時延週期數,因為讀操作無需等待寫操作完成後在從儲存器中讀取資料,而是直接從寫操作中獲取資料(注:從寫存緩衝區中把資料轉發給讀操作)。利用儲存轉發機制,程式設計師可以快速的移動複雜的結構體,但是不會損失轉發某些子域的能力。與前端微架構相比,訪存控制單元可以處理的儲存轉發條件具有更少的限制。

做進行儲存轉發操作,必須滿足如下的條件:

  • 寫存操作必須是對該地址的最後一條寫操作,位於讀存操作之前。
  • 寫存操作的資料必須完全包含讀存操作想要讀取的資料
  • 讀存操作訪問的必須是回寫式型別的儲存器區域,且讀存操作與寫存操作都不能是非時效訪問操作。

在下列情形下,不能做儲存轉發操作(注:可參看下面的幾張表):

  • 如果相對於前面的16或32位元組的寫存操作,4或8位元組讀存操作 跨越了8位元組邊界
  • 如果相對於32位元組的寫存操作,任何的跨越16位元組邊界的讀存操作

下面4張表詳細的記述了儲存轉發的行為。給定一個寫存長度,所有的可以轉發的讀存操作被標記為“F”。從32位元組儲存操作的轉發 類似於從兩個半幅16位元組儲存操作的轉發行為。不能轉發的情況標記為“N”。

Memory Disambiguation

一個讀存操作有可能會依賴前面的某個寫存操作。在前面所有的寫存操作的目標地址未明確之前,許多微架構只能阻塞讀存操作。訪存消歧器可以預測哪些讀存操作不依賴前面的寫存指令。當消歧器預測到沒有依賴關係的讀存操作時,即便前面的寫存地址尚未明確,也可以投機式地讓讀存指令執行,從L1快取中讀取資料。這樣可以隱藏讀存時延。最終,預測結果會被校驗。如果真的發生衝突,即實際有依賴,則讀存指令以及以後的指令會被重新執行。如果沒有依賴,“投機讀”成功,獲得性能提升。

以下的讀存操作不會做投機消歧讀。這些讀操作會一直等待直到前面所有的寫存操作地址明確。

  • 跨越16位元組邊界的讀存操作。
  • Intel AVX 32位元組讀操作,但是讀取地址沒有按照32位元組對齊

如果讀存操作地址與寫存操作地址具有相同的低12位元位[0:11],則訪存消歧器會假設這兩個操作具有依賴性。

Bank Conflict

由於16位元組的讀存操作可以跨越三個儲存體,每週期可以進行兩個讀操作,所有可能導致在單週期內同時訪問8個儲存體中的6個。當兩個讀操作同時需要不同組(set)中同一個儲存體時就會發生儲存體衝突(兩個操作地址具有相同的2-4位元位)。當發生衝突時,其中的讀操作在內部會被“回收(recycled)”。

注:load reg128, 0x000 與 load reg128, 0x200具有相同的[2-4]位元位,會產生儲存體衝突。

在許多情況下,兩個讀存操作會訪問同一個快取行中的同一個儲存體,例如當從棧中彈出運算元時,或者按任何順序訪問。在這些情況下,不會發生衝突,讀操作會被同時服務(即同時進行)。